Compare commits

...

2146 Commits

Author SHA1 Message Date
Sebastián Ramírez
f0dd1046a6 🔖 Release version 0.123.9 2025-12-04 23:23:21 +01:00
github-actions[bot]
188d631011 📝 Update release notes
[skip ci]
2025-12-04 22:22:25 +00:00
Sebastián Ramírez
0b5fa563cd 🐛 Fix OAuth2 scopes in OpenAPI in extra corner cases, parent dependency with scopes, sub-dependency security scheme without scopes (#14459) 2025-12-04 23:22:01 +01:00
Sebastián Ramírez
eb1d50479b 🔖 Release version 0.123.8 2025-12-04 14:01:00 +01:00
github-actions[bot]
e248a4d22b 📝 Update release notes
[skip ci]
2025-12-04 12:59:45 +00:00
Sebastián Ramírez
0ec4bafca2 🐛 Fix OpenAPI security scheme OAuth2 scopes declaration, deduplicate security schemes with different scopes (#14455) 2025-12-04 13:59:24 +01:00
Sebastián Ramírez
603df6e36f 🔖 Release version 0.123.7 2025-12-04 09:27:38 +01:00
github-actions[bot]
6c565482cf 📝 Update release notes
[skip ci]
2025-12-04 08:18:55 +00:00
chaen
861598b4e3 🐛 Fix evaluating stringified annotations in Python 3.10 (#11355)
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
Co-authored-by: svlandeg <svlandeg@github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-12-04 09:18:32 +01:00
Sebastián Ramírez
811fa89875 🔖 Release version 0.123.6 2025-12-04 08:33:11 +01:00
github-actions[bot]
6c6b9d7a2b 📝 Update release notes
[skip ci]
2025-12-04 07:29:53 +00:00
Sebastián Ramírez
bba4d4c95e 🐛 Fix support for functools wraps and partial combined, for async and regular functions and classes in path operations and dependencies (#14448)
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
2025-12-04 08:29:28 +01:00
Sebastián Ramírez
c57ac7bdf3 🔖 Release version 0.123.5 2025-12-02 22:06:25 +01:00
github-actions[bot]
3c440c762a 📝 Update release notes
[skip ci]
2025-12-02 20:58:53 +00:00
Lie Ryan
9824486616 Allow using dependables with functools.partial() (#9753)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-12-02 20:58:30 +00:00
github-actions[bot]
aee8e78078 📝 Update release notes
[skip ci]
2025-12-02 17:33:22 +00:00
Nils-Hero Lindemann
f4a17b7568 🌐 Sync German docs (#14367)
* Sync with #14217

* Sync with #14359

* Sync with #13786

* Sync with #14070

* Sync with #14120

* Sync with #14211

* Sync with #14405

* "to deploy" -> "deployen"

The LLM used that translation a lot ithis convinced me that "deployen" it is the better word. "bereitstellen" (or "ausliefern") is still used for "to serve".

---------

Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
2025-12-02 18:32:56 +01:00
github-actions[bot]
4ade6d62e2 📝 Update release notes
[skip ci]
2025-12-02 17:23:36 +00:00
[object Object]
1c1e584abd Add support for wrapped functions (e.g. @functools.wraps()) used with forward references (#5077)
Co-authored-by: Yurii Karabas <1998uriyyo@gmail.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-12-02 18:23:14 +01:00
github-actions[bot]
930b27e5fa 📝 Update release notes
[skip ci]
2025-12-02 17:00:02 +00:00
Victorien
80d69ae0bb 🐛 Fix optional sequence handling with new union syntax from Python 3.10 (#14430)
Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-12-02 16:59:38 +00:00
github-actions[bot]
cff2236dac 📝 Update release notes
[skip ci]
2025-12-02 16:49:12 +00:00
Sebastián Ramírez
a79ae3d66f 🔥 Remove dangling extra condiitonal no longer needed (#14435) 2025-12-02 16:48:46 +00:00
github-actions[bot]
f636513390 📝 Update release notes
[skip ci]
2025-12-02 13:43:52 +00:00
Sebastián Ramírez
247ef32e79 ♻️ Refactor internals, update is_coroutine check to reuse internal supported variants (unwrap, check class) (#14434) 2025-12-02 13:43:31 +00:00
github-actions[bot]
13a98c9988 📝 Update release notes
[skip ci]
2025-12-02 13:34:45 +00:00
Matthew Martin
73c411e1b9 Handle wrapped dependencies (#9555)
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-12-02 14:34:19 +01:00
Sebastián Ramírez
4976568fc7 🔖 Release version 0.123.4 2025-12-02 11:47:05 +01:00
github-actions[bot]
fb30cc2f50 📝 Update release notes
[skip ci]
2025-12-02 09:22:35 +00:00
Vincent Grafé
f95a174288 🐛 Fix OpenAPI schema support for computed fields when using separate_input_output_schemas=False (#13207)
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
Co-authored-by: svlandeg <svlandeg@github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: svlandeg <sofie.vanlandeghem@gmail.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-12-02 09:22:08 +00:00
github-actions[bot]
5126e099bd 📝 Update release notes
[skip ci]
2025-12-02 09:11:52 +00:00
Motov Yurii
dcf0299195 📝 Fix docstring of servers parameter (#14405)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-12-02 09:11:29 +00:00
Sebastián Ramírez
c516c9904b 🔖 Release version 0.123.3 2025-12-02 08:42:22 +01:00
github-actions[bot]
b49c05ec22 📝 Update release notes
[skip ci]
2025-12-02 07:24:31 +00:00
Motov Yurii
015b4fae9c 🐛 Fix Query\Header\Cookie parameter model alias (#14360)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-12-02 07:24:09 +00:00
github-actions[bot]
eead41bf4c 📝 Update release notes
[skip ci]
2025-12-02 07:10:50 +00:00
Motov Yurii
0f613d9051 🐛 Fix optional sequence handling in serialize sequence value with Pydantic V2 (#14297)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-12-02 08:10:27 +01:00
Sebastián Ramírez
3c54a8f07b 🔖 Release version 0.123.2 2025-12-02 06:31:27 +01:00
github-actions[bot]
e1a2933739 📝 Update release notes
[skip ci]
2025-12-02 05:09:48 +00:00
zadevhub
00b97526e7 📝 Add tip on how to install pip in case of No module named pip error in virtual-environments.md (#14211) 2025-12-02 06:09:25 +01:00
github-actions[bot]
2ca7709c24 📝 Update release notes
[skip ci]
2025-12-02 05:07:29 +00:00
Flavius
bb05007f55 📝 Update Primary Key notes for the SQL databases tutorial to avoid confusion (#14120) 2025-12-02 06:06:56 +01:00
github-actions[bot]
0f7ce0b78a 📝 Update release notes
[skip ci]
2025-12-02 05:04:09 +00:00
SaisakthiM
cdafd64c15 📝 Clarify estimation note in documentation (#14070) 2025-12-02 06:03:46 +01:00
github-actions[bot]
c6c7b72096 📝 Update release notes
[skip ci]
2025-12-02 05:01:37 +00:00
Alex Colby
cb3792d39e 🐛 Fix unformatted {type_} in FastAPIError (#14416)
Co-authored-by: Alex Colby <alex.colby@intellisense.io>
2025-12-02 06:01:11 +01:00
github-actions[bot]
10eed3806a 📝 Update release notes
[skip ci]
2025-12-02 04:57:45 +00:00
Motov Yurii
de5bec637c 🐛 Fix parsing extra non-body parameter list (#14356)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-12-02 05:57:19 +01:00
github-actions[bot]
2330e2de75 📝 Update release notes
[skip ci]
2025-12-02 04:49:52 +00:00
Motov Yurii
6cf40df24d 🐛 Fix parsing extra Form parameter list (#14303)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-12-02 05:49:32 +01:00
github-actions[bot]
740ec2787b 📝 Update release notes
[skip ci]
2025-12-02 04:40:16 +00:00
ad hoc
d68c066246 🐛 Fix support for form values with empty strings interpreted as missing (None if that's the default), for compatibility with HTML forms (#13537)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-12-02 05:39:55 +01:00
Sebastián Ramírez
c3373205d0 🔖 Release version 0.123.1 2025-12-02 05:30:18 +01:00
github-actions[bot]
3b4b5ab8c8 📝 Update release notes
[skip ci]
2025-12-02 04:04:37 +00:00
Sofie Van Landeghem
8f99a2b734 🐛 Avoid accessing non-existing "$ref" key for Pydantic v2 compat remapping (#14361)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-12-02 05:04:13 +01:00
github-actions[bot]
74b4c3c9a1 📝 Update release notes
[skip ci]
2025-12-02 04:03:00 +00:00
Hemanth U
bf322d0e94 🐛 Fix Windows UnicodeEncodeError in CLI test (#14295)
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-12-02 04:02:38 +00:00
github-actions[bot]
327bad18aa 📝 Update release notes
[skip ci]
2025-12-02 03:32:40 +00:00
Kent Huang
20f40b29c0 🐛 Fix TypeError when encoding a decimal with a NaN or Infinity value (#12935)
Signed-off-by: Kent Huang <kent@infuseai.io>
2025-12-02 04:31:59 +01:00
github-actions[bot]
ee490906d8 📝 Update release notes
[skip ci]
2025-12-01 20:07:18 +00:00
Sebastián Ramírez
6e82df816d 🔧 Update sponsors: add Greptile (#14429) 2025-12-01 21:06:57 +01:00
github-actions[bot]
e752224bce 📝 Update release notes
[skip ci]
2025-12-01 13:17:51 +00:00
Sebastián Ramírez
0dee714026 👥 Update FastAPI GitHub topic repositories (#14426)
Co-authored-by: github-actions <github-actions@github.com>
2025-12-01 14:17:29 +01:00
github-actions[bot]
938f471079 📝 Update release notes
[skip ci]
2025-12-01 06:33:00 +00:00
Motov Yurii
6400d8a623 ⬆ Bump markdown-include-variants from 0.0.6 to 0.0.7 (#14423) 2025-12-01 07:32:32 +01:00
github-actions[bot]
f8e46d98a0 📝 Update release notes
[skip ci]
2025-12-01 06:31:20 +00:00
Sebastián Ramírez
8a7ad3d255 👥 Update FastAPI People - Sponsors (#14422)
Co-authored-by: github-actions <github-actions@github.com>
2025-12-01 07:30:56 +01:00
github-actions[bot]
d661bb1324 📝 Update release notes
[skip ci]
2025-12-01 06:28:06 +00:00
Sebastián Ramírez
32aba57b49 👥 Update FastAPI People - Contributors and Translators (#14420)
Co-authored-by: github-actions <github-actions@github.com>
2025-12-01 07:27:43 +01:00
Sebastián Ramírez
f2bab95267 🔖 Release version 0.123.0 2025-11-30 15:47:35 +01:00
github-actions[bot]
c38e3e0108 📝 Update release notes
[skip ci]
2025-11-30 14:46:13 +00:00
Sebastián Ramírez
7fbd30460f 🐛 Cache dependencies that don't use scopes and don't have sub-dependencies with scopes (#14419)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-11-30 15:45:49 +01:00
Sebastián Ramírez
63d7a2b997 🔖 Release version 0.122.1 2025-11-30 13:00:20 +01:00
github-actions[bot]
7681f2904d 📝 Update release notes
[skip ci]
2025-11-30 11:57:24 +00:00
Kristján Valur Jónsson
378ad688b7 🐛 Fix hierarchical security scope propagation (#5624)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Co-authored-by: svlandeg <svlandeg@github.com>
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
2025-11-30 12:57:01 +01:00
github-actions[bot]
c6487ed632 📝 Update release notes
[skip ci]
2025-11-29 12:09:26 +00:00
Motov Yurii
62a6974004 ⬆ Bump markdown-include-variants from 0.0.5 to 0.0.6 (#14418) 2025-11-29 13:08:57 +01:00
github-actions[bot]
998288261a 📝 Update release notes
[skip ci]
2025-11-28 15:55:40 +00:00
Sebastián Ramírez
8ab7167eaf 💅 Update CSS to explicitly use emoji font (#14415) 2025-11-28 15:55:15 +00:00
Sebastián Ramírez
5b0625df96 🔖 Release version 0.122.0 2025-11-24 20:14:34 +01:00
Sebastián Ramírez
8732c53478 📝 Updates release notes 2025-11-24 20:12:28 +01:00
github-actions[bot]
a4ef97afd9 📝 Update release notes
[skip ci]
2025-11-24 19:03:33 +00:00
Motov Yurii
51ad909ffe 🐛 Use 401 status code in security classes when credentials are missing (#13786)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-11-24 20:03:06 +01:00
github-actions[bot]
e2354a0a06 📝 Update release notes
[skip ci]
2025-11-24 15:00:36 +00:00
github-actions[bot]
cc66dee55c 📝 Update release notes
[skip ci]
2025-11-24 15:00:29 +00:00
github-actions[bot]
ecfb752487 📝 Update release notes
[skip ci]
2025-11-24 15:00:13 +00:00
github-actions[bot]
8b18522205 📝 Update release notes
[skip ci]
2025-11-24 15:00:12 +00:00
github-actions[bot]
a2395e0243 📝 Update release notes
[skip ci]
2025-11-24 14:59:55 +00:00
github-actions[bot]
c7d05a903c 📝 Update release notes
[skip ci]
2025-11-24 14:58:56 +00:00
Sofie Van Landeghem
ab33b45718 👷 Upgrade latest-changes GitHub Action and pin actions/checkout@v5 (#14403)
👷 Upgrade latest-changes and pin actions/checkout@v5
2025-11-24 15:58:32 +01:00
Motov Yurii
5265c4f5cb 🔧 Configure labeler to exclude files that start from underscore for lang-all label (#14213) 2025-11-23 21:10:04 +01:00
Sebastián Ramírez
4f3ff79736 👷 Add pre-commit config with local script for permalinks (#14398)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-11-23 18:41:43 +01:00
Sebastián Ramírez
79bc4b9ca0 👷 Add custom pre-commit CI (#14397) 2025-11-23 17:36:34 +01:00
Sebastián Ramírez
ae951f6981 💄 Use font Fira Code to fix display of Rich panels in docs in Windows (#14387) 2025-11-23 10:27:40 +01:00
dependabot[bot]
cbe5bdb85f ⬆ Bump actions/checkout from 5 to 6 (#14381)
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  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>
2025-11-21 14:03:21 +01:00
github-actions[bot]
2909f8a628 📝 Update release notes
[skip ci]
2025-11-21 12:49:34 +00:00
Motov Yurii
32b375c5e4 🛠️ Add add-permalinks and add-permalinks-page to scripts/docs.py (#14033)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-11-21 13:49:11 +01:00
github-actions[bot]
456008a52b 📝 Update release notes
[skip ci]
2025-11-20 10:45:39 +00:00
Sebastián Ramírez
be5a6311f5 🔧 Upgrade Material for MkDocs and remove insiders (#14375) 2025-11-20 11:45:16 +01:00
Sebastián Ramírez
325fd16d32 🔖 Release version 0.121.3 2025-11-19 17:51:59 +01:00
github-actions[bot]
7659b70da0 📝 Update release notes
[skip ci]
2025-11-19 16:50:42 +00:00
Sebastián Ramírez
85701631a0 ♻️ Make the result of Depends() and Security() hashable, as a workaround for other tools interacting with these internal parts (#14372) 2025-11-19 17:50:18 +01:00
github-actions[bot]
566e3157a5 📝 Update release notes
[skip ci]
2025-11-19 11:55:32 +00:00
Ben Beasley
569226e753 ⬆️ Bump Starlette to <0.51.0 (#14282) 2025-11-19 12:55:05 +01:00
github-actions[bot]
33a75f4817 📝 Update release notes
[skip ci]
2025-11-19 10:12:24 +00:00
Nils-Hero Lindemann
89baa704a9 📝 Add missing hash part (#14369)
Add missing hash part

Was forgotten in #14359. I already added it in #14367
2025-11-19 11:12:00 +01:00
github-actions[bot]
827ed1e6a2 📝 Update release notes
[skip ci]
2025-11-18 08:30:46 +00:00
Edge-Seven
df83eb7278 📝 Fix typos in code comments (#14364)
Fix typos in some files

Co-authored-by: khanhkhanhlele <namkhanh20xx@gmail.com>
2025-11-18 09:30:20 +01:00
github-actions[bot]
4e84f31694 📝 Update release notes
[skip ci]
2025-11-17 19:34:16 +00:00
Sebastián Ramírez
994d6cc912 📝 Add docs for using FastAPI Cloud (#14359) 2025-11-17 20:33:53 +01:00
Sebastián Ramírez
02e108d166 🔖 Release version 0.121.2 2025-11-13 18:03:55 +01:00
github-actions[bot]
d3b75974f4 📝 Update release notes
[skip ci]
2025-11-13 13:59:34 +00:00
Sebastián Ramírez
5d40dfbc9b 🐛 Fix handling of JSON Schema attributes named "$ref" (#14349) 2025-11-13 14:59:07 +01:00
github-actions[bot]
eaf611f9ee 📝 Update release notes
[skip ci]
2025-11-13 09:22:06 +00:00
Mia Bajić
004ab1a9d1 📝 Add EuroPython talk & podcast episode with Sebastián Ramírez (#14260)
Add EuroPython & podcast episode with Sebastián Ramírez
2025-11-13 10:21:43 +01:00
github-actions[bot]
d1be85c728 📝 Update release notes
[skip ci]
2025-11-13 07:37:43 +00:00
Motov Yurii
42930fe600 ✏️ Fix links and add missing permalink in docs (#14217)
* Fix link url to match link text

* Add missing permalink in `behind-a-proxy.md`

* Fix link in `advanced-dependencies.md`
2025-11-13 08:37:15 +01:00
github-actions[bot]
9e362d9f6e 📝 Update release notes
[skip ci]
2025-11-12 16:24:24 +00:00
Rafael de Oliveira Marques
540a83da65 🌐 Update Portuguese translations with LLM prompt (#14228)
* validated llm translation

* validated llm translation

* validated llm translation

* validated llm translation

* validated llm translation

* validated llm translation

* validated llm translation

* validated llm translation

* validated llm translation

* validated llm translation

* validated llm translation

* validated llm translation

* validated llm translation

* validated llm translation

* validated llm translation

* validated llm translation

* validated llm translation

* fix non-Annotated in llm-prompt

* rerun after a few changes in llm-prompt

* fix non-Annotated

* validated llm translation

* fix llm translation

* update outdated translations

* fix translation for operation IDs

* add header link

* add missing link

* fix line break

* fix diff

* fix llm translation

* fix 'Atualize' to 'Atualizar'

* update alternatives.md

* update async.md

* update fastapi-cli.md

* update features.md

* update help-fastapi.md

* update history-design-future.md

* update index.md

* update advanced/events.md

* update advanced/middleware.md

* update advanced/response-cookies.md

* update advanced/response-headers.md

* update advanced/templates.md

* update advanced/testing-websockets.md

* update advanced/using-request-directly.md

* update advanced/websockets.md

* update advanced/security/oauth2-scopes.md

* update deployment/cloud.md

* update deployment/manually.md

* update how-to/custom-request-and-route.md

* update how-to/migrate-from-pydantic-v1-to-pydantic-v2.md

* update tutorial/background-tasks.md

* update tutorial/first-steps.md

* update tutorial/handling-errors.md

* update tutorial/middleware.md

* update tutorial/request-files.md

* update tutorial/sql-databases.md

* update tutorial/static-files.md

* update tutorial/testing.md

* update tutorial/dependencies/dependencies-with-yield.md

* update advanced/advanced-dependencies.md

---------

Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
2025-11-12 17:23:57 +01:00
github-actions[bot]
1a2e4152ed 📝 Update release notes
[skip ci]
2025-11-12 15:23:24 +00:00
Rafael de Oliveira Marques
0878361f6b 🔨 Add Portuguese translations LLM prompt (#14208)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-11-12 16:22:59 +01:00
github-actions[bot]
6fae64ff49 📝 Update release notes
[skip ci]
2025-11-10 20:55:20 +00:00
Motov Yurii
c09ba719ba 🌐 Sync Russian docs (#14331)
Update outdated\missing pages in Rus translations
2025-11-10 21:54:56 +01:00
github-actions[bot]
409e7b503c 📝 Update release notes
[skip ci]
2025-11-10 08:34:48 +00:00
Nils-Hero Lindemann
db488f3220 🌐 Sync German docs (#14317)
* Sync with #14262

* Sync with #14287

* Two improvements

* "Frühzeitig beenden" -> "Frühes Beenden"
* "Make herum" bold too
2025-11-10 09:34:25 +01:00
Sebastián Ramírez
1c7e2540c2 🔖 Release version 0.121.1 2025-11-08 22:47:00 +01:00
github-actions[bot]
9e5439959a 📝 Update release notes
[skip ci]
2025-11-08 21:43:59 +00:00
luzzodev
282f372eda 🐛 Fix Depends(func, scope='function') for top level (parameterless) dependencies (#14301) 2025-11-08 22:43:30 +01:00
github-actions[bot]
972a967d5d 📝 Update release notes
[skip ci]
2025-11-04 08:39:30 +00:00
github-actions[bot]
4170f621a5 📝 Update release notes
[skip ci]
2025-11-04 08:38:34 +00:00
dependabot[bot]
67c8dfaf0f ⬆ Bump ruff from 0.13.2 to 0.14.3 (#14276)
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.13.2 to 0.14.3.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.13.2...0.14.3)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.14.3
  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>
2025-11-04 09:38:16 +01:00
pre-commit-ci[bot]
34db1e2e2c ⬆ [pre-commit.ci] pre-commit autoupdate (#14289)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.14.2 → v0.14.3](https://github.com/astral-sh/ruff-pre-commit/compare/v0.14.2...v0.14.3)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-11-04 09:38:05 +01:00
github-actions[bot]
b787103226 📝 Update release notes
[skip ci]
2025-11-03 13:20:34 +00:00
Sebastián Ramírez
289b4aa2fa 📝 Upate docs for advanced dependencies with yield, noting the changes in 0.121.0, adding scope (#14287) 2025-11-03 14:19:58 +01:00
Sebastián Ramírez
4efae81a76 🔖 Release version 0.121.0 2025-11-03 11:21:36 +01:00
Sebastián Ramírez
3690140555 📝 Update release notes 2025-11-03 11:19:56 +01:00
github-actions[bot]
ad4d8f24ca 📝 Update release notes
[skip ci]
2025-11-03 10:13:13 +00:00
Sebastián Ramírez
ac438b9934 Add support for dependencies with scopes, support scope="request" for dependencies with yield that exit before the response is sent (#14262)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-11-03 11:12:49 +01:00
github-actions[bot]
425a4c5bb1 📝 Update release notes
[skip ci]
2025-11-03 09:25:02 +00:00
github-actions[bot]
3a223b9073 📝 Update release notes
[skip ci]
2025-11-03 09:24:57 +00:00
Sebastián Ramírez
566e0d60b2 👥 Update FastAPI People - Contributors and Translators (#14273)
Co-authored-by: github-actions <github-actions@github.com>
2025-11-03 10:24:36 +01:00
github-actions[bot]
940ee0c9c3 📝 Update release notes
[skip ci]
2025-11-03 09:24:17 +00:00
Sebastián Ramírez
f8df43d734 👥 Update FastAPI People - Sponsors (#14274)
Co-authored-by: github-actions <github-actions@github.com>
2025-11-03 10:24:09 +01:00
Sebastián Ramírez
dbb7020a4d 👥 Update FastAPI GitHub topic repositories (#14280)
Co-authored-by: github-actions <github-actions@github.com>
2025-11-03 10:23:52 +01:00
github-actions[bot]
32da8ca78b 📝 Update release notes
[skip ci]
2025-11-02 17:15:57 +00:00
dependabot[bot]
8c42d0ce16 ⬆ Bump mkdocs-macros-plugin from 1.4.0 to 1.4.1 (#14277)
Bumps [mkdocs-macros-plugin](https://github.com/fralau/mkdocs_macros_plugin) from 1.4.0 to 1.4.1.
- [Release notes](https://github.com/fralau/mkdocs_macros_plugin/releases)
- [Changelog](https://github.com/fralau/mkdocs-macros-plugin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fralau/mkdocs_macros_plugin/compare/v1.4.0...v1.4.1)

---
updated-dependencies:
- dependency-name: mkdocs-macros-plugin
  dependency-version: 1.4.1
  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>
2025-11-02 18:15:19 +01:00
github-actions[bot]
2a25f6d3a3 📝 Update release notes
[skip ci]
2025-11-02 17:15:00 +00:00
dependabot[bot]
8be5867de7 ⬆ Bump mkdocstrings[python] from 0.26.1 to 0.30.1 (#14279)
Bumps [mkdocstrings[python]](https://github.com/mkdocstrings/mkdocstrings) from 0.26.1 to 0.30.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.26.1...0.30.1)

---
updated-dependencies:
- dependency-name: mkdocstrings[python]
  dependency-version: 0.30.1
  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>
2025-11-02 18:14:31 +01:00
Sebastián Ramírez
fad35ef43f 🔖 Release version 0.120.4 2025-10-31 19:35:33 +01:00
github-actions[bot]
4d57c13055 📝 Update release notes
[skip ci]
2025-10-31 18:35:03 +00:00
Motov Yurii
496de1816a 🐛 Fix security schemes in OpenAPI when added at the top level app (#14266)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-10-31 19:34:30 +01:00
Sebastián Ramírez
2cf04ee30d 🔖 Release version 0.120.3 2025-10-30 21:40:08 +01:00
github-actions[bot]
ec00f5a90f 📝 Update release notes
[skip ci]
2025-10-30 19:51:03 +00:00
Motov Yurii
8b46d8821b 📝 Update note for untranslated pages (#14257)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-10-30 20:50:37 +01:00
github-actions[bot]
17fcbbe910 📝 Update release notes
[skip ci]
2025-10-30 19:35:31 +00:00
Sebastián Ramírez
dcfb8b9dda ♻️ Reduce internal cyclic recursion in dependencies, from 2 functions calling each other to 1 calling itself (#14256) 2025-10-30 20:35:04 +01:00
github-actions[bot]
1fc586c3a5 📝 Update release notes
[skip ci]
2025-10-30 04:59:14 +00:00
Sebastián Ramírez
bb88a0f94a ♻️ Refactor internals of dependencies, simplify code and remove get_param_sub_dependant (#14255) 2025-10-30 05:58:49 +01:00
github-actions[bot]
9d1a384f4f 📝 Update release notes
[skip ci]
2025-10-30 04:52:12 +00:00
Sebastián Ramírez
c144f9fbd3 ♻️ Refactor internals of dependencies, simplify using dataclasses (#14254) 2025-10-30 05:51:50 +01:00
Sebastián Ramírez
22ccca21fc 🔖 Release version 0.120.2 2025-10-29 14:44:41 +01:00
github-actions[bot]
d2a703d5cc 📝 Update release notes
[skip ci]
2025-10-29 13:43:35 +00:00
Sebastián Ramírez
35aa12b9bd 🔧 Add sponsor: SerpApi (#14248) 2025-10-29 14:43:11 +01:00
github-actions[bot]
c01b5dd96f 📝 Update release notes
[skip ci]
2025-10-29 13:09:57 +00:00
Sebastián Ramírez
6a657f360d 🐛 Fix separation of schemas with nested models introduced in 0.119.0 (#14246) 2025-10-29 14:09:30 +01:00
github-actions[bot]
7132a69046 📝 Update release notes
[skip ci]
2025-10-28 07:50:28 +00:00
github-actions[bot]
db7feb5a3e 📝 Update release notes
[skip ci]
2025-10-28 07:50:26 +00:00
github-actions[bot]
448ea5ec82 📝 Update release notes
[skip ci]
2025-10-28 07:48:51 +00:00
pre-commit-ci[bot]
b618e0f9d4 ⬆ [pre-commit.ci] pre-commit autoupdate (#14237)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.14.1 → v0.14.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.14.1...v0.14.2)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-10-28 08:48:46 +01:00
dependabot[bot]
ccf50ca477 ⬆ Bump actions/download-artifact from 5 to 6 (#14236)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '6'
  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>
2025-10-28 08:48:36 +01:00
dependabot[bot]
a0ef245067 ⬆ Bump actions/upload-artifact from 4 to 5 (#14235)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '5'
  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>
2025-10-28 08:48:28 +01:00
Sebastián Ramírez
78c94c3f56 🔖 Release version 0.120.1 2025-10-27 18:51:46 +01:00
github-actions[bot]
4b0301b280 📝 Update release notes
[skip ci]
2025-10-27 17:50:15 +00:00
Motov Yurii
436932aef5 ⬆️ Bump Starlette to <0.50.0 (#14234) 2025-10-27 18:49:54 +01:00
github-actions[bot]
3ea6a4a0b1 📝 Update release notes
[skip ci]
2025-10-27 14:47:51 +00:00
Motov Yurii
96dd32718b 🔧 Add license and license-files to pyproject.toml, remove License from classifiers (#14230) 2025-10-27 15:45:14 +01:00
Sebastián Ramírez
cd40c5b40f 🔖 Release version 0.120.0 2025-10-23 22:54:45 +02:00
Sebastián Ramírez
1c6ee57bbf 📝 Update release notes 2025-10-23 22:54:19 +02:00
github-actions[bot]
09f40968cb 📝 Update release notes
[skip ci]
2025-10-23 20:32:06 +00:00
Sebastián Ramírez
d390f2e41f Migrate internal reference documentation from typing_extensions.Doc to annotated_doc.Doc (#14222) 2025-10-23 22:31:35 +02:00
github-actions[bot]
cb7018d782 📝 Update release notes
[skip ci]
2025-10-21 20:32:57 +00:00
Nils-Hero Lindemann
a578ea1fd3 🛠️ Update German LLM prompt and test file (#14189)
Minor fixes in German LLM prompt and test file

Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
2025-10-21 22:32:28 +02:00
github-actions[bot]
9c912d1dd6 📝 Update release notes
[skip ci]
2025-10-21 07:53:59 +00:00
pre-commit-ci[bot]
da011f212a ⬆ [pre-commit.ci] pre-commit autoupdate (#14181)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.13.3 → v0.14.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.13.3...v0.14.1)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-10-21 09:53:27 +02:00
github-actions[bot]
046d49b5a9 📝 Update release notes
[skip ci]
2025-10-20 14:00:33 +00:00
Nils-Hero Lindemann
847280450a 🌐 Sync German docs (#14188)
Sync German docs with #14168

Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
2025-10-20 16:00:08 +02:00
Sebastián Ramírez
864b569cf8 🔖 Release version 0.119.1 2025-10-20 13:28:38 +02:00
github-actions[bot]
43f15d3b43 📝 Update release notes
[skip ci]
2025-10-20 11:27:39 +00:00
Sofie Van Landeghem
d8c691f7f0 🐛 Fix internal Pydantic v1 compatibility (warnings) for Python 3.14 and Pydantic 2.12.1 (#14186)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-10-20 13:26:49 +02:00
github-actions[bot]
6e49dc0295 📝 Update release notes
[skip ci]
2025-10-19 19:12:47 +00:00
Sebastián Ramírez
7df594d284 🔧 Add sponsor Requestly (#14205) 2025-10-19 21:12:22 +02:00
github-actions[bot]
81f85831f5 📝 Update release notes
[skip ci]
2025-10-11 19:36:56 +00:00
Motov Yurii
7f810ca93b 🔧 Configure reminder for waiting label in issue-manager (#14156) 2025-10-11 21:36:25 +02:00
github-actions[bot]
414f961f1f 📝 Update release notes
[skip ci]
2025-10-11 17:49:15 +00:00
Marcelo Trylesinski
dde7bd1ceb 📝 Replace starlette.io by starlette.dev and uvicorn.org by uvicorn.dev (#14176)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-10-11 17:48:49 +00:00
Sebastián Ramírez
2e721e1b02 🔖 Release version 0.119.0 2025-10-11 19:09:01 +02:00
Sebastián Ramírez
fc7a0686af 📝 Update release notes 2025-10-11 19:07:40 +02:00
github-actions[bot]
3a3879b2c3 📝 Update release notes
[skip ci]
2025-10-11 16:46:19 +00:00
Sebastián Ramírez
d34918abf0 Add support for from pydantic.v1 import BaseModel, mixed Pydantic v1 and v2 models in the same app (#14168)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-10-11 18:45:54 +02:00
Sebastián Ramírez
352dbefc63 🔖 Release version 0.118.3 2025-10-10 12:34:39 +02:00
github-actions[bot]
96e7d6eaa4 📝 Update release notes
[skip ci]
2025-10-10 09:45:05 +00:00
Sofie Van Landeghem
3611c3fc5b ⬆️ Add support for Python 3.14 (#14165) 2025-10-10 11:44:39 +02:00
Sebastián Ramírez
942fce394b 🔖 Release version 0.118.2 2025-10-08 16:49:59 +02:00
github-actions[bot]
13b067c9b6 📝 Update release notes
[skip ci]
2025-10-08 14:48:57 +00:00
François Voron
185cecd891 🐛 Fix tagged discriminated union not recognized as body field (#12942)
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Co-authored-by: Patrick Arminio <patrick.arminio@gmail.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-10-08 14:48:30 +00:00
github-actions[bot]
27c0f7e75f 📝 Update release notes
[skip ci]
2025-10-08 14:37:16 +00:00
dependabot[bot]
05dbfebce5 ⬆ Bump astral-sh/setup-uv from 6 to 7 (#14167)
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 6 to 7.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/v6...v7)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: '7'
  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>
2025-10-08 16:36:25 +02:00
Sebastián Ramírez
01be148429 🔖 Release version 0.118.1 2025-10-08 11:05:44 +02:00
github-actions[bot]
fca8564ea0 📝 Update release notes
[skip ci]
2025-10-08 09:03:50 +00:00
Sebastián Ramírez
485bfedf5d 🔨 Move local coverage logic to its own script (#14166) 2025-10-08 09:03:21 +00:00
github-actions[bot]
32b93b53fc 📝 Update release notes
[skip ci]
2025-10-08 08:58:49 +00:00
Colin Watson
c970d8a735 👽️ Ensure compatibility with Pydantic 2.12.0 (#14036)
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
Co-authored-by: Victorien <65306057+Viicos@users.noreply.github.com>
Co-authored-by: svlandeg <svlandeg@github.com>
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Co-authored-by: Patrick Arminio <patrick.arminio@gmail.com>
2025-10-08 10:57:37 +02:00
github-actions[bot]
22b38099ce 📝 Update release notes
[skip ci]
2025-10-07 15:05:44 +00:00
pre-commit-ci[bot]
bc5e877c9c ⬆ [pre-commit.ci] pre-commit autoupdate (#14161)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.13.2 → v0.13.3](https://github.com/astral-sh/ruff-pre-commit/compare/v0.13.2...v0.13.3)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-10-07 17:05:17 +02:00
github-actions[bot]
1cd8717818 📝 Update release notes
[skip ci]
2025-10-06 19:08:44 +00:00
Simon Gurcke
6df0358b80 📝 Add External Link: Getting started with logging in FastAPI (#14152)
Add logging article to External links
2025-10-06 21:08:20 +02:00
github-actions[bot]
56c0632f86 📝 Update release notes
[skip ci]
2025-10-06 11:10:19 +00:00
Sebastián Ramírez
61596ebe5b 🔨 Add Russian translations LLM prompt (#13936)
* 🔨 Add Russian translations LLM prompt

* 🔨 Tweak prompt with input from Yurii

* 📝 Update LLM prompt

* Update llm-prompt.md

* Update llm-prompt.md

* Update llm-prompt.md

* 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks

* Update llm-prompt.md

* Update llm-prompt.md

* Update llm-prompt.md

* Update ru `llm-prompt.md`

---------

Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
2025-10-06 13:09:58 +02:00
github-actions[bot]
e820049caa 📝 Update release notes
[skip ci]
2025-10-02 06:56:51 +00:00
dependabot[bot]
3e97c96b60 ⬆ Bump griffe-typingdoc from 0.2.8 to 0.2.9 (#14144)
Bumps [griffe-typingdoc](https://github.com/mkdocstrings/griffe-typingdoc) from 0.2.8 to 0.2.9.
- [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.8...0.2.9)

---
updated-dependencies:
- dependency-name: griffe-typingdoc
  dependency-version: 0.2.9
  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>
2025-10-02 08:56:32 +02:00
github-actions[bot]
beef83d871 📝 Update release notes
[skip ci]
2025-10-02 06:46:36 +00:00
dependabot[bot]
d421feadf2 ⬆ Bump mkdocs-macros-plugin from 1.3.9 to 1.4.0 (#14145)
Bumps [mkdocs-macros-plugin](https://github.com/fralau/mkdocs_macros_plugin) from 1.3.9 to 1.4.0.
- [Release notes](https://github.com/fralau/mkdocs_macros_plugin/releases)
- [Changelog](https://github.com/fralau/mkdocs-macros-plugin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fralau/mkdocs_macros_plugin/compare/v1.3.9...v1.4.0)

---
updated-dependencies:
- dependency-name: mkdocs-macros-plugin
  dependency-version: 1.4.0
  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>
2025-10-02 08:46:14 +02:00
github-actions[bot]
407a6a4a7c 📝 Update release notes
[skip ci]
2025-10-02 06:27:51 +00:00
dependabot[bot]
ece783d217 ⬆ Bump markdown-include-variants from 0.0.4 to 0.0.5 (#14146)
Bumps [markdown-include-variants](https://github.com/tiangolo/markdown-include-variants) from 0.0.4 to 0.0.5.
- [Release notes](https://github.com/tiangolo/markdown-include-variants/releases)
- [Changelog](https://github.com/tiangolo/markdown-include-variants/blob/main/release-notes.md)
- [Commits](https://github.com/tiangolo/markdown-include-variants/compare/0.0.4...0.0.5)

---
updated-dependencies:
- dependency-name: markdown-include-variants
  dependency-version: 0.0.5
  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>
2025-10-02 08:27:21 +02:00
github-actions[bot]
45bfb89ea2 📝 Update release notes
[skip ci]
2025-10-01 16:44:12 +00:00
github-actions[bot]
6046849249 📝 Update release notes
[skip ci]
2025-10-01 16:43:50 +00:00
pre-commit-ci[bot]
597c2f42c6 ⬆ [pre-commit.ci] pre-commit autoupdate (#14126)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.13.1 → v0.13.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.13.1...v0.13.2)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-10-01 18:43:21 +02:00
Sebastián Ramírez
975e7190e4 👥 Update FastAPI GitHub topic repositories (#14150)
Co-authored-by: github-actions <github-actions@github.com>
2025-10-01 18:43:11 +02:00
github-actions[bot]
65b9bc24ef 📝 Update release notes
[skip ci]
2025-10-01 16:43:01 +00:00
github-actions[bot]
46b7bfc478 📝 Update release notes
[skip ci]
2025-10-01 16:42:56 +00:00
Sebastián Ramírez
28f910a10b 👥 Update FastAPI People - Sponsors (#14139)
Co-authored-by: github-actions <github-actions@github.com>
2025-10-01 18:42:38 +02:00
Sebastián Ramírez
9d920d616f 👥 Update FastAPI People - Contributors and Translators (#14138)
Co-authored-by: github-actions <github-actions@github.com>
2025-10-01 18:42:31 +02:00
github-actions[bot]
a2bde2b297 📝 Update release notes
[skip ci]
2025-10-01 15:50:23 +00:00
dependabot[bot]
69a69cc828 ⬆ Bump ruff from 0.12.7 to 0.13.2 (#14147)
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.12.7 to 0.13.2.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.12.7...0.13.2)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.13.2
  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>
2025-10-01 17:50:01 +02:00
github-actions[bot]
4f0d9d0cf1 📝 Update release notes
[skip ci]
2025-10-01 15:48:14 +00:00
dependabot[bot]
796601bddb ⬆ Bump sqlmodel from 0.0.24 to 0.0.25 (#14143)
Bumps [sqlmodel](https://github.com/fastapi/sqlmodel) from 0.0.24 to 0.0.25.
- [Release notes](https://github.com/fastapi/sqlmodel/releases)
- [Changelog](https://github.com/fastapi/sqlmodel/blob/main/docs/release-notes.md)
- [Commits](https://github.com/fastapi/sqlmodel/compare/0.0.24...0.0.25)

---
updated-dependencies:
- dependency-name: sqlmodel
  dependency-version: 0.0.25
  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>
2025-10-01 17:47:48 +02:00
github-actions[bot]
ef24ee4c39 📝 Update release notes
[skip ci]
2025-10-01 15:20:18 +00:00
Nils-Hero Lindemann
c623291929 🌐 Sync German docs (#14149)
* Sync German docs with #13917

Plus a typo fix in tutorial/security/oauth2-jwt.md line 89.

* Sync german docs with #14099

---------

Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
2025-10-01 17:19:54 +02:00
github-actions[bot]
3a18a6d620 📝 Update release notes
[skip ci]
2025-10-01 13:26:33 +00:00
dependabot[bot]
90e567a6d9 ⬆ Bump tiangolo/issue-manager from 0.5.1 to 0.6.0 (#14148)
Bumps [tiangolo/issue-manager](https://github.com/tiangolo/issue-manager) from 0.5.1 to 0.6.0.
- [Release notes](https://github.com/tiangolo/issue-manager/releases)
- [Commits](https://github.com/tiangolo/issue-manager/compare/0.5.1...0.6.0)

---
updated-dependencies:
- dependency-name: tiangolo/issue-manager
  dependency-version: 0.6.0
  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>
2025-10-01 15:26:11 +02:00
github-actions[bot]
a83a8e7a45 📝 Update release notes
[skip ci]
2025-09-30 11:37:34 +00:00
Motov Yurii
04d5e659bc 🌐 Add Russian translations for missing pages (LLM-generated) (#14135)
* Copy En pages

* Translate pages (reviewed and corrected)

* Apply changes from latest PRs: 13917 and 14099
2025-09-30 13:37:11 +02:00
github-actions[bot]
88a5554a44 📝 Update release notes
[skip ci]
2025-09-30 11:25:02 +00:00
Motov Yurii
977abe2396 🌐 Update Russian translations for existing pages (LLM-generated) (#14123)
* Update Russian translations for modified pages

* docs: fix translation for multiprocessing

* Update Russian translations for other existing pages

* Apply changes from latest PRs: 13917 and 14099

---------

Co-authored-by: vldmrdev <70532790+vldmrdev@users.noreply.github.com>
2025-09-30 13:24:39 +02:00
github-actions[bot]
3d70b26788 📝 Update release notes
[skip ci]
2025-09-30 06:26:25 +00:00
Sebastián Ramírez
e7fc394e15 🌐 Remove configuration files for inactive translations (#14130) 2025-09-30 08:25:57 +02:00
github-actions[bot]
3481aad827 📝 Update release notes
[skip ci]
2025-09-30 05:57:45 +00:00
Sebastián Ramírez
2f6fb12258 👷 Update docs previews comment, single comment, add failure status (#14129)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-09-30 07:56:53 +02:00
github-actions[bot]
36a3830ba2 📝 Update release notes
[skip ci]
2025-09-30 04:07:18 +00:00
Motov Yurii
06367347e6 🔨 Modify mkdocs_hooks.py to add title to page's metadata (remove permalinks in social cards) (#14125) 2025-09-30 06:06:57 +02:00
Sebastián Ramírez
333f1ba737 🔖 Release version 0.118.0 2025-09-29 05:34:21 +02:00
Sebastián Ramírez
1d5168a4a1 📝 Update release notes 2025-09-29 05:33:39 +02:00
github-actions[bot]
bfa54b406d 📝 Update release notes
[skip ci]
2025-09-29 03:31:17 +00:00
Sebastián Ramírez
e329d78f86 🐛 Fix support for StreamingResponses with dependencies with yield or UploadFiles, close after the response is done (#14099)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-09-29 05:29:38 +02:00
github-actions[bot]
861b22c408 📝 Update release notes
[skip ci]
2025-09-29 02:58:20 +00:00
Neizvestnyj
efdafa4361 📝 Update tutorial/security/oauth2-jwt/ to use pwdlib with Argon2 instead of passlib (#13917)
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-09-29 04:57:38 +02:00
github-actions[bot]
450a334253 📝 Update release notes
[skip ci]
2025-09-25 06:45:53 +00:00
alv2017
3eb2ee7510 ✏️ Fix typos in OAuth2 password request forms (#14112)
Fixed typos in OAuth2PasswordRequestForm and in OAuth2PasswordRequestFormStrict
2025-09-25 08:45:24 +02:00
github-actions[bot]
287eb316df 📝 Update release notes
[skip ci]
2025-09-24 08:10:57 +00:00
Nils-Hero Lindemann
cca3341cb9 🌐 Sync German docs (#14098)
* Sync German docs with #13510

* Sync German docs with #14059

---------

Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
2025-09-24 10:10:28 +02:00
github-actions[bot]
f235502234 📝 Update release notes
[skip ci]
2025-09-22 19:30:48 +00:00
pre-commit-ci[bot]
b40da4f0d5 ⬆ [pre-commit.ci] pre-commit autoupdate (#14103)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.13.0 → v0.13.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.13.0...v0.13.1)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-09-22 21:30:27 +02:00
github-actions[bot]
9aa25fd682 📝 Update release notes
[skip ci]
2025-09-22 15:12:21 +00:00
Alejandra
8170860322 ♻️ Refactor sponsor image handling (#14102)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-09-22 17:11:52 +02:00
github-actions[bot]
f0da082dd3 📝 Update release notes
[skip ci]
2025-09-21 14:11:44 +00:00
Alejandra
f97524429d 🐛 Fix sponsor display issue by hiding element on image error (#14097) 2025-09-21 14:11:11 +00:00
github-actions[bot]
6b1e6c5efd 📝 Update release notes
[skip ci]
2025-09-21 12:54:37 +00:00
Alejandra
40f3ab18e0 🐛 Hide sponsor badge when sponsor image is not displayed (#14096) 2025-09-21 14:54:15 +02:00
github-actions[bot]
8dfc651e1a 📝 Update release notes
[skip ci]
2025-09-21 11:29:24 +00:00
Alejandra
2eca83fbda 📝 Update contributing guidelines for installing requirements (#14095) 2025-09-21 13:29:04 +02:00
Sebastián Ramírez
784f06cb9b 🔖 Release version 0.117.1 2025-09-20 22:15:41 +02:00
github-actions[bot]
b5c05893b4 📝 Update release notes
[skip ci]
2025-09-20 19:56:30 +00:00
Thomas LÉVEIL
44fc67632b 🐛 Fix validation error when File is declared after Form parameter (#11194)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-09-20 21:55:59 +02:00
Sebastián Ramírez
a84001000e 📝 Update release notes 2025-09-20 21:35:43 +02:00
Sebastián Ramírez
382d083e26 🔖 Release version 0.117.0 2025-09-20 21:34:05 +02:00
github-actions[bot]
a7f2dbe976 📝 Update release notes
[skip ci]
2025-09-20 18:52:02 +00:00
vvanglro
f1e6f978ce ️ Fix default_factory for response model field with Pydantic V1 (#9704)
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
2025-09-20 20:51:40 +02:00
github-actions[bot]
b01d5c97a0 📝 Update release notes
[skip ci]
2025-09-20 18:45:09 +00:00
Robert Hofer
b51ec36f2e Allow None as return type for bodiless responses (#9425)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-09-20 18:44:43 +00:00
github-actions[bot]
0bdc3ca373 📝 Update release notes
[skip ci]
2025-09-20 18:10:57 +00:00
Max McLennan
86e515784d 🐛 Fix inconsistent processing of model docstring formfeed char with Pydantic V1 (#6039)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-09-20 20:10:37 +02:00
github-actions[bot]
03123c00f1 📝 Update release notes
[skip ci]
2025-09-20 17:57:42 +00:00
Salim Aboubacar
2dc769b121 🐛 Fix jsonable_encoder alters json_encoders of Pydantic v1 objects (#4972)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
2025-09-20 19:57:18 +02:00
github-actions[bot]
606a6828e7 📝 Update release notes
[skip ci]
2025-09-20 17:49:50 +00:00
Marcelo Trylesinski
cd2e1e43bd 📝 Add note about Cookies and JavaScript on tutorial/cookie-params.md (#13510)
Co-authored-by: svlandeg <svlandeg@github.com>
2025-09-20 19:49:27 +02:00
github-actions[bot]
60213f5a31 📝 Update release notes
[skip ci]
2025-09-20 17:47:45 +00:00
sammasak
8ede27223e Allow array values for OpenAPI schema type field (#13639)
Co-authored-by: Lukas Rajala <lukas.rajala@klarna.com>
Co-authored-by: dlax <denis@laxalde.org>
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-09-20 17:47:24 +00:00
github-actions[bot]
0358d3eab5 📝 Update release notes
[skip ci]
2025-09-20 17:37:45 +00:00
Evgeny Bokshitsky
c2c6049b8f ♻️ Create dependency-cache dict in solve_dependencies only if None (don't re-create if empty) (#13689) 2025-09-20 19:37:18 +02:00
github-actions[bot]
21aa9d3719 📝 Update release notes
[skip ci]
2025-09-20 17:26:18 +00:00
rmawatson
9ac56c70f2 🐛 Reenable allow_arbitrary_types when only 1 argument is used on the API endpoint (#13694)
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
2025-09-20 19:25:53 +02:00
github-actions[bot]
243f012fd0 📝 Update release notes
[skip ci]
2025-09-20 17:12:09 +00:00
Carlos Mario Toro
bc5013cd56 Add OpenAPI external_docs parameter to FastAPI (#13713)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
2025-09-20 19:11:46 +02:00
github-actions[bot]
14168b43eb 📝 Update release notes
[skip ci]
2025-09-20 16:58:15 +00:00
Amogha Rao
5fef4d199b Enable test case for duplicated headers in test_tutorial/test_header_params/test_tutorial003.py (#13864)
Co-authored-by: amogha-rao <amogha.rao@cloudera.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-09-20 18:57:53 +02:00
github-actions[bot]
d2f6b92a83 📝 Update release notes
[skip ci]
2025-09-20 16:31:01 +00:00
secrett2633
c831cdbde2 🐛 Fix inspect.getcoroutinefunction() can break testing with unittest.mock.patch() (#14022) 2025-09-20 18:30:34 +02:00
github-actions[bot]
73841b9976 📝 Update release notes
[skip ci]
2025-09-20 16:28:18 +00:00
Sofie Van Landeghem
744736af9c 📝 Remove outdated formatting from path-params-numeric-validations.md for languages en, es and uk. (#14059) 2025-09-20 18:27:21 +02:00
github-actions[bot]
651603cb37 📝 Update release notes
[skip ci]
2025-09-20 16:27:07 +00:00
山崎ヒカル
11d424c3dc Simplify tests for response_model (#14062) 2025-09-20 18:26:21 +02:00
github-actions[bot]
c8a29944f4 📝 Update release notes
[skip ci]
2025-09-20 16:23:31 +00:00
Sofie Van Landeghem
fe4542279d 🚨 Install pydantic.mypy plugin (#14081) 2025-09-20 18:23:06 +02:00
github-actions[bot]
d2da9e8e46 📝 Update release notes
[skip ci]
2025-09-20 15:10:36 +00:00
Nils-Hero Lindemann
9b1234d7d0 📝 Update prompts and German translation (#14015)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-09-20 17:10:09 +02:00
github-actions[bot]
4c175319f5 📝 Update release notes
[skip ci]
2025-09-20 12:58:37 +00:00
Nils-Hero Lindemann
7095a11056 📝 Fix and Improve English Documentation (#14048)
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
2025-09-20 14:58:04 +02:00
github-actions[bot]
9d7388d9f1 📝 Update release notes
[skip ci]
2025-09-20 12:55:53 +00:00
Nils-Hero Lindemann
f10ed69b97 Add LLM test file (#14049)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-09-20 12:55:29 +00:00
github-actions[bot]
111431295c 📝 Update release notes
[skip ci]
2025-09-20 12:22:28 +00:00
Motov Yurii
4c9c3b5942 🔨 Update translations script (#13968)
Co-authored-by: Nils Lindemann <nilsherolindemann@proton.me>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-09-20 14:22:04 +02:00
github-actions[bot]
ccfca4cb06 📝 Update release notes
[skip ci]
2025-09-20 12:06:14 +00:00
Tamir Duberstein
a95e91e46e ⬆️ Update mypy to 1.14.1 (#12970)
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
Co-authored-by: svlandeg <svlandeg@github.com>
Co-authored-by: svlandeg <sofie.vanlandeghem@gmail.com>
2025-09-20 14:05:51 +02:00
github-actions[bot]
ee46b851bc 📝 Update release notes
[skip ci]
2025-09-20 11:44:16 +00:00
Motov Yurii
47acc62e54 🛠️ Update docs.py generate-readme command to remove permalinks from headers (#14055) 2025-09-20 13:43:51 +02:00
github-actions[bot]
5c1f87c563 📝 Update release notes
[skip ci]
2025-09-18 08:09:56 +00:00
Motov Yurii
805ab1be5b 📌 Pin httpx to >=0.23.0,<1.0.0 (#14086) 2025-09-18 10:09:33 +02:00
Sebastián Ramírez
a372edf7e8 🔖 Release version 0.116.2 2025-09-16 20:23:54 +02:00
github-actions[bot]
bc1aba7322 📝 Update release notes
[skip ci]
2025-09-16 17:22:39 +00:00
Ben Beasley
7563579dc8 ⬆️ Upgrade Starlette supported version range to >=0.40.0,<0.49.0 (#14077)
Co-authored-by: svlandeg <svlandeg@github.com>
2025-09-16 19:21:48 +02:00
github-actions[bot]
938dd045fd 📝 Update release notes
[skip ci]
2025-09-16 09:44:33 +00:00
dependabot[bot]
2a446f7151 ⬆ Bump pyjwt from 2.8.0 to 2.9.0 (#13960)
* ⬆ Bump pyjwt from 2.8.0 to 2.10.1

Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.8.0 to 2.10.1.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.8.0...2.10.1)

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

Signed-off-by: dependabot[bot] <support@github.com>

* update to 2.9.0 instead

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
2025-09-16 11:44:09 +02:00
github-actions[bot]
ed45b074b9 📝 Update release notes
[skip ci]
2025-09-16 08:23:33 +00:00
pre-commit-ci[bot]
480cd8f4f9 ⬆ [pre-commit.ci] pre-commit autoupdate (#14080)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.12.12 → v0.13.0](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.12...v0.13.0)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-09-16 10:23:14 +02:00
github-actions[bot]
16d75d90eb 📝 Update release notes
[skip ci]
2025-09-09 09:14:40 +00:00
dependabot[bot]
a4841de65e ⬆ Bump actions/setup-python from 5 to 6 (#14042)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: '6'
  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>
2025-09-09 11:14:16 +02:00
github-actions[bot]
984d646705 📝 Update release notes
[skip ci]
2025-09-09 09:12:07 +00:00
dependabot[bot]
ec087cfa24 ⬆ Bump actions/labeler from 5 to 6 (#14046)
Bumps [actions/labeler](https://github.com/actions/labeler) from 5 to 6.
- [Release notes](https://github.com/actions/labeler/releases)
- [Commits](https://github.com/actions/labeler/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/labeler
  dependency-version: '6'
  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>
2025-09-09 11:11:44 +02:00
github-actions[bot]
1fe23335ce 📝 Update release notes
[skip ci]
2025-09-08 19:12:46 +00:00
pre-commit-ci[bot]
d48144a3e7 ⬆ [pre-commit.ci] pre-commit autoupdate (#14056)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.12.11 → v0.12.12](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.11...v0.12.12)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-09-08 21:12:20 +02:00
github-actions[bot]
3d08a4f3a8 📝 Update release notes
[skip ci]
2025-09-08 07:12:46 +00:00
pre-commit-ci[bot]
caa3ccf638 ⬆ [pre-commit.ci] pre-commit autoupdate (#14035)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.12.10 → v0.12.11](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.10...v0.12.11)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-09-08 09:12:23 +02:00
github-actions[bot]
5226ff90d7 📝 Update release notes
[skip ci]
2025-09-05 12:48:45 +00:00
dependabot[bot]
d597f92482 ⬆ Bump pypa/gh-action-pypi-publish from 1.12.4 to 1.13.0 (#14041)
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.12.4 to 1.13.0.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.12.4...v1.13.0)

---
updated-dependencies:
- dependency-name: pypa/gh-action-pypi-publish
  dependency-version: 1.13.0
  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>
2025-09-05 14:48:16 +02:00
github-actions[bot]
43f6115096 📝 Update release notes
[skip ci]
2025-09-05 08:59:54 +00:00
github-actions[bot]
3112e05b77 📝 Update release notes
[skip ci]
2025-09-05 08:59:48 +00:00
Sebastián Ramírez
4560158502 👥 Update FastAPI People - Contributors and Translators (#14029)
Co-authored-by: github-actions <github-actions@github.com>
2025-09-05 10:58:29 +02:00
Sebastián Ramírez
2ad28d436f 👥 Update FastAPI People - Sponsors (#14030)
Co-authored-by: github-actions <github-actions@github.com>
2025-09-05 10:58:22 +02:00
github-actions[bot]
d7604d16a3 📝 Update release notes
[skip ci]
2025-09-05 08:58:10 +00:00
github-actions[bot]
79c51ad542 📝 Update release notes
[skip ci]
2025-09-05 08:57:43 +00:00
Sebastián Ramírez
7cf567010d 👥 Update FastAPI GitHub topic repositories (#14031)
Co-authored-by: github-actions <github-actions@github.com>
2025-09-05 10:57:41 +02:00
Sebastián Ramírez
3d763c8d38 👥 Update FastAPI People - Experts (#14034)
Co-authored-by: github-actions <github-actions@github.com>
2025-09-05 10:57:16 +02:00
github-actions[bot]
30a07155fb 📝 Update release notes
[skip ci]
2025-09-05 08:34:10 +00:00
Sofie Van Landeghem
bb4772c5aa 👷 Detect and label merge conflicts on PRs automatically (#14045) 2025-09-05 10:33:44 +02:00
github-actions[bot]
3e2dbf9169 📝 Update release notes
[skip ci]
2025-08-31 19:34:37 +00:00
Sebastián Ramírez
f5b77ff0fc 📝 Add documentation for Behind a Proxy - Proxy Forwarded Headers, using --forwarded-allow-ips="*" (#14028)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-08-31 21:34:08 +02:00
github-actions[bot]
176cd8c9ef 📝 Update release notes
[skip ci]
2025-08-31 15:20:12 +00:00
Sebastián Ramírez
1884d76f61 🔧 Update sponsors: remove Platform.sh (#14027) 2025-08-31 15:19:49 +00:00
github-actions[bot]
8062aabdaa 📝 Update release notes
[skip ci]
2025-08-31 15:02:29 +00:00
Sebastián Ramírez
ee9ccac1e5 🔧 Update sponsors: remove Mobb (#14026) 2025-08-31 15:02:08 +00:00
github-actions[bot]
5cd4c3b6bd 📝 Update release notes
[skip ci]
2025-08-31 10:59:17 +00:00
Jom Karlo Verzosa
4584f706bd 📝 Add deprecation info block about dict() in docs/tutorial/body.md (#13906)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-08-31 10:58:56 +00:00
github-actions[bot]
ba9c8fba0b 📝 Update release notes
[skip ci]
2025-08-31 10:50:12 +00:00
Valentyn
d9249c1949 📝 Fix Twitter to be X (Twitter) everywhere in documentation (#13809)
Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-08-31 12:49:48 +02:00
github-actions[bot]
a973e787af 📝 Update release notes
[skip ci]
2025-08-31 10:33:32 +00:00
Ashish Pandey
1088d2abd9 🐛 Prevent scroll-to-top on restart/fast buttons in termynal.js (#13714)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-08-31 12:32:57 +02:00
github-actions[bot]
98ec6a6079 📝 Update release notes
[skip ci]
2025-08-31 10:29:48 +00:00
github-actions[bot]
6b4d292f3a 📝 Update release notes
[skip ci]
2025-08-31 10:29:27 +00:00
z0z0r4
d4ddcc5878 📝 Update testing events documentation (#13259)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-08-31 10:29:21 +00:00
Hotah Ma
0e5832aa6d 📝 Remove obsolete url field in error responses in docs (#13655)
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
2025-08-31 12:29:01 +02:00
github-actions[bot]
ee2acd8abc 📝 Update release notes
[skip ci]
2025-08-31 10:03:35 +00:00
Arnaud Durand
e902ed5fc6 📝 Bring the scope claim in line with the standard in docs_src/security/tutorial005.py (#11189)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
2025-08-31 12:03:10 +02:00
github-actions[bot]
cef1f166df 📝 Update release notes
[skip ci]
2025-08-31 09:59:28 +00:00
Soul Lee
8e63f75919 📝 Update TrustedHostMiddleware Documentation (#11441)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
2025-08-31 11:59:07 +02:00
github-actions[bot]
e1b9cc00ca 📝 Update release notes
[skip ci]
2025-08-31 09:56:48 +00:00
Denny Biasiolli
408b8a9beb 📝 Remove links to site callbackhell.com that doesn't exist anymore (#14006) 2025-08-31 11:56:21 +02:00
github-actions[bot]
0817c955ec 📝 Update release notes
[skip ci]
2025-08-31 09:16:03 +00:00
Motov Yurii
c55f7138a1 📝 Add permalinks to headers in English docs (#13993)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-08-31 09:15:41 +00:00
github-actions[bot]
7653de2715 📝 Update release notes
[skip ci]
2025-08-31 09:11:36 +00:00
Sebastián Ramírez
784f068aba 🛠️ Update mkdocs_hooks to handle headers with permalinks when building docs (#14025)
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
2025-08-31 11:11:15 +02:00
github-actions[bot]
6db05770f6 📝 Update release notes
[skip ci]
2025-08-25 20:03:24 +00:00
pre-commit-ci[bot]
6be02e3d52 ⬆ [pre-commit.ci] pre-commit autoupdate (#14016)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.12.9 → v0.12.10](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.9...v0.12.10)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-08-25 22:03:02 +02:00
github-actions[bot]
9cf7b70d7b 📝 Update release notes
[skip ci]
2025-08-20 09:11:20 +00:00
Motov Yurii
f75c1532f6 ⬆ Bump mkdocs-macros-plugin from 1.3.7 to 1.3.9 (#14003)
Bump mkdocs-macros-plugin from 1.3.7 to 1.3.9
2025-08-20 11:10:51 +02:00
github-actions[bot]
5c3a70d5b6 📝 Update release notes
[skip ci]
2025-08-18 21:07:25 +00:00
pre-commit-ci[bot]
6a45249303 ⬆ [pre-commit.ci] pre-commit autoupdate (#13999)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.12.8 → v0.12.9](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.8...v0.12.9)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-08-18 23:07:04 +02:00
github-actions[bot]
c23051682b 📝 Update release notes
[skip ci]
2025-08-18 06:35:06 +00:00
Mika
df779885fa 📝 Fix code include for Pydantic models example in docs/zh/docs/python-types.md (#13997)
Updated the Pydantic expiration example in the Chinese documentation
2025-08-18 08:34:40 +02:00
github-actions[bot]
9c7abbff43 📝 Update release notes
[skip ci]
2025-08-15 22:01:21 +00:00
pre-commit-ci[bot]
d12c1ac82c ⬆ [pre-commit.ci] pre-commit autoupdate (#13983)
updates:
- [github.com/pre-commit/pre-commit-hooks: v5.0.0 → v6.0.0](https://github.com/pre-commit/pre-commit-hooks/compare/v5.0.0...v6.0.0)
- [github.com/astral-sh/ruff-pre-commit: v0.12.7 → v0.12.8](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.7...v0.12.8)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-08-16 00:00:47 +02:00
github-actions[bot]
dbc9d3a0ce 📝 Update release notes
[skip ci]
2025-08-15 22:00:13 +00:00
Lubos
f1b1449958 📝 Update docs/en/docs/advanced/generate-clients.md (#13793) 2025-08-15 23:59:47 +02:00
github-actions[bot]
078324583c 📝 Update release notes
[skip ci]
2025-08-15 21:44:33 +00:00
dependabot[bot]
7df361eb41 ⬆ Bump actions/checkout from 4 to 5 (#13986)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  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>
2025-08-15 23:44:06 +02:00
github-actions[bot]
753bb9fb9f 📝 Update release notes
[skip ci]
2025-08-08 05:48:47 +00:00
Chai Landau
ba0f6121b9 🔧 Update Speakeasy sponsor graphic (#13971) 2025-08-08 07:48:21 +02:00
github-actions[bot]
12b36a048c 📝 Update release notes
[skip ci]
2025-08-08 05:44:22 +00:00
pre-commit-ci[bot]
6ccad06081 ⬆ [pre-commit.ci] pre-commit autoupdate (#13969)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.12.5 → v0.12.7](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.5...v0.12.7)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-08-08 07:44:02 +02:00
github-actions[bot]
6cee687a79 📝 Update release notes
[skip ci]
2025-08-08 05:43:40 +00:00
dependabot[bot]
5c8d5214ff ⬆ Bump actions/download-artifact from 4 to 5 (#13975)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '5'
  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>
2025-08-08 07:43:20 +02:00
github-actions[bot]
6df50d40fe 📝 Update release notes
[skip ci]
2025-08-01 14:32:59 +00:00
Sebastián Ramírez
f736e48ab3 👥 Update FastAPI People - Experts (#13963)
Co-authored-by: github-actions <github-actions@github.com>
2025-08-01 16:32:33 +02:00
github-actions[bot]
c40bd0e426 📝 Update release notes
[skip ci]
2025-08-01 14:09:56 +00:00
dependabot[bot]
11893d9cea ⬆ Bump ruff from 0.11.2 to 0.12.7 (#13957)
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.11.2 to 0.12.7.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.11.2...0.12.7)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.12.7
  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>
2025-08-01 16:09:11 +02:00
github-actions[bot]
37dd99ffe3 📝 Update release notes
[skip ci]
2025-08-01 14:06:58 +00:00
dependabot[bot]
f8013621cc ⬆ Bump cairosvg from 2.7.1 to 2.8.2 (#13959)
Bumps [cairosvg](https://github.com/Kozea/CairoSVG) from 2.7.1 to 2.8.2.
- [Release notes](https://github.com/Kozea/CairoSVG/releases)
- [Changelog](https://github.com/Kozea/CairoSVG/blob/main/NEWS.rst)
- [Commits](https://github.com/Kozea/CairoSVG/compare/2.7.1...2.8.2)

---
updated-dependencies:
- dependency-name: cairosvg
  dependency-version: 2.8.2
  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>
2025-08-01 16:06:33 +02:00
github-actions[bot]
391887db91 📝 Update release notes
[skip ci]
2025-08-01 13:50:42 +00:00
dependabot[bot]
b42e28753e ⬆ Bump pydantic-ai from 0.0.30 to 0.4.10 (#13958)
Bumps [pydantic-ai](https://github.com/pydantic/pydantic-ai) from 0.0.30 to 0.4.10.
- [Release notes](https://github.com/pydantic/pydantic-ai/releases)
- [Changelog](https://github.com/pydantic/pydantic-ai/blob/main/docs/changelog.md)
- [Commits](https://github.com/pydantic/pydantic-ai/compare/v0.0.30...v0.4.10)

---
updated-dependencies:
- dependency-name: pydantic-ai
  dependency-version: 0.4.10
  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>
2025-08-01 15:50:16 +02:00
github-actions[bot]
92ea53baca 📝 Update release notes
[skip ci]
2025-08-01 13:19:48 +00:00
Sebastián Ramírez
2e16e105c9 👥 Update FastAPI GitHub topic repositories (#13962)
Co-authored-by: github-actions <github-actions@github.com>
2025-08-01 15:19:22 +02:00
github-actions[bot]
d07159797b 📝 Update release notes
[skip ci]
2025-08-01 13:09:46 +00:00
dependabot[bot]
e7401d2e42 ⬆ Bump mkdocs-material from 9.6.15 to 9.6.16 (#13961)
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.6.15 to 9.6.16.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.6.15...9.6.16)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-version: 9.6.16
  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>
2025-08-01 15:09:18 +02:00
github-actions[bot]
6e69d62bfe 📝 Update release notes
[skip ci]
2025-08-01 06:22:46 +00:00
dependabot[bot]
79d2576508 ⬆ Bump tiangolo/latest-changes from 0.3.2 to 0.4.0 (#13952)
Bumps [tiangolo/latest-changes](https://github.com/tiangolo/latest-changes) from 0.3.2 to 0.4.0.
- [Release notes](https://github.com/tiangolo/latest-changes/releases)
- [Commits](https://github.com/tiangolo/latest-changes/compare/0.3.2...0.4.0)

---
updated-dependencies:
- dependency-name: tiangolo/latest-changes
  dependency-version: 0.4.0
  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>
2025-08-01 08:22:27 +02:00
github-actions
1c1c2e8ab9 📝 Update release notes
[skip ci]
2025-08-01 06:20:13 +00:00
Sebastián Ramírez
3ad01a1247 👥 Update FastAPI People - Sponsors (#13956)
Co-authored-by: github-actions <github-actions@github.com>
2025-08-01 08:19:53 +02:00
github-actions
a0ede1839a 📝 Update release notes
[skip ci]
2025-08-01 06:17:21 +00:00
Sebastián Ramírez
a9fbc4b8f5 👥 Update FastAPI People - Contributors and Translators (#13955)
Co-authored-by: github-actions <github-actions@github.com>
2025-08-01 08:16:58 +02:00
github-actions
1e4f123eb0 📝 Update release notes
[skip ci]
2025-07-31 18:21:09 +00:00
Sebastián Ramírez
8abfa0f106 🔧 Update sponsors: Databento link and sponsors_badge data (#13954) 2025-07-31 18:20:49 +00:00
github-actions
cf726c93d9 📝 Update release notes
[skip ci]
2025-07-31 17:47:55 +00:00
Sebastián Ramírez
e326cec10e 🔧 Update sponsors: Add Railway (#13953) 2025-07-31 17:47:31 +00:00
github-actions
8af92a6139 📝 Update release notes
[skip ci]
2025-07-30 16:38:11 +00:00
Motov Yurii
b40acb83c9 ⚒️ Update translate script, update prompt to minimize generated diff (#13947) 2025-07-30 18:37:49 +02:00
github-actions
7b2631a88d 📝 Update release notes
[skip ci]
2025-07-28 20:18:19 +00:00
pre-commit-ci[bot]
616106ca76 ⬆ [pre-commit.ci] pre-commit autoupdate (#13943)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.12.4 → v0.12.5](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.4...v0.12.5)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-07-28 22:17:52 +02:00
github-actions
c656671609 📝 Update release notes
[skip ci]
2025-07-27 23:52:18 +00:00
Sebastián Ramírez
9aab3d9e22 ⚒️ Tweak translate script and CI (#13939) 2025-07-28 01:51:53 +02:00
github-actions
c74e7d1ce4 📝 Update release notes
[skip ci]
2025-07-27 19:12:39 +00:00
Sebastián Ramírez
6516a6c4a6 👷 Add CI to translate with LLMs (#13937)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-07-27 21:12:19 +02:00
github-actions
d5d302c3da 📝 Update release notes
[skip ci]
2025-07-26 21:27:58 +00:00
Sebastián Ramírez
273b06adab ⚒️ Update translate script, show and update outdated translations (#13933)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-07-26 21:27:35 +00:00
github-actions
4c40b484f1 📝 Update release notes
[skip ci]
2025-07-26 21:19:29 +00:00
Sebastián Ramírez
adc328e258 🔨 Refactor translate script with extra feedback (prints) (#13932) 2025-07-26 23:19:05 +02:00
github-actions
4f0aae9d23 📝 Update release notes
[skip ci]
2025-07-26 18:58:14 +00:00
Sebastián Ramírez
ae02be90b6 🔨 Update translations script to remove old (removed) files (#13928)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-07-26 20:57:50 +02:00
github-actions
d67f092db8 📝 Update release notes
[skip ci]
2025-07-26 11:36:02 +00:00
Alejandra
3d60b5e23e 📝 Add discussion template for new language translation requests (#13535)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-07-26 11:35:42 +00:00
github-actions
89b4d1f076 📝 Update release notes
[skip ci]
2025-07-26 11:17:02 +00:00
Edmilson Monteiro Rodrigues Neto
2013336d65 🌐 Update Portuguese Translation for docs/pt/docs/async.md (#13863) 2025-07-26 13:16:39 +02:00
github-actions
8bfc783194 📝 Update release notes
[skip ci]
2025-07-26 10:51:53 +00:00
pre-commit-ci[bot]
fcdd5031e1 ⬆ [pre-commit.ci] pre-commit autoupdate (#13894)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.12.2 → v0.12.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.2...v0.12.4)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-07-26 12:51:31 +02:00
github-actions
bfbed30869 📝 Update release notes
[skip ci]
2025-07-26 10:49:51 +00:00
Chih-Hsuan Yen
54c7c34b25 ⬆ Update httpx requirement to >=0.23.0,<0.29.0 (#13114)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-07-26 12:49:23 +02:00
github-actions
106a4338db 📝 Update release notes
[skip ci]
2025-07-26 10:48:36 +00:00
Koyo Miyazaki
e4453a850d 📝 Fix highlight line in docs/ja/docs/tutorial/body.md (#13927)
fix highlight line in docs/ja/docs/tutorial/body.md
2025-07-26 12:48:11 +02:00
github-actions
4ca93aea04 📝 Update release notes
[skip ci]
2025-07-25 09:27:24 +00:00
Mohammad
da508e9dce 🌐 Add Persian translation for docs/fa/docs/environment-variables.md (#13923)
🌐 Add Persian translation for docs/fa/docs/environment-variables.md
2025-07-25 11:27:03 +02:00
github-actions
ed48cc457f 📝 Update release notes
[skip ci]
2025-07-23 13:02:50 +00:00
Sebastián Ramírez
a5a4daa705 🔧 Update sponsors: Add Mobb (#13916) 2025-07-23 15:02:20 +02:00
github-actions
6bc29cc5ba 📝 Update release notes
[skip ci]
2025-07-21 12:21:22 +00:00
Mohammad
c8f330314e 🌐 Add Persian translation for docs/fa/docs/python-types.md (#13524)
* 🌐 Add Persian translation for docs/fa/docs/python-types.md

* 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-07-21 14:20:57 +02:00
github-actions
d9e2aa8678 📝 Update release notes
[skip ci]
2025-07-21 09:57:51 +00:00
Edmilson Monteiro Rodrigues Neto
cf0c3cf2c4 🌐 Update Portuguese Translation for docs/pt/docs/project-generation.md (#13875)
* docs: update pt-docs project_generation.md

* fix: fix typo
2025-07-21 11:57:31 +02:00
github-actions
4ec2c0bb5b 📝 Update release notes
[skip ci]
2025-07-21 09:43:19 +00:00
Mohammad
5c74eeba5b 🌐 Add Persian translation for docs/fa/docs/async.md (#13541)
* 🌐 Add Persian translation for docs/fa/docs/async.md

* 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-07-21 11:42:59 +02:00
github-actions
27f4240750 📝 Update release notes
[skip ci]
2025-07-14 12:59:10 +00:00
sajjad rahman
679a97603a 🌐 Add Bangali translation for docs/bn/about/index.md (#13882)
* add translation for docs/about/index.md

* 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
2025-07-14 14:58:49 +02:00
github-actions
e6d09027e5 📝 Update release notes
[skip ci]
2025-07-12 19:32:45 +00:00
Sebastián Ramírez
6726bf8559 👥 Update FastAPI People - Experts (#13889)
Co-authored-by: github-actions <github-actions@github.com>
2025-07-12 19:32:26 +00:00
github-actions
3063c7c57d 📝 Update release notes
[skip ci]
2025-07-12 19:10:12 +00:00
Sebastián Ramírez
ce26b8e1ca 🔨 Update FastAPI People sleep interval, use external settings (#13888) 2025-07-12 19:09:49 +00:00
Sebastián Ramírez
313723494b 🔖 Release version 0.116.1 2025-07-11 18:17:57 +02:00
github-actions
095dab00c7 📝 Update release notes
[skip ci]
2025-07-11 16:16:48 +00:00
Sebastián Ramírez
cad6880fd9 ⬆️ Upgrade Starlette supported version range to >=0.40.0,<0.48.0 (#13884) 2025-07-11 18:15:27 +02:00
github-actions
a6e79e68a4 📝 Update release notes
[skip ci]
2025-07-11 16:14:42 +00:00
Motov Yurii
2c13b1ba4b 📝 Add notification about impending changes in Translations to docs/en/docs/contributing.md (#13886) 2025-07-11 18:14:15 +02:00
github-actions
7179d48fd7 📝 Update release notes
[skip ci]
2025-07-11 06:49:39 +00:00
pre-commit-ci[bot]
07bcb18a5a ⬆ [pre-commit.ci] pre-commit autoupdate (#13871)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.12.1 → v0.12.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.1...v0.12.2)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-07-11 08:49:17 +02:00
Sebastián Ramírez
bd8f358fd9 🔖 Release version 0.116.0 2025-07-07 17:07:03 +02:00
Sebastián Ramírez
18eb7a7080 📝 Update release notes 2025-07-07 17:05:38 +02:00
github-actions
dd906a998e 📝 Update release notes
[skip ci]
2025-07-07 15:00:58 +00:00
Sebastián Ramírez
b083ccd250 Add support for deploying to FastAPI Cloud with fastapi deploy (#13870) 2025-07-07 17:00:35 +02:00
github-actions
af64e9d196 📝 Update release notes
[skip ci]
2025-07-04 05:22:22 +00:00
Naves
0d5dc7ee7b 🌐 Add Russian translation for docs/ru/docs/advanced/response-directly.md (#13801)
* 🌐 Add Russian translation for `docs/ru/docs/advanced/response-directly.md`

* 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks

* Update response-directly.md

fixed `Response-классов`

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-07-04 07:21:55 +02:00
github-actions
8068a404c7 📝 Update release notes
[skip ci]
2025-07-04 05:17:43 +00:00
Naves
6682295c73 🌐 Add Russian translation for docs/ru/docs/advanced/additional-status-codes.md (#13799)
* 🌐 Add Russian translation for `docs/ru/docs/advanced/additional-status-codes.md`

* 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks

* Update additional-status-codes.md

fixed `Response-классов`

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-07-04 07:17:17 +02:00
github-actions
2915e31dab 📝 Update release notes
[skip ci]
2025-07-02 19:07:32 +00:00
dependabot[bot]
4f4d47baf4 ⬆ Bump pillow from 11.1.0 to 11.3.0 (#13852)
Bumps [pillow](https://github.com/python-pillow/Pillow) from 11.1.0 to 11.3.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/11.1.0...11.3.0)

---
updated-dependencies:
- dependency-name: pillow
  dependency-version: 11.3.0
  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>
2025-07-02 21:07:09 +02:00
github-actions
8f336c5fd3 📝 Update release notes
[skip ci]
2025-07-01 13:20:56 +00:00
github-actions
3e666dfdd7 📝 Update release notes
[skip ci]
2025-07-01 13:20:35 +00:00
Sebastián Ramírez
be91d0c1bd 👥 Update FastAPI People - Sponsors (#13846)
Co-authored-by: github-actions <github-actions@github.com>
2025-07-01 15:20:19 +02:00
Sebastián Ramírez
f4bacfe1b5 👥 Update FastAPI GitHub topic repositories (#13848)
Co-authored-by: github-actions <github-actions@github.com>
2025-07-01 15:20:03 +02:00
github-actions
943faf237c 📝 Update release notes
[skip ci]
2025-07-01 13:19:35 +00:00
dependabot[bot]
b0e09640e1 ⬆ Bump mkdocs-material from 9.6.1 to 9.6.15 (#13849)
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.6.1 to 9.6.15.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.6.1...9.6.15)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-version: 9.6.15
  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>
2025-07-01 15:19:03 +02:00
github-actions
638b4355d8 📝 Update release notes
[skip ci]
2025-07-01 13:18:41 +00:00
pre-commit-ci[bot]
21c8a32fa7 ⬆ [pre-commit.ci] pre-commit autoupdate (#13843)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.12.0 → v0.12.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.0...v0.12.1)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-07-01 15:18:16 +02:00
github-actions
a86b9a5b03 📝 Update release notes
[skip ci]
2025-07-01 05:14:52 +00:00
Sebastián Ramírez
c6037fc96f 👥 Update FastAPI People - Contributors and Translators (#13845)
Co-authored-by: github-actions <github-actions@github.com>
2025-07-01 07:14:26 +02:00
github-actions
5e7c3ee1f3 📝 Update release notes
[skip ci]
2025-06-30 06:00:29 +00:00
Valentyn
6c1432801f 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/body-updates.md (#13804)
* 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/body-updates.md

* 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks

---------

Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-06-30 08:00:04 +02:00
Sebastián Ramírez
ebdeda2de6 🔖 Release version 0.115.14 2025-06-26 17:26:32 +02:00
Sebastián Ramírez
8fa19a6faa 📝 Update release notes 2025-06-26 17:24:56 +02:00
github-actions
3ecb4c5389 📝 Update release notes
[skip ci]
2025-06-26 15:23:20 +00:00
Patrick Arminio
9d0d8828cc 🐛 Fix support for unions when using Form (#13827) 2025-06-26 17:22:53 +02:00
github-actions
df35896a0e 📝 Update release notes
[skip ci]
2025-06-25 09:13:15 +00:00
pre-commit-ci[bot]
8f64d09ee0 ⬆ [pre-commit.ci] pre-commit autoupdate (#13823)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.11.13 → v0.12.0](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.13...v0.12.0)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-06-25 11:12:53 +02:00
github-actions
3b09dd8e01 📝 Update release notes
[skip ci]
2025-06-24 19:14:26 +00:00
Valentyn
c30821ff6e 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/response-model.md (#13792)
* 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/response-model.md

* 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks

* Fix review comments

---------

Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-06-24 21:14:01 +02:00
github-actions
666890ac7f 📝 Update release notes
[skip ci]
2025-06-24 18:58:10 +00:00
Valentyn
937af92ba7 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/security/index.md (#13805)
Fixes after review

Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global>
2025-06-24 20:57:48 +02:00
github-actions
1cf4b8c2de 📝 Update release notes
[skip ci]
2025-06-22 14:37:15 +00:00
Hirokatsu Endo
dcb223d850 ✏️ Fix typo in docs/ja/docs/tutorial/encoder.md (#13815) 2025-06-22 16:36:05 +02:00
github-actions
baeeafa1e1 📝 Update release notes
[skip ci]
2025-06-22 14:35:47 +00:00
Hirokatsu Endo
487f940e91 ✏️ Fix typo in docs/ja/docs/tutorial/handling-errors.md (#13814) 2025-06-22 16:35:27 +02:00
github-actions
e9c33debaa 📝 Update release notes
[skip ci]
2025-06-22 14:35:16 +00:00
Hirokatsu Endo
041a37bb1f ✏️ Fix typo in docs/ja/docs/tutorial/body-fields.md (#13802) 2025-06-22 16:34:53 +02:00
github-actions
28038f19cf 📝 Update release notes
[skip ci]
2025-06-18 18:22:42 +00:00
Naves
9026f3b1bd Misprint (#13800) 2025-06-18 20:22:18 +02:00
github-actions
8d9ef5d343 📝 Update release notes
[skip ci]
2025-06-18 08:41:19 +00:00
Naves
b2923282ca 🌐 Add Russian translation for docs/ru/docs/advanced/index.md (#13797)
* Add Russian Translation for `docs/ru/docs/advanced/index.md`

* 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-06-18 10:40:59 +02:00
github-actions
ac160885e1 📝 Update release notes
[skip ci]
2025-06-17 11:54:19 +00:00
Nolan Di Mare Sullivan
7d9195a248 📝 Update Speakeasy URL to Speakeasy Sandbox (#13697) 2025-06-17 13:53:56 +02:00
Sebastián Ramírez
4734df1db8 🔖 Release version 0.115.13 2025-06-17 13:41:24 +02:00
github-actions
cdf6b31505 📝 Update release notes
[skip ci]
2025-06-17 10:48:39 +00:00
Gabriel
dfe9dde982 📝 Add annotations to HTTP middleware example (#11530)
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-06-17 12:48:10 +02:00
github-actions
9957956ef8 📝 Update release notes
[skip ci]
2025-06-17 10:47:13 +00:00
Salar Nosrati-Ershad
aebff5006f Add refreshUrl parameter in OAuth2PasswordBearer (#11460)
Co-authored-by: Salar Nosrati-Ershad <s3r@tutamail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
2025-06-17 12:46:49 +02:00
github-actions
64834d4a60 📝 Update release notes
[skip ci]
2025-06-17 10:42:46 +00:00
oogee
30b9dfb11c 🚸 Set format to password for fields password and client_secret in OAuth2PasswordRequestForm, make docs show password fields for passwords (#11032)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-06-17 12:41:59 +02:00
github-actions
6b5b26fa61 📝 Update release notes
[skip ci]
2025-06-17 10:37:30 +00:00
Diego Fioravanti
3f908a47d9 📝 Clarify in CORS docs that wildcards and credentials are mutually exclusive (#9829)
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
Co-authored-by: Michael Jones <mike.ed.jones@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: User <alejsdev@gmail.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-06-17 12:36:59 +02:00
github-actions
01c3ad2eb2 📝 Update release notes
[skip ci]
2025-06-17 10:25:45 +00:00
Valentyn
85a2eed888 Simplify tests for settings (#13505)
Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global>
2025-06-17 12:25:20 +02:00
github-actions
45fefe88cf 📝 Update release notes
[skip ci]
2025-06-17 10:25:13 +00:00
Valentyn
da4605b039 Simplify tests for validate_response_recursive (#13507)
Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global>
2025-06-17 12:24:10 +02:00
github-actions
4e4715b131 📝 Update release notes
[skip ci]
2025-06-17 10:18:31 +00:00
Peter
b4524145e6 ✏️ Fix typo in docstring (#13532) 2025-06-17 12:18:00 +02:00
github-actions
1daf9fddfd 📝 Update release notes
[skip ci]
2025-06-17 10:17:31 +00:00
Swastik Pradhan
6d78b228d8 📝 Clarify guidance on using async def without await (#13642)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-06-17 10:17:08 +00:00
github-actions
10bf65f272 📝 Update release notes
[skip ci]
2025-06-17 08:05:54 +00:00
Timon
97fdbdd0d8 📝 Update exclude-parameters-from-openapi documentation links (#13600) 2025-06-17 10:05:34 +02:00
github-actions
7dc9901f35 📝 Update release notes
[skip ci]
2025-06-17 07:50:39 +00:00
Emmanuel Ferdman
7c04182724 🔨 Resolve Pydantic deprecation warnings in internal script (#13696)
Signed-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>
2025-06-17 09:50:19 +02:00
github-actions
6e11a2d1c4 📝 Update release notes
[skip ci]
2025-06-17 07:46:49 +00:00
Motov Yurii
535d5b3f9f 🐛 Fix truncating the model's description with form feed (\f) character for Pydantic V2 (#13698)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-06-17 09:46:27 +02:00
github-actions
7565f580ce 📝 Update release notes
[skip ci]
2025-06-17 07:43:06 +00:00
Motov Yurii
590abc4b96 📝 Clarify the middleware execution order in docs (#13699) 2025-06-17 09:42:41 +02:00
github-actions
3ac38eb195 📝 Update release notes
[skip ci]
2025-06-16 11:11:36 +00:00
Naves
6cbdcd3961 🌐 Add Russian Translation for docs/ru/docs/advanced/response-change-status-code.md (#13791)
🌐 Add Russian Translation for docs/ru/docs/advanced/response-change-status-code.md
2025-06-16 13:11:10 +02:00
github-actions
c7302ea99e 📝 Update release notes
[skip ci]
2025-06-16 10:43:29 +00:00
Mohammad
49fe5bac2e 🌐 Add Persian translation for docs/fa/docs/learn/index.md (#13518)
* 🌐 Add Persian translation for docs/fa/docs/learn/index.md

* 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-06-16 12:43:07 +02:00
github-actions
1f79531a5b 📝 Update release notes
[skip ci]
2025-06-12 07:32:29 +00:00
ChaeYeong Hwang
095dcc8a63 🌐 Add Korean translation for docs/ko/docs/advanced/sub-applications.md (#4543)
* This PR translates advanced/sub-applications.md in Korean.

    Test complete

    related: #2017

* Update sub-applications.md

* Update sub-applications.md

* Update sub-applications.md

* remove .DS_Store

* 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks

* Update docs/ko/docs/advanced/sub-applications.md

* Update docs/ko/docs/advanced/sub-applications.md

* Update docs/ko/docs/advanced/sub-applications.md

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
2025-06-12 09:32:09 +02:00
github-actions
5ba94612c1 📝 Update release notes
[skip ci]
2025-06-10 16:52:55 +00:00
Sebastián Ramírez
44d5abffc1 🔧 Update sponsors: remove Porter (#13783) 2025-06-10 18:52:33 +02:00
github-actions
98fa4bd437 📝 Update release notes
[skip ci]
2025-06-09 19:41:14 +00:00
pre-commit-ci[bot]
cdd5d6ce70 ⬆ [pre-commit.ci] pre-commit autoupdate (#13781)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.11.12 → v0.11.13](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.12...v0.11.13)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-06-09 21:40:54 +02:00
github-actions
b8a3cccb75 📝 Update release notes
[skip ci]
2025-06-09 19:36:09 +00:00
Valentyn
14a55d864d 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/schema-extra-example.md (#13769)
* 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/schema-extra-example.md page

* 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks

---------

Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-06-09 21:35:48 +02:00
github-actions
37c8e7d76b 📝 Update release notes
[skip ci]
2025-06-09 04:15:43 +00:00
Charlie ✨
4b12a2818a ✏️ Remove redundant words in docs/zh/docs/python-types.md (#13774) 2025-06-09 06:15:17 +02:00
github-actions
9ab43cc5ed 📝 Update release notes
[skip ci]
2025-06-06 14:08:55 +00:00
pre-commit-ci[bot]
7b3463de32 ⬆ [pre-commit.ci] pre-commit autoupdate (#13757)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.11.11 → v0.11.12](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.11...v0.11.12)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-06-06 16:08:32 +02:00
github-actions
f7ab09884d 📝 Update release notes
[skip ci]
2025-06-05 16:10:42 +00:00
dependabot[bot]
9c4a1d2105 ⬆ Bump griffe-typingdoc from 0.2.7 to 0.2.8 (#13751)
Bumps [griffe-typingdoc](https://github.com/mkdocstrings/griffe-typingdoc) from 0.2.7 to 0.2.8.
- [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.7...0.2.8)

---
updated-dependencies:
- dependency-name: griffe-typingdoc
  dependency-version: 0.2.8
  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>
2025-06-05 18:10:20 +02:00
github-actions
066c249bad 📝 Update release notes
[skip ci]
2025-06-05 12:27:46 +00:00
Sebastián Ramírez
2116d8aa56 🍱 Update sponsors: Dribia badge size (#13773) 2025-06-05 12:27:20 +00:00
github-actions
2e21808094 📝 Update release notes
[skip ci]
2025-06-05 12:12:28 +00:00
Valentyn
736cce8329 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/query-param-models.md (#13748)
* 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/query-param-models.md page

* 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks

* Update docs/uk/docs/tutorial/query-param-models.md

Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>

---------

Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
2025-06-05 14:12:04 +02:00
github-actions
f78aa8848b 📝 Update release notes
[skip ci]
2025-06-05 11:52:34 +00:00
Sebastián Ramírez
38c282039a 🔧 Update sponsors: add Dribia (#13771) 2025-06-05 13:51:48 +02:00
github-actions
b7a8850660 📝 Update release notes
[skip ci]
2025-06-05 10:01:12 +00:00
dependabot[bot]
eae3025ed2 ⬆ Bump typer from 0.15.3 to 0.16.0 (#13752)
Bumps [typer](https://github.com/fastapi/typer) from 0.15.3 to 0.16.0.
- [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.15.3...0.16.0)

---
updated-dependencies:
- dependency-name: typer
  dependency-version: 0.16.0
  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>
2025-06-05 12:00:47 +02:00
github-actions
37e596599e 📝 Update release notes
[skip ci]
2025-06-05 08:16:18 +00:00
Nazmus Sakib Sibly
37c6913ce5 🌐 Add Bengali translation for docs/bn/docs/environment-variables.md (#13629)
Add Bengali translation for docs/bn/docs/environment-variables.md

Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
2025-06-05 10:15:56 +02:00
github-actions
7421a19b7f 📝 Update release notes
[skip ci]
2025-06-05 07:29:36 +00:00
Sebastián Ramírez
e71d87d8ef 👥 Update FastAPI GitHub topic repositories (#13754)
Co-authored-by: github-actions <github-actions@github.com>
2025-06-05 09:29:13 +02:00
github-actions
c3de47858c 📝 Update release notes
[skip ci]
2025-06-05 06:58:39 +00:00
Sebastián Ramírez
c430ef1ac1 👥 Update FastAPI People - Sponsors (#13750)
Co-authored-by: github-actions <github-actions@github.com>
2025-06-05 08:58:14 +02:00
github-actions
54f255ecc8 📝 Update release notes
[skip ci]
2025-06-05 06:49:21 +00:00
Sebastián Ramírez
751c7dc179 👥 Update FastAPI People - Contributors and Translators (#13749)
Co-authored-by: github-actions <github-actions@github.com>
2025-06-05 08:48:55 +02:00
github-actions
b2d742074c 📝 Update release notes
[skip ci]
2025-05-30 14:17:45 +00:00
Valentyn
e48c526b62 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/query-params-str-validations.md page (#13546) 2025-05-30 16:17:24 +02:00
github-actions
be6cfd6cf5 📝 Update release notes
[skip ci]
2025-05-30 14:15:08 +00:00
Егор Онищук
02ca761365 🌐 Add Russian translation for docs/ru/docs/tutorial/cookie-param-models.md (#13616) 2025-05-30 16:14:42 +02:00
github-actions
cadb7f5c3a 📝 Update release notes
[skip ci]
2025-05-30 13:38:55 +00:00
timothy
645d645737 🌐 Add Korean translation for docs/ko/docs/tutorial/extra-models.md (#13063) 2025-05-30 15:38:33 +02:00
github-actions
bb05a68530 📝 Update release notes
[skip ci]
2025-05-30 13:37:55 +00:00
pre-commit-ci[bot]
7ebcd8761c ⬆ [pre-commit.ci] pre-commit autoupdate (#13736)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.11.10 → v0.11.11](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.10...v0.11.11)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-05-30 15:36:54 +02:00
github-actions
57ed433bef 📝 Update release notes
[skip ci]
2025-05-30 13:36:31 +00:00
github-actions
3855d808b0 📝 Update release notes
[skip ci]
2025-05-30 13:36:27 +00:00
Valentyn
d6b8b8f590 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/path-params-numeric-validations.md page (#13548) 2025-05-30 15:35:49 +02:00
Valentyn
3337c3b9be 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/middleware.md page (#13520) 2025-05-30 15:35:33 +02:00
github-actions
950fb3f02d 📝 Update release notes
[skip ci]
2025-05-30 13:35:25 +00:00
github-actions
c83a5bf149 📝 Update release notes
[skip ci]
2025-05-30 13:35:17 +00:00
Valentyn
45a40f8b1c 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/background-tasks.md page (#13502) 2025-05-30 15:34:53 +02:00
Valentyn
44c83dda0b 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/cors.md page (#13519) 2025-05-30 15:34:34 +02:00
github-actions
57a7a706f3 📝 Update release notes
[skip ci]
2025-05-30 13:34:17 +00:00
Junbeom Lee
aa2bb3e569 🌐 Update Korean translation for docs/ko/docs/advanced/events.md (#13487) 2025-05-30 15:33:53 +02:00
github-actions
f0b3ebdf03 📝 Update release notes
[skip ci]
2025-05-30 13:31:35 +00:00
Valentyn
4f9b737548 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/handling-errors.md page (#13420) 2025-05-30 15:31:13 +02:00
github-actions
2e9e5dfeec 📝 Update release notes
[skip ci]
2025-05-30 13:18:34 +00:00
Егор Онищук
374626e036 🌐 Add Russian translation for docs/ru/docs/tutorial/request-form-models.md (#13552) 2025-05-30 15:17:36 +02:00
github-actions
6c1e7fb4de 📝 Update release notes
[skip ci]
2025-05-30 13:16:17 +00:00
Fabián Falón
5f84703bea 📝 Fix internal anchor link in Spanish deployment docs (#13737) 2025-05-30 15:15:52 +02:00
github-actions
34856a2738 📝 Update release notes
[skip ci]
2025-05-30 13:11:03 +00:00
sungchan Yeo
61cc7014cc 🌐 Update Korean translation for docs/ko/docs/virtual-environments.md (#13630) 2025-05-30 15:10:41 +02:00
github-actions
e31f35ec65 📝 Update release notes
[skip ci]
2025-05-22 09:45:56 +00:00
Sebastián Ramírez
29ed7d052b 🔧 Update sponsors: Add InterviewPal (#13728) 2025-05-22 09:45:32 +00:00
github-actions
bcb7935ab7 📝 Update release notes
[skip ci]
2025-05-22 09:19:16 +00:00
Sebastián Ramírez
a01a665b57 🔧 Remove Google Analytics (#13727) 2025-05-22 09:18:52 +00:00
github-actions
0e1ec48885 📝 Update release notes
[skip ci]
2025-05-21 15:17:32 +00:00
Sebastián Ramírez
7382ceda57 🔧 Update sponsors: remove MongoDB (#13725) 2025-05-21 17:17:03 +02:00
github-actions
4d1c69751e 📝 Update release notes
[skip ci]
2025-05-20 16:02:48 +00:00
pre-commit-ci[bot]
be0cf41d38 ⬆ [pre-commit.ci] pre-commit autoupdate (#13711)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.11.8 → v0.11.10](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.8...v0.11.10)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-05-20 18:02:28 +02:00
github-actions
ea7b105476 📝 Update release notes
[skip ci]
2025-05-11 13:37:47 +00:00
Sebastián Ramírez
214e0740c8 🍱 Update Drawio diagrams SVGs, single file per diagram, sans-serif font (#13706)
---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-05-11 15:37:26 +02:00
github-actions
f3bfa3b8a5 📝 Update release notes
[skip ci]
2025-05-09 16:37:03 +00:00
Sebastián Ramírez
a9a2782f95 🔧 Update sponsors: add Subtotal (#13701)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-05-09 18:36:42 +02:00
github-actions
acbf27c971 📝 Update release notes
[skip ci]
2025-05-09 13:49:14 +00:00
Sebastián Ramírez
f61fe35178 🔧 Update sponsors: remove deepset / Haystack (#13700) 2025-05-09 13:48:50 +00:00
github-actions
9a33ba46ac 📝 Update release notes
[skip ci]
2025-05-06 08:23:30 +00:00
pre-commit-ci[bot]
1d63896c35 ⬆ [pre-commit.ci] pre-commit autoupdate (#13688)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.11.7 → v0.11.8](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.7...v0.11.8)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-05-06 10:23:09 +02:00
github-actions
ea839df09e 📝 Update release notes
[skip ci]
2025-05-01 14:43:04 +00:00
Sebastián Ramírez
3620a2b213 👥 Update FastAPI People - Experts (#13671)
Co-authored-by: github-actions <github-actions@github.com>
2025-05-01 14:42:39 +00:00
github-actions
6df106b877 📝 Update release notes
[skip ci]
2025-05-01 13:16:47 +00:00
github-actions
fb1affca1b 📝 Update release notes
[skip ci]
2025-05-01 13:16:45 +00:00
github-actions
581e3a0051 📝 Update release notes
[skip ci]
2025-05-01 13:16:30 +00:00
dependabot[bot]
b57b8e7ad2 ⬆ Bump sqlmodel from 0.0.23 to 0.0.24 (#13665)
Bumps [sqlmodel](https://github.com/fastapi/sqlmodel) from 0.0.23 to 0.0.24.
- [Release notes](https://github.com/fastapi/sqlmodel/releases)
- [Changelog](https://github.com/fastapi/sqlmodel/blob/main/docs/release-notes.md)
- [Commits](https://github.com/fastapi/sqlmodel/compare/0.0.23...0.0.24)

---
updated-dependencies:
- dependency-name: sqlmodel
  dependency-version: 0.0.24
  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>
2025-05-01 15:15:54 +02:00
dependabot[bot]
4bef866495 ⬆ Bump typer from 0.12.5 to 0.15.3 (#13666)
Bumps [typer](https://github.com/fastapi/typer) from 0.12.5 to 0.15.3.
- [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.5...0.15.3)

---
updated-dependencies:
- dependency-name: typer
  dependency-version: 0.15.3
  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>
2025-05-01 15:15:45 +02:00
Martyn Davies
bc56c74d6b 🔧 Update Sponsors: Zuplo logo and alt text (#13645)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-05-01 13:15:38 +00:00
github-actions
7fdc4952bd 📝 Update release notes
[skip ci]
2025-05-01 13:14:19 +00:00
Sebastián Ramírez
16234a3f4f 📝 Update docs for "Help FastAPI", simplify and reduce "sponsor" section (#13670) 2025-05-01 13:13:51 +00:00
github-actions
6eb31132e5 📝 Update release notes
[skip ci]
2025-05-01 13:00:17 +00:00
Sebastián Ramírez
f512b17992 👥 Update FastAPI GitHub topic repositories (#13667)
Co-authored-by: github-actions <github-actions@github.com>
2025-05-01 14:59:46 +02:00
github-actions
cae8f976d8 📝 Update release notes
[skip ci]
2025-05-01 12:59:02 +00:00
github-actions
48c0d3405d 📝 Update release notes
[skip ci]
2025-05-01 12:58:22 +00:00
Sebastián Ramírez
3da3f3ab82 🔧 Update links for LinkedIn and bottom (#13669) 2025-05-01 14:58:12 +02:00
Sebastián Ramírez
418c3c8d2b 🔧 Update sponsors: remove Bump.sh and Coherence (#13668) 2025-05-01 12:58:00 +00:00
github-actions
663aae13b2 📝 Update release notes
[skip ci]
2025-05-01 11:33:13 +00:00
github-actions
ed88e25098 📝 Update release notes
[skip ci]
2025-05-01 11:32:57 +00:00
Sebastián Ramírez
a748e7336b 👥 Update FastAPI People - Sponsors (#13664)
Co-authored-by: github-actions <github-actions@github.com>
2025-05-01 11:32:46 +00:00
Sebastián Ramírez
9b5b2dd7a2 👥 Update FastAPI People - Contributors and Translators (#13662)
Co-authored-by: github-actions <github-actions@github.com>
2025-05-01 11:32:33 +00:00
github-actions
699717cf7f 📝 Update release notes
[skip ci]
2025-04-28 18:37:55 +00:00
pre-commit-ci[bot]
26dc148cb9 ⬆ [pre-commit.ci] pre-commit autoupdate (#13656)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.11.6 → v0.11.7](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.6...v0.11.7)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-28 20:37:31 +02:00
github-actions
4025751afb 📝 Update release notes
[skip ci]
2025-04-28 18:32:06 +00:00
Joakim Nordling
8fa56b46a1 ⬆️ Update ReDoc to version 2.x (#9700)
Co-authored-by: svlandeg <svlandeg@github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
2025-04-28 20:31:44 +02:00
github-actions
4199172977 📝 Update release notes
[skip ci]
2025-04-28 07:14:30 +00:00
Frank Hoffmann
ea42ebda80 Use inline-snapshot to support different Pydantic versions in the test suite (#12534)
Co-authored-by: svlandeg <svlandeg@github.com>
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
2025-04-28 09:13:56 +02:00
github-actions
79bc96647b 📝 Update release notes
[skip ci]
2025-04-26 16:01:11 +00:00
github-actions
9fa8050e01 📝 Update release notes
[skip ci]
2025-04-26 16:00:54 +00:00
dependabot[bot]
ba8d85fbe8 ⬆ Bump astral-sh/setup-uv from 5 to 6 (#13648)
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 5 to 6.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/v5...v6)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: '6'
  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>
2025-04-26 18:00:46 +02:00
OA
c2fb5cc109 📝 Remove unnecessary bullet from docs (#13641) 2025-04-26 18:00:32 +02:00
github-actions
fe0c643e90 📝 Update release notes
[skip ci]
2025-04-21 18:09:43 +00:00
pre-commit-ci[bot]
9c03b8fd64 ⬆ [pre-commit.ci] pre-commit autoupdate (#13634)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.11.5 → v0.11.6](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.5...v0.11.6)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-21 20:09:18 +02:00
github-actions
601d678e07 📝 Update release notes
[skip ci]
2025-04-21 13:30:58 +00:00
Gaurav Sheni
1d21c7f748 ✏️ Fix syntax error in docs/en/docs/tutorial/handling-errors.md (#13623) 2025-04-21 15:30:38 +02:00
github-actions
7c75b55580 📝 Update release notes
[skip ci]
2025-04-15 08:04:06 +00:00
pre-commit-ci[bot]
9d937964ba ⬆ [pre-commit.ci] pre-commit autoupdate (#13619)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.11.4 → v0.11.5](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.4...v0.11.5)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-15 10:03:45 +02:00
github-actions
4ec5e0a90a 📝 Update release notes
[skip ci]
2025-04-11 16:03:08 +00:00
pre-commit-ci[bot]
024d5d3318 ⬆ [pre-commit.ci] pre-commit autoupdate (#13594)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.11.2 → v0.11.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.2...v0.11.4)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-11 18:02:43 +02:00
github-actions
a8c1333b4d 📝 Update release notes
[skip ci]
2025-04-11 15:59:09 +00:00
Hotah Ma
d1962bb22f 📝 Fix typo in documentation (#13599) 2025-04-11 17:58:47 +02:00
github-actions
bd3e47ec59 📝 Update release notes
[skip ci]
2025-04-06 16:33:45 +00:00
Elliot Ford
5f9c7a3185 📝 Fix liblab client generation doc link (#13571) 2025-04-06 18:33:24 +02:00
github-actions
76b324d95b 📝 Update release notes
[skip ci]
2025-04-03 19:48:31 +00:00
Sebastián Ramírez
7b7ec90308 👥 Update FastAPI People - Experts (#13568)
Co-authored-by: github-actions <github-actions@github.com>
2025-04-03 21:48:09 +02:00
github-actions
8032e21418 📝 Update release notes
[skip ci]
2025-04-02 19:48:32 +00:00
github-actions
8bf01245b1 📝 Update release notes
[skip ci]
2025-04-02 19:48:09 +00:00
github-actions
f4583c58b9 📝 Update release notes
[skip ci]
2025-04-02 19:48:02 +00:00
Sebastián Ramírez
f0576e8ffd 👥 Update FastAPI GitHub topic repositories (#13565)
Co-authored-by: github-actions <github-actions@github.com>
2025-04-02 21:47:54 +02:00
Sebastián Ramírez
1abef20dbd 👥 Update FastAPI People - Sponsors (#13559)
Co-authored-by: github-actions <github-actions@github.com>
2025-04-02 21:47:46 +02:00
Sebastián Ramírez
286f5a0c42 👥 Update FastAPI People - Contributors and Translators (#13558) 2025-04-02 21:47:36 +02:00
github-actions
77c8b5b3b9 📝 Update release notes
[skip ci]
2025-04-02 19:33:56 +00:00
dependabot[bot]
6fefc17a84 ⬆ Bump dirty-equals from 0.8.0 to 0.9.0 (#13561)
Bumps [dirty-equals](https://github.com/samuelcolvin/dirty-equals) from 0.8.0 to 0.9.0.
- [Release notes](https://github.com/samuelcolvin/dirty-equals/releases)
- [Commits](https://github.com/samuelcolvin/dirty-equals/compare/v0.8.0...v0.9.0)

---
updated-dependencies:
- dependency-name: dirty-equals
  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>
2025-04-02 21:33:35 +02:00
github-actions
1d434dec47 📝 Update release notes
[skip ci]
2025-03-31 08:21:02 +00:00
Константин Рощупкин
cfdcad1dd2 🌐 Add Russian translation for docs/ru/docs/tutorial/header-param-models.md (#13526) 2025-03-31 10:20:29 +02:00
github-actions
921e2e5881 📝 Update release notes
[skip ci]
2025-03-31 08:16:36 +00:00
github-actions
4749ff586c 📝 Update release notes
[skip ci]
2025-03-31 08:16:12 +00:00
Zhongheng Cheng
94ae778082 🌐 Update Chinese translation for docs/zh/docs/tutorial/index.md (#13374) 2025-03-31 10:15:11 +02:00
Zhongheng Cheng
d0a247fc5a 🌐 Update Chinese translation for docs/zh/docs/deployment/manually.md (#13324) 2025-03-31 10:14:47 +02:00
github-actions
c5e2837e46 📝 Update release notes
[skip ci]
2025-03-31 08:13:40 +00:00
Zhongheng Cheng
396ca69603 🌐 Update Chinese translation for docs/zh/docs/deployment/server-workers.md (#13292) 2025-03-31 10:13:15 +02:00
github-actions
4db37fdf95 📝 Update release notes
[skip ci]
2025-03-30 19:23:55 +00:00
Blueswen
a49f69f074 ✏️ Fix talk information typo (#13544) 2025-03-30 21:23:32 +02:00
github-actions
b5bdc153a1 📝 Update release notes
[skip ci]
2025-03-26 14:39:00 +00:00
Sofie Van Landeghem
031622a989 🔧 Clean up docs/en/mkdocs.yml configuration file (#13542) 2025-03-26 15:38:36 +01:00
github-actions
c8a7552e29 📝 Update release notes
[skip ci]
2025-03-26 13:19:03 +00:00
pre-commit-ci[bot]
c12652b785 ⬆ [pre-commit.ci] pre-commit autoupdate (#12986)
* ⬆ [pre-commit.ci] pre-commit autoupdate

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

* also bump in doc requirements

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: svlandeg <svlandeg@github.com>
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
2025-03-26 14:18:42 +01:00
github-actions
b58c2a31ed 📝 Update release notes
[skip ci]
2025-03-24 21:10:05 +00:00
Zhongheng Cheng
f0d59e57f1 🌐 Update Chinese translation for docs/zh/docs/tutorial/first-steps.md (#13348) 2025-03-24 22:09:43 +01:00
github-actions
cbd7d4895b 📝 Update release notes
[skip ci]
2025-03-24 11:13:09 +00:00
Blueswen
d70f0ecec3 📝 Add External Link: Taiwanese talk on FastAPI with observability (#13527) 2025-03-24 12:12:43 +01:00
Sebastián Ramírez
628c34e0ca 🔖 Release version 0.115.12 2025-03-23 23:54:13 +01:00
github-actions
8e76d4e5f4 📝 Update release notes
[skip ci]
2025-03-23 20:49:19 +00:00
Sebastián Ramírez
2537d9d1c2 🐛 Fix convert_underscores=False for header Pydantic models (#13515) 2025-03-23 21:48:54 +01:00
github-actions
c08a3e8f22 📝 Update release notes
[skip ci]
2025-03-20 12:30:17 +00:00
Rishat-F
241de23b68 📝 Update docs/en/docs/tutorial/middleware.md (#13444)
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
2025-03-20 13:29:48 +01:00
github-actions
4e40e1e85d 📝 Update release notes
[skip ci]
2025-03-19 17:10:19 +00:00
Valentyn
ecf6e7eec2 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/metadata.md page (#13459) 2025-03-19 18:09:57 +01:00
github-actions
3afd733753 📝 Update release notes
[skip ci]
2025-03-19 17:04:51 +00:00
Valentyn
8557a88d16 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/response-status-code.md page (#13462) 2025-03-19 18:04:17 +01:00
github-actions
e4c1dd799d 📝 Update release notes
[skip ci]
2025-03-19 17:04:06 +00:00
github-actions
f977da6ae0 📝 Update release notes
[skip ci]
2025-03-19 17:03:40 +00:00
Valentyn
f077c17e1e 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/cookie-param-models.md page (#13460) 2025-03-19 18:03:38 +01:00
Valentyn
f9f1d93c58 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/header-param-models.md page (#13461) 2025-03-19 18:03:13 +01:00
github-actions
7e33df505a 📝 Update release notes
[skip ci]
2025-03-19 12:22:56 +00:00
k94-ishi
f806e03807 🌐 Add Japanese translation for docs/ja/docs/virtual-environments.md (#13304) 2025-03-19 13:22:33 +01:00
github-actions
90d52cfa16 📝 Update release notes
[skip ci]
2025-03-19 11:54:58 +00:00
dependabot[bot]
7ab1b9edcc ⬆ Bump pydantic-ai from 0.0.15 to 0.0.30 (#13438)
Bumps [pydantic-ai](https://github.com/pydantic/pydantic-ai) from 0.0.15 to 0.0.30.
- [Release notes](https://github.com/pydantic/pydantic-ai/releases)
- [Changelog](https://github.com/pydantic/pydantic-ai/blob/main/docs/message-history.md)
- [Commits](https://github.com/pydantic/pydantic-ai/compare/v0.0.15...v0.0.30)

---
updated-dependencies:
- dependency-name: pydantic-ai
  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>
2025-03-19 12:54:33 +01:00
github-actions
6859691419 📝 Update release notes
[skip ci]
2025-03-19 11:34:07 +00:00
Sebastián Ramírez
d3cfe72cd7 👥 Update FastAPI People - Experts (#13493)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-19 12:33:41 +01:00
github-actions
e988050f79 📝 Update release notes
[skip ci]
2025-03-10 12:29:25 +00:00
Lee Yesong
3565ea00b6 🌐 Add Korean translation for docs/ko/docs/tutorial/security/oauth2-jwt.md (#13333) 2025-03-10 13:29:03 +01:00
github-actions
643d2845de 📝 Update release notes
[skip ci]
2025-03-07 03:25:46 +00:00
dependabot[bot]
c46e4a1b14 ⬆ Bump sqlmodel from 0.0.22 to 0.0.23 (#13437)
Bumps [sqlmodel](https://github.com/fastapi/sqlmodel) from 0.0.22 to 0.0.23.
- [Release notes](https://github.com/fastapi/sqlmodel/releases)
- [Changelog](https://github.com/fastapi/sqlmodel/blob/main/docs/release-notes.md)
- [Commits](https://github.com/fastapi/sqlmodel/compare/0.0.22...0.0.23)

---
updated-dependencies:
- dependency-name: sqlmodel
  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>
2025-03-07 04:25:10 +01:00
github-actions
79bc28fab4 📝 Update release notes
[skip ci]
2025-03-07 03:25:02 +00:00
dependabot[bot]
a88a6050a6 ⬆ Bump black from 24.10.0 to 25.1.0 (#13436)
Bumps [black](https://github.com/psf/black) from 24.10.0 to 25.1.0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/24.10.0...25.1.0)

---
updated-dependencies:
- dependency-name: black
  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>
2025-03-07 04:24:42 +01:00
github-actions
0c36a7ac05 📝 Update release notes
[skip ci]
2025-03-07 03:24:33 +00:00
Phương Tấn Thành
a592e8ad4d 🌐 Add Vietnamese translation for docs/vi/docs/deployment/cloud.md (#13407)
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
Co-authored-by: Dinh Van Luc <39489075+MrL8199@users.noreply.github.com>
2025-03-07 04:24:13 +01:00
github-actions
daf6820307 📝 Update release notes
[skip ci]
2025-03-06 12:19:24 +00:00
dependabot[bot]
8c94e97c89 ⬆ Bump ruff to 0.9.4 (#13299)
* ⬆ Bump ruff from 0.6.4 to 0.9.4

Bumps [ruff](https://github.com/astral-sh/ruff) from 0.6.4 to 0.9.4.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.6.4...0.9.4)

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

Signed-off-by: dependabot[bot] <support@github.com>

* update pre-commit accordingly and make formatting changes

* 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks

---------

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>
Co-authored-by: svlandeg <sofie.vanlandeghem@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-03-06 13:18:57 +01:00
github-actions
ab22979dc5 📝 Update release notes
[skip ci]
2025-03-03 14:33:58 +00:00
Sebastián Ramírez
316566e40e 🔧 Update sponsors: pause TestDriven (#13446) 2025-03-03 15:33:33 +01:00
Sebastián Ramírez
3824664620 🔖 Release version 0.115.11 2025-03-01 23:14:01 +01:00
Sebastián Ramírez
a01ed2f6a7 📝 Update release notes 2025-03-01 23:13:11 +01:00
github-actions
a2c2e332a0 📝 Update release notes
[skip ci]
2025-03-01 22:02:59 +00:00
Sebastián Ramírez
74fe89bf35 🐛 Add docs examples and tests (support) for Annotated custom validations, like AfterValidator, revert #13440 (#13442)
This reverts commit 15dd2b67d3.
2025-03-01 22:02:35 +00:00
github-actions
f5056f84b6 📝 Update release notes
[skip ci]
2025-03-01 17:21:19 +00:00
github-actions
60f05868b7 📝 Update release notes
[skip ci]
2025-03-01 17:20:07 +00:00
github-actions
b7d3f2a96e 📝 Update release notes
[skip ci]
2025-03-01 17:19:45 +00:00
Sebastián Ramírez
ea57612d69 👥 Update FastAPI GitHub topic repositories (#13439)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-01 18:19:34 +01:00
Sebastián Ramírez
186544760a 👥 Update FastAPI People - Contributors and Translators (#13432)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-01 18:19:24 +01:00
Sebastián Ramírez
89e0c10547 👥 Update FastAPI People - Sponsors (#13433)
Co-authored-by: github-actions <github-actions@github.com>
2025-03-01 18:19:17 +01:00
github-actions
3fca8b2be8 📝 Update release notes
[skip ci]
2025-02-28 17:10:10 +00:00
alv2017
bb98f7df6d 🌐 Add Russian translation for docs/ru/docs/tutorial/middleware.md (#13412) 2025-02-28 18:09:29 +01:00
Sebastián Ramírez
a2644728f6 📝 Update release notes 2025-02-28 17:46:04 +01:00
Sebastián Ramírez
433837d9ca 🔖 Release version 0.115.10 2025-02-28 17:43:04 +01:00
github-actions
68074badcc 📝 Update release notes
[skip ci]
2025-02-28 15:15:29 +00:00
Victorien
15dd2b67d3 ♻️ Update internal annotation usage for compatibilty with Pydantic 2.11 (#13314)
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
Co-authored-by: svlandeg <svlandeg@github.com>
2025-02-28 16:15:02 +01:00
github-actions
45e018517b 📝 Update release notes
[skip ci]
2025-02-28 14:26:01 +00:00
github-actions
74954352ed 📝 Update release notes
[skip ci]
2025-02-28 14:24:48 +00:00
Valentyn
7c4d1fe13d 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/debugging.md (#13370)
Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Rostyslav <rostik1410@users.noreply.github.com>
2025-02-28 15:24:45 +01:00
Valentyn
23821e916b 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/query-params.md (#13362)
Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global>
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
2025-02-28 15:23:55 +01:00
github-actions
8bfec9fb6b 📝 Update release notes
[skip ci]
2025-02-28 14:23:04 +00:00
github-actions
5fbaf6d28c 📝 Update release notes
[skip ci]
2025-02-28 14:22:42 +00:00
Valentyn
ee729d4522 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/path-params.md (#13354)
Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global>
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>
2025-02-28 15:21:46 +01:00
k94-ishi
344d765796 🌐 Add Japanese translation for docs/ja/docs/tutorial/cookie-param-models.md (#13330) 2025-02-28 15:21:27 +01:00
github-actions
720dcc0990 📝 Update release notes
[skip ci]
2025-02-28 14:19:54 +00:00
github-actions
f9c8726a1a 📝 Update release notes
[skip ci]
2025-02-28 14:19:27 +00:00
Valentyn
c42c0d31b0 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/body-multiple-params.md (#13408)
Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global>
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>
2025-02-28 15:19:00 +01:00
k94-ishi
2cf2fee588 🌐 Add Japanese translation for docs/ja/docs/tutorial/query-param-models.md (#13323) 2025-02-28 15:18:46 +01:00
github-actions
7047e59f29 📝 Update release notes
[skip ci]
2025-02-28 14:18:36 +00:00
Valentyn
99ea5bb641 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/body-nested-models.md (#13409)
Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global>
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>
2025-02-28 15:18:01 +01:00
github-actions
34e03db068 📝 Update release notes
[skip ci]
2025-02-28 14:16:22 +00:00
github-actions
67e7c15701 📝 Update release notes
[skip ci]
2025-02-28 14:15:51 +00:00
Phương Tấn Thành
d5324fb5c3 🌐 Add Vietnamese translation for docs/vi/docs/deployment/versions.md (#13406)
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
2025-02-28 15:15:38 +01:00
Phương Tấn Thành
2d60add4e2 🌐 Add Vietnamese translation for docs/vi/docs/deployment/index.md (#13405)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-02-28 15:14:58 +01:00
github-actions
eb7cd4f693 📝 Update release notes
[skip ci]
2025-02-28 14:14:34 +00:00
Valentyn
f4b4b0b0f5 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/request-forms.md (#13383)
Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global>
Co-authored-by: Rostyslav <rostik1410@users.noreply.github.com>
2025-02-28 15:13:50 +01:00
github-actions
e992a2ec8b 📝 Update release notes
[skip ci]
2025-02-28 14:12:41 +00:00
Valentyn
29d3739bcf 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/testing.md (#13371)
Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Rostyslav <rostik1410@users.noreply.github.com>
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
2025-02-28 15:12:19 +01:00
github-actions
b78887f3d3 📝 Update release notes
[skip ci]
2025-02-28 14:08:09 +00:00
Ben Beasley
cc1f5de03c ⬆️ Bump Starlette to allow up to 0.46.0: >=0.40.0,<0.47.0 (#13426)
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
2025-02-28 15:07:47 +01:00
Sebastián Ramírez
d90030c1e2 🔖 Release version 0.115.9 2025-02-27 17:40:41 +01:00
github-actions
3639fb00be 📝 Update release notes
[skip ci]
2025-02-27 14:43:04 +00:00
alv2017
7eabff43de Fix a minor bug in the test tests/test_modules_same_name_body/test_main.py (#13411) 2025-02-27 15:42:41 +01:00
github-actions
a27fb4764b 📝 Update release notes
[skip ci]
2025-02-27 14:40:09 +00:00
Sebastián Ramírez
7710a34800 🍱 Update sponsors: CodeRabbit logo (#13424) 2025-02-27 15:39:48 +01:00
github-actions
6320832178 📝 Update release notes
[skip ci]
2025-02-27 13:06:50 +00:00
Joakim Nordling
26f27982ac 👷 Use wrangler-action v3 (#13415) 2025-02-27 14:06:27 +01:00
github-actions
d974fbdda0 📝 Update release notes
[skip ci]
2025-02-27 12:29:47 +00:00
Arthur Rio
ccc7c8fef9 🐛 Ensure that HTTPDigest only raises an exception when auto_error is True (#2939)
Co-authored-by: svlandeg <sofie.vanlandeghem@gmail.com>
2025-02-27 13:29:20 +01:00
github-actions
b021569913 📝 Update release notes
[skip ci]
2025-02-22 22:03:09 +00:00
Valentyn
48676b4f11 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/header-params.md (#13381) 2025-02-22 22:02:19 +00:00
github-actions
b1102e2388 📝 Update release notes
[skip ci]
2025-02-22 22:02:06 +00:00
Valentyn
31920eff62 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/request-files.md (#13395) 2025-02-22 22:01:44 +00:00
github-actions
4516a48c7c 📝 Update release notes
[skip ci]
2025-02-21 11:36:43 +00:00
Sofie Van Landeghem
f8878f3a98 🩺 Unify the badges across all tutorial translations (#13329)
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
2025-02-20 21:53:18 +01:00
github-actions
5c8fa58fd0 📝 Update release notes
[skip ci]
2025-02-20 17:49:39 +00:00
Sebastián Ramírez
987d2f9a92 🔧 Update sponsors: add CodeRabbit (#13402) 2025-02-20 18:49:13 +01:00
github-actions
920110276a 📝 Update release notes
[skip ci]
2025-02-20 14:16:32 +00:00
Valentyn
b397ad9e52 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/request-form-models.md (#13384) 2025-02-20 14:16:09 +00:00
github-actions
498ba94bfc 📝 Update release notes
[skip ci]
2025-02-20 14:14:07 +00:00
Valentyn
6ebe753908 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/request-forms-and-files.md (#13386) 2025-02-20 14:13:44 +00:00
github-actions
3aee64b94f 📝 Update release notes
[skip ci]
2025-02-20 14:09:37 +00:00
Aman Kumar
001473ab66 📝 Fix typos in virtual environments documentation (#13396) 2025-02-20 14:09:14 +00:00
github-actions
8c9c536c0a 📝 Update release notes
[skip ci]
2025-02-18 18:44:23 +00:00
Sebastián Ramírez
70137c0f7d 🔧 Update team: Add Ludovico (#13390) 2025-02-18 19:44:00 +01:00
github-actions
286fd694ea 📝 Update release notes
[skip ci]
2025-02-18 16:52:41 +00:00
Hyogeun Oh (오효근)
e157cf4b96 🐛 Fix issue with Swagger theme change example in the official tutorial (#13289) 2025-02-18 17:52:15 +01:00
github-actions
235300c1d2 📝 Update release notes
[skip ci]
2025-02-18 15:18:42 +00:00
Sebastián Ramírez
c868581ce7 🔧 Update sponsors: Add LambdaTest (#13389) 2025-02-18 15:18:14 +00:00
github-actions
7e67a91b08 📝 Update release notes
[skip ci]
2025-02-15 16:33:58 +00:00
Haoyu (Daniel) YANG 杨浩宇
e24299b2ff 📝 Add more precise description of HTTP status code range in docs (#13347) 2025-02-15 17:33:33 +01:00
github-actions
e24a500292 📝 Update release notes
[skip ci]
2025-02-15 16:32:36 +00:00
alv2017
5451d05bc8 Simplify tests for query_params_str_validations (#13218)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
2025-02-15 17:31:57 +01:00
github-actions
2b3b416122 📝 Update release notes
[skip ci]
2025-02-15 16:28:29 +00:00
Sebastián Ramírez
08b817a842 🔥 Remove manual type annotations in JWT tutorial to avoid typing expectations (JWT doesn't provide more types) (#13378) 2025-02-15 17:28:09 +01:00
github-actions
2e788bbbdc 📝 Update release notes
[skip ci]
2025-02-15 16:24:24 +00:00
Sebastián Ramírez
9ec452a154 📝 Update docs for Query Params and String Validations, remove obsolete Ellipsis docs (...) (#13377) 2025-02-15 17:23:59 +01:00
github-actions
2c937aabef 📝 Update release notes
[skip ci]
2025-02-15 14:43:05 +00:00
alv2017
f6872dd298 Simplify tests for app_testing (#13220)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
2025-02-15 15:42:41 +01:00
github-actions
cbd7b986e7 📝 Update release notes
[skip ci]
2025-02-15 14:38:14 +00:00
alv2017
1e6d95ce6d Simplify tests for dependency_testing (#13223)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
2025-02-15 14:37:48 +00:00
github-actions
540d8ff398 📝 Update release notes
[skip ci]
2025-02-15 11:43:16 +00:00
Haoyu (Daniel) YANG 杨浩宇
261bc2d387 ✏️ Remove duplicate title in docs body-multiple-params (#13345) 2025-02-15 11:42:54 +00:00
github-actions
db554ca094 📝 Update release notes
[skip ci]
2025-02-15 11:38:21 +00:00
Hyogeun Oh (오효근)
ac893a4446 🌐 Update Korean translation for docs/ko/docs/help-fastapi.md (#13262) 2025-02-15 11:37:58 +00:00
github-actions
b81d29fc00 📝 Update release notes
[skip ci]
2025-02-15 11:23:13 +00:00
dependabot[bot]
10a13d05c4 ⬆ Bump cloudflare/wrangler-action from 3.13 to 3.14 (#13350)
Bumps [cloudflare/wrangler-action](https://github.com/cloudflare/wrangler-action) from 3.13 to 3.14.
- [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.13...v3.14)

---
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>
2025-02-15 11:22:43 +00:00
github-actions
d51936754d 📝 Update release notes
[skip ci]
2025-02-15 11:21:51 +00:00
11kkw
030012bf4c 🌐 Add Korean translation for docs/ko/docs/advanced/custom-response.md (#13265) 2025-02-15 11:21:20 +00:00
github-actions
fc94d904c9 📝 Update release notes
[skip ci]
2025-02-15 11:19:48 +00:00
Lee Yesong (이예송)
39b4692525 🌐 Update Korean translation for docs/ko/docs/tutorial/security/simple-oauth2.md (#13335) 2025-02-15 11:19:12 +00:00
github-actions
15afe2e301 📝 Update release notes
[skip ci]
2025-02-15 11:15:45 +00:00
ScrollDude
03b24b5a52 🌐 Add Russian translation for docs/ru/docs/advanced/response-cookies.md (#13327) 2025-02-15 11:15:23 +00:00
github-actions
3aeaa0a6a8 📝 Update release notes
[skip ci]
2025-02-15 11:08:48 +00:00
Phương Tấn Thành
5cbb81cc26 🌐 Add Vietnamese translation for docs/vi/docs/tutorial/static-files.md (#11291) 2025-02-15 11:08:22 +00:00
github-actions
eea196f4a5 📝 Update release notes
[skip ci]
2025-02-10 11:19:36 +00:00
Emil Sadek
126a9b33c9 📝 Fix test badge (#13313)
* Fix test badge

* Fix test badge in docs

---------

Co-authored-by: Emil Sadek <esadek@users.noreply.github.com>
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
2025-02-10 12:18:47 +01:00
github-actions
57a9a64435 📝 Update release notes
[skip ci]
2025-02-09 14:54:33 +00:00
11kkw
ad33193f2c 🌐 Add Korean translation for docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md (#13257) 2025-02-09 14:54:09 +00:00
github-actions
c6c45ae488 📝 Update release notes
[skip ci]
2025-02-07 22:27:05 +00:00
github-actions
828079cb6e 📝 Update release notes
[skip ci]
2025-02-07 22:25:56 +00:00
github-actions
4740ccdcce 📝 Update release notes
[skip ci]
2025-02-07 22:25:02 +00:00
github-actions
49b18c87a0 📝 Update release notes
[skip ci]
2025-02-07 22:24:04 +00:00
github-actions
42a3b1526e 📝 Update release notes
[skip ci]
2025-02-07 22:23:11 +00:00
dependabot[bot]
83332ff9b2 ⬆ Bump mkdocs-material from 9.5.18 to 9.6.1 (#13301)
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.5.18 to 9.6.1.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.5.18...9.6.1)

---
updated-dependencies:
- dependency-name: mkdocs-material
  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>
2025-02-07 22:22:54 +00:00
dependabot[bot]
8cde8dc2a9 ⬆ Bump pillow from 11.0.0 to 11.1.0 (#13300)
Bumps [pillow](https://github.com/python-pillow/Pillow) from 11.0.0 to 11.1.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/11.0.0...11.1.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>
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
2025-02-07 22:22:35 +00:00
Phương Tấn Thành
e86ef5e57d 🌐 Add Vietnamese translation for docs/vi/docs/virtual-environments.md (#13282) 2025-02-07 22:19:18 +00:00
github-actions
8a6d81afad 📝 Update release notes
[skip ci]
2025-02-07 22:17:59 +00:00
Valentyn
f9352c18de 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/static-files.md (#13285) 2025-02-07 22:17:53 +00:00
Phương Tấn Thành
38d409dd67 🌐 Add Vietnamese translation for docs/vi/docs/environment-variables.md (#13287) 2025-02-07 22:17:13 +00:00
Sebastián Ramírez
e814707cd1 👥 Update FastAPI People - Sponsors (#13295)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-07 22:15:49 +00:00
github-actions
640a5b6fc3 📝 Update release notes
[skip ci]
2025-02-07 22:14:11 +00:00
github-actions
6e8da9d00a 📝 Update release notes
[skip ci]
2025-02-07 22:13:23 +00:00
github-actions
25ee2357d7 📝 Update release notes
[skip ci]
2025-02-07 22:12:00 +00:00
github-actions
27d0ccc11c 📝 Update release notes
[skip ci]
2025-02-07 22:11:28 +00:00
Sebastián Ramírez
b6b031b456 👥 Update FastAPI People - Experts (#13303)
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
2025-02-07 22:10:51 +00:00
Sebastián Ramírez
495ff5baa9 👥 Update FastAPI GitHub topic repositories (#13302)
Co-authored-by: github-actions <github-actions@github.com>
2025-02-07 22:10:37 +00:00
Sebastián Ramírez
50b307c9f6 👥 Update FastAPI People - Contributors and Translators (#13293)
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
2025-02-07 22:10:25 +00:00
github-actions
2bb94fb90b 📝 Update release notes
[skip ci]
2025-02-07 22:09:51 +00:00
Phương Tấn Thành
2d7d5dafb0 🌐 Add Vietnamese translation for docs/vi/docs/fastapi-cli.md (#13294) 2025-02-07 22:09:16 +00:00
Valentyn
701f5791d3 🌐 Add Ukrainian translation for docs/uk/docs/features.md (#13308) 2025-02-07 22:08:49 +00:00
github-actions
eee8d4c58a 📝 Update release notes
[skip ci]
2025-02-07 22:07:12 +00:00
Valentyn
0c24d0607b 🌐 Add Ukrainian translation for docs/uk/docs/learn/index.md (#13306) 2025-02-07 22:06:37 +00:00
github-actions
f97c8de41a 📝 Update release notes
[skip ci]
2025-02-07 22:04:25 +00:00
João Pedro
52c1488a37 🌐 Update Portuguese Translation for docs/pt/docs/deployment/https.md (#13317) 2025-02-07 22:02:59 +00:00
github-actions
3958e5a113 📝 Update release notes
[skip ci]
2025-02-07 22:02:19 +00:00
Rafael de Oliveira Marques
fb19d9895d 🌐 Update Portuguese Translation for docs/pt/docs/index.md (#13328) 2025-02-07 22:01:55 +00:00
github-actions
ae724b05ce 📝 Update release notes
[skip ci]
2025-02-03 13:51:28 +00:00
dependabot[bot]
c73e895b86 ⬆ Bump inline-snapshot from 0.18.1 to 0.19.3 (#13298)
Bumps [inline-snapshot](https://github.com/15r10nk/inline-snapshot) from 0.18.1 to 0.19.3.
- [Release notes](https://github.com/15r10nk/inline-snapshot/releases)
- [Changelog](https://github.com/15r10nk/inline-snapshot/blob/main/CHANGELOG.md)
- [Commits](https://github.com/15r10nk/inline-snapshot/compare/0.18.1...0.19.3)

---
updated-dependencies:
- dependency-name: inline-snapshot
  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>
2025-02-03 13:51:01 +00:00
github-actions
0310af3557 📝 Update release notes
[skip ci]
2025-02-03 13:34:01 +00:00
Rishat-F
633ed1d8af 🌐 Add Russian translation for docs/ru/docs/advanced/websockets.md (#13279) 2025-02-03 13:33:39 +00:00
github-actions
133fe8170a 📝 Update release notes
[skip ci]
2025-01-31 17:02:11 +00:00
Sebastián Ramírez
df8f281674 🔧 Update sponsors, add Permit (#13288) 2025-01-31 17:01:48 +00:00
Sebastián Ramírez
7128971f1d 🔖 Release version 0.115.8 2025-01-30 13:58:14 +00:00
github-actions
55f8a446c7 📝 Update release notes
[skip ci]
2025-01-30 12:23:00 +00:00
timothy
83ab6ac957 📝 Change the word "unwrap" to "unpack" in docs/en/docs/tutorial/extra-models.md (#13061)
Co-authored-by: timothy <53824764+jts8257@users.noreply.github.com>
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
2025-01-30 12:21:44 +00:00
github-actions
3d02a920ab 📝 Update release notes
[skip ci]
2025-01-30 12:20:24 +00:00
Alejandra
1b00f8ae78 Simplify tests for body_multiple_params (#13237)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-01-30 12:20:01 +00:00
github-actions
d97647fd57 📝 Update release notes
[skip ci]
2025-01-30 12:19:41 +00:00
Ysabel
9667ce87a9 📝 Update Request Body's tutorial002 to deal with tax=0 case (#13230)
Co-authored-by: svlandeg <svlandeg@github.com>
2025-01-30 12:19:10 +00:00
github-actions
0541693bc7 📝 Update release notes
[skip ci]
2025-01-30 12:17:52 +00:00
github-actions
041b2e1c46 📝 Update release notes
[skip ci]
2025-01-30 12:17:34 +00:00
Shahriyar Rzayev
30b270be9a ♻️ Move duplicated code portion to a static method in the APIKeyBase super class (#3142)
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
Co-authored-by: svlandeg <svlandeg@github.com>
2025-01-30 12:17:20 +00:00
Rahul Pai
d5ecbaceae 🐛 Fix OAuth2PasswordRequestForm and OAuth2PasswordRequestFormStrict fixed grant_type "password" RegEx (#9783)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
Co-authored-by: svlandeg <svlandeg@github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-01-30 12:17:09 +00:00
github-actions
43d9a4d2b1 📝 Update release notes
[skip ci]
2025-01-30 12:04:59 +00:00
Alejandra
c5b5af7c53 Simplify tests for request_files (#13182)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-01-30 12:04:34 +00:00
github-actions
887270ff8a 📝 Update release notes
[skip ci]
2025-01-29 18:02:50 +00:00
Sebastián Ramírez
bd106fc750 ⬆️ Add support for Python 3.13 (#13274)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-01-29 18:02:27 +00:00
github-actions
eab0653a34 📝 Update release notes
[skip ci]
2025-01-28 23:35:44 +00:00
Sebastián Ramírez
8c6f10b64a ⬆️ Upgrade AnyIO max version for tests, new range: >=3.2.1,<5.0.0 (#13273) 2025-01-28 23:35:19 +00:00
github-actions
93e9fed2e8 📝 Update release notes
[skip ci]
2025-01-28 22:36:38 +00:00
Sebastián Ramírez
e747f1938a 🔧 Update Sponsors badges (#13271) 2025-01-28 22:36:15 +00:00
github-actions
92b745461c 📝 Update release notes
[skip ci]
2025-01-28 22:30:38 +00:00
Sebastián Ramírez
0a2b24653b ♻️ Fix notify_translations.py empty env var handling for PR label events vs workflow_dispatch (#13272) 2025-01-28 22:30:15 +00:00
github-actions
a058d8ecbc 📝 Update release notes
[skip ci]
2025-01-28 21:47:55 +00:00
Sebastián Ramírez
326fec16b9 ♻️ Refactor and move scripts/notify_translations.py, no need for a custom GitHub Action (#13270)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-01-28 21:47:33 +00:00
github-actions
8525b879ed 📝 Update release notes
[skip ci]
2025-01-28 20:41:36 +00:00
Sebastián Ramírez
3da797aeb8 👥 Update FastAPI People - Experts (#13269)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-28 20:41:08 +00:00
github-actions
e925c0ec8e 📝 Update release notes
[skip ci]
2025-01-28 20:35:19 +00:00
Sebastián Ramírez
ff68d0894a 🔨 Update FastAPI People Experts script, refactor and optimize data fetching to handle rate limits (#13267) 2025-01-28 20:34:56 +00:00
github-actions
d2f5097ded 📝 Update release notes
[skip ci]
2025-01-27 15:39:30 +00:00
k94-ishi
8f359273b5 🌐 Add Japanese translation for docs/ja/docs/environment-variables.md (#13226) 2025-01-27 15:39:04 +00:00
github-actions
18127b7907 📝 Update release notes
[skip ci]
2025-01-27 15:36:36 +00:00
Rishat-F
24eb8eeeba 🌐 Add Russian translation for docs/ru/docs/advanced/async-tests.md (#13227) 2025-01-27 15:36:13 +00:00
github-actions
1e44825ef2 📝 Update release notes
[skip ci]
2025-01-24 19:44:54 +00:00
Rishat-F
998a9139d3 🌐 Update Russian translation for docs/ru/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md (#13252) 2025-01-24 19:44:31 +00:00
github-actions
6bbd315f3e 📝 Update release notes
[skip ci]
2025-01-24 17:05:37 +00:00
dependabot[bot]
0e2d8d64a4 ⬆ Bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4 (#13251)
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.12.3 to 1.12.4.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.12.3...v1.12.4)

---
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>
2025-01-24 17:05:11 +00:00
github-actions
b6f6818d76 📝 Update release notes
[skip ci]
2025-01-23 09:47:05 +00:00
alv2017
4d60022c88 🌐 Add Russian translation for docs/ru/docs/tutorial/bigger-applications.md (#13154) 2025-01-23 09:46:41 +00:00
Sebastián Ramírez
fe513719ea 🔖 Release version 0.115.7 2025-01-22 22:50:29 +00:00
Sebastián Ramírez
7183f0d683 📝 Update release notes 2025-01-22 22:48:57 +00:00
github-actions
2b6f63df71 📝 Update release notes
[skip ci]
2025-01-22 18:25:24 +00:00
johnthagen
abd05a6d30 🔧 Add Pydantic 2 trove classifier (#13199) 2025-01-22 18:24:58 +00:00
github-actions
e39143d56d 📝 Update release notes
[skip ci]
2025-01-22 18:24:12 +00:00
Daniel Kusy
49e82ed2ac ⬆️ Upgrade python-multipart to >=0.0.18 (#13219) 2025-01-22 18:23:13 +00:00
github-actions
91c05b9245 📝 Update release notes
[skip ci]
2025-01-22 18:22:02 +00:00
Marcelo Trylesinski
82c74789e8 ⬆️ Bump Starlette to allow up to 0.45.0: >=0.40.0,<0.46.0 (#13117) 2025-01-22 18:21:40 +00:00
github-actions
1a38cc506e 📝 Update release notes
[skip ci]
2025-01-22 18:03:00 +00:00
Daniel Kusy
548f67d465 ⬆️ Upgrade jinja2 to >=3.1.5 (#13194) 2025-01-22 18:02:36 +00:00
github-actions
a215687c98 📝 Update release notes
[skip ci]
2025-01-22 13:42:19 +00:00
João Pedro
8fa18e5e6f 🌐 Update Portuguese Translation for docs/pt/docs/tutorial/request-forms.md (#13216) 2025-01-22 13:41:56 +00:00
github-actions
6ba09082a0 📝 Update release notes
[skip ci]
2025-01-19 22:41:00 +00:00
Alejandra
280fe73c03 Simplify tests for websockets (#13202) 2025-01-19 22:40:39 +00:00
github-actions
9f3edbf537 📝 Update release notes
[skip ci]
2025-01-19 22:39:42 +00:00
Alejandra
182c28e57a Simplify tests for request_form_models (#13183)
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
2025-01-19 22:39:18 +00:00
github-actions
b5e40a6233 📝 Update release notes
[skip ci]
2025-01-19 22:37:13 +00:00
Alejandra
39698df806 Simplify tests for separate_openapi_schemas (#13201)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-01-19 22:36:49 +00:00
github-actions
6d51389f75 📝 Update release notes
[skip ci]
2025-01-19 22:36:07 +00:00
Alejandra
2007993433 Simplify tests for security (#13200) 2025-01-19 22:35:40 +00:00
github-actions
818eb1f365 📝 Update release notes
[skip ci]
2025-01-19 22:31:13 +00:00
Alejandra
3e12918325 Simplify tests for schema_extra_example (#13197)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-01-19 22:30:50 +00:00
github-actions
2c83a11a7d 📝 Update release notes
[skip ci]
2025-01-19 06:58:12 +00:00
Alejandra
081901cc99 Simplify tests for request_model (#13195) 2025-01-19 06:57:50 +00:00
github-actions
0069963bba 📝 Update release notes
[skip ci]
2025-01-19 06:43:44 +00:00
Alejandra
d309c9e140 Simplify tests for request_forms_and_files (#13185)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-01-19 06:43:21 +00:00
github-actions
9847cecf6f 📝 Update release notes
[skip ci]
2025-01-19 06:42:49 +00:00
Alejandra
c7d888a15f Simplify tests for request_forms (#13184) 2025-01-19 06:42:25 +00:00
github-actions
96808fd44f 📝 Update release notes
[skip ci]
2025-01-19 06:35:11 +00:00
Alejandra
09ccfce228 Simplify tests for path_query_params (#13181) 2025-01-19 06:34:48 +00:00
github-actions
ec46247595 📝 Update release notes
[skip ci]
2025-01-19 06:33:35 +00:00
Alejandra
2e8db846b4 Simplify tests for path_operation_configurations (#13180)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-01-19 06:33:10 +00:00
github-actions
b123c5c489 📝 Update release notes
[skip ci]
2025-01-19 06:32:34 +00:00
Alejandra
aa60185781 Simplify tests for header_params (#13179) 2025-01-19 06:32:11 +00:00
github-actions
d704f94cf0 📝 Update release notes
[skip ci]
2025-01-19 06:29:54 +00:00
Alejandra
3d017824ba Simplify tests for extra_models (#13178) 2025-01-19 06:29:33 +00:00
github-actions
ae93ec140a 📝 Update release notes
[skip ci]
2025-01-19 06:28:31 +00:00
Alejandra
8015f832d4 Simplify tests for extra_data_types (#13177) 2025-01-19 06:28:09 +00:00
github-actions
cd521dff74 📝 Update release notes
[skip ci]
2025-01-19 06:27:16 +00:00
Alejandra
736712173a Simplify tests for cookie_params (#13176) 2025-01-19 06:26:50 +00:00
github-actions
409a850c6c 📝 Update release notes
[skip ci]
2025-01-19 06:26:10 +00:00
Alejandra
920df4d1ac Simplify tests for dependencies (#13174) 2025-01-19 06:25:51 +00:00
github-actions
c0fddaa9a9 📝 Update release notes
[skip ci]
2025-01-19 06:21:52 +00:00
Alejandra
0a882e926e Simplify tests for body_updates (#13172) 2025-01-19 06:21:30 +00:00
github-actions
f30dd4fe40 📝 Update release notes
[skip ci]
2025-01-19 06:21:05 +00:00
Alejandra
55ef9270b8 Simplify tests for body_nested_models (#13171) 2025-01-19 06:20:41 +00:00
github-actions
4191f4d33a 📝 Update release notes
[skip ci]
2025-01-19 06:20:23 +00:00
Alejandra
1cedd8becf Simplify tests for body_multiple_params (#13170) 2025-01-19 06:19:58 +00:00
github-actions
7e06c4c97f 📝 Update release notes
[skip ci]
2025-01-18 13:10:40 +00:00
Sebastián Ramírez
af599c92ac 👥 Update FastAPI People - Sponsors (#13231)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-18 13:10:13 +00:00
github-actions
2acdc13608 📝 Update release notes
[skip ci]
2025-01-18 12:58:57 +00:00
Sebastián Ramírez
2ee101fb81 👷 Refactor FastAPI People Sponsors to use 2 tokens (#13228) 2025-01-18 12:58:36 +00:00
github-actions
ea0cdd120c 📝 Update release notes
[skip ci]
2025-01-17 22:34:04 +00:00
Sebastián Ramírez
35b24deef3 👷 Update token for FastAPI People - Sponsors (#13225) 2025-01-17 22:33:38 +00:00
github-actions
db48d9cf09 📝 Update release notes
[skip ci]
2025-01-17 17:53:06 +00:00
Sebastián Ramírez
9e0d4fa0ef 👷 Add independent CI automation for FastAPI People - Sponsors (#13221) 2025-01-17 17:51:19 +00:00
github-actions
e773d7e919 📝 Update release notes
[skip ci]
2025-01-15 20:18:49 +00:00
Rafael de Oliveira Marques
d9a640e06c 🌐 Update Portuguese translation for docs/pt/docs/advanced/settings.md (#13209) 2025-01-15 20:17:23 +00:00
github-actions
5f49397d19 📝 Update release notes
[skip ci]
2025-01-15 20:16:38 +00:00
Rafael de Oliveira Marques
16199c4a13 🌐 Add Portuguese translation for docs/pt/docs/tutorial/security/oauth2-jwt.md (#13205) 2025-01-15 20:16:13 +00:00
github-actions
2612fa3e9d 📝 Update release notes
[skip ci]
2025-01-13 13:36:46 +00:00
Gerry Sabar
5d18ae0d90 🌐 Add Indonesian translation for docs/id/docs/index.md (#13191) 2025-01-13 13:36:23 +00:00
github-actions
09a0295bf3 📝 Update release notes
[skip ci]
2025-01-10 20:31:39 +00:00
Guspan Tanadi
cda85623fb 🌐 Add Indonesian translation for docs/id/docs/tutorial/static-files.md (#13092) 2025-01-10 20:31:13 +00:00
github-actions
62be4a1600 📝 Update release notes
[skip ci]
2025-01-10 13:33:58 +00:00
Rafael de Oliveira Marques
e69182940e 🌐 Add Portuguese translation for docs/pt/docs/tutorial/security/get-current-user.md (#13188) 2025-01-10 13:33:35 +00:00
github-actions
f36927d0a6 📝 Update release notes
[skip ci]
2025-01-10 13:33:14 +00:00
Rafael de Oliveira Marques
e54cc8ffa3 🌐 Remove Wrong Portuguese translations location for docs/pt/docs/advanced/benchmarks.md (#13187) 2025-01-10 13:32:37 +00:00
github-actions
837e94573d 📝 Update release notes
[skip ci]
2025-01-09 20:41:29 +00:00
nillvitor
9d293b7086 🌐 Update Portuguese translations (#13156) 2025-01-09 20:41:07 +00:00
github-actions
3d2ef237ed 📝 Update release notes
[skip ci]
2025-01-08 19:29:11 +00:00
Alejandra
9b88c7c18a Simplify tests for body_fields (#13169) 2025-01-08 20:28:44 +01:00
github-actions
fe4b25e2d7 📝 Update release notes
[skip ci]
2025-01-08 19:26:39 +00:00
Alejandra
0cc031f477 Simplify tests for body (#13168) 2025-01-08 20:26:16 +01:00
github-actions
a8447c15e5 📝 Update release notes
[skip ci]
2025-01-08 19:25:29 +00:00
Alejandra
5d3f45c2d4 Simplify tests for bigger_applications (#13167) 2025-01-08 20:25:01 +01:00
github-actions
afd1502283 📝 Update release notes
[skip ci]
2025-01-08 19:24:05 +00:00
Alejandra
44adb29ce1 Simplify tests for background_tasks (#13166) 2025-01-08 20:23:42 +01:00
github-actions
144f09ea14 📝 Update release notes
[skip ci]
2025-01-06 18:27:10 +00:00
Yaroslav Luchinsky
4cd5a7ac1c 🌐 Update Russian translation for docs/ru/docs/tutorial/security/first-steps.md (#13159) 2025-01-06 18:26:39 +00:00
github-actions
d7bd68979f 📝 Update release notes
[skip ci]
2025-01-06 11:24:40 +00:00
Kinuax
b0e70cb37e ✏️ Update Strawberry integration docs (#13155) 2025-01-06 11:24:17 +00:00
github-actions
6e60d0a056 📝 Update release notes
[skip ci]
2025-01-05 14:45:08 +00:00
Alejandra
d784a90207 🔥 Remove unused Peewee tutorial files (#13158) 2025-01-05 14:44:44 +00:00
github-actions
924c96bf90 📝 Update release notes
[skip ci]
2025-01-04 10:54:27 +00:00
FakeDocument
dace29835c ✏️ Delete unnecessary backspace in docs/ja/docs/tutorial/path-params-numeric-validations.md (#12238) 2025-01-04 10:53:58 +00:00
github-actions
c99b945d87 📝 Update release notes
[skip ci]
2025-01-04 00:26:56 +00:00
Sebastián Ramírez
f229dd97c0 👷 Add retries to Smokeshow (#13151) 2025-01-04 00:26:30 +00:00
github-actions
023bc01967 📝 Update release notes
[skip ci]
2025-01-03 21:29:28 +00:00
Chai Landau
083c6dd481 🔧 Update Speakeasy sponsor graphic (#13147) 2025-01-03 21:29:07 +00:00
github-actions
cf4dfcbd59 📝 Update release notes
[skip ci]
2025-01-03 18:29:01 +00:00
Hamza Kyamanywa
8416e3ee23 📝 Update image in body-nested-model docs (#11063) 2025-01-03 18:28:35 +00:00
github-actions
01a1fc8d15 📝 Update release notes
[skip ci]
2025-01-03 16:26:28 +00:00
Zhongheng Cheng
87fb46bcac 📝 Update fastapi-cli UI examples in docs (#13107) 2025-01-03 16:26:01 +00:00
github-actions
91738b5ae7 📝 Update release notes
[skip ci]
2025-01-03 16:17:14 +00:00
Zhongheng Cheng
27c700a6d3 🌐 Update Chinese translation for docs/zh/docs/fastapi-cli.md (#13102) 2025-01-03 16:16:52 +00:00
github-actions
9eb712802e 📝 Update release notes
[skip ci]
2025-01-03 09:48:22 +00:00
Sebastián Ramírez
994340f839 Simplify tests for additional_status_codes (#13149) 2025-01-03 09:47:55 +00:00
github-actions
4f04377270 📝 Update release notes
[skip ci]
2025-01-02 21:01:23 +00:00
Sebastián Ramírez
ccae0c0cb9 👥 Update FastAPI GitHub topic repositories (#13146)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-02 21:00:17 +00:00
github-actions
aa27afdb24 📝 Update release notes
[skip ci]
2025-01-02 20:45:12 +00:00
Alejandra
1b8f823a05 👷‍♀️ Add script for GitHub Topic Repositories and update External Links (#13135)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2025-01-02 20:44:50 +00:00
github-actions
548dd233c3 📝 Update release notes
[skip ci]
2025-01-02 17:22:51 +00:00
Sebastián Ramírez
2d210f7313 👥 Update FastAPI People - Contributors and Translators (#13145)
Co-authored-by: github-actions <github-actions@github.com>
2025-01-02 17:22:30 +00:00
github-actions
af7db9b95d 📝 Update release notes
[skip ci]
2025-01-02 17:03:46 +00:00
Sebastián Ramírez
b59885c9d5 👷 Add new GitHub Action to update contributors, translators, and translation reviewers (#13136) 2025-01-02 17:03:21 +00:00
github-actions
dd649ff814 📝 Update release notes
[skip ci]
2025-01-01 17:27:23 +00:00
dependabot[bot]
274d3d9bd0 ⬆ Bump markdown-include-variants from 0.0.3 to 0.0.4 (#13129)
Bumps [markdown-include-variants](https://github.com/tiangolo/markdown-include-variants) from 0.0.3 to 0.0.4.
- [Release notes](https://github.com/tiangolo/markdown-include-variants/releases)
- [Changelog](https://github.com/tiangolo/markdown-include-variants/blob/main/release-notes.md)
- [Commits](https://github.com/tiangolo/markdown-include-variants/compare/0.0.3...0.0.4)

---
updated-dependencies:
- dependency-name: markdown-include-variants
  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>
2025-01-01 17:26:52 +00:00
github-actions
ad294d4d1e 📝 Update release notes
[skip ci]
2025-01-01 17:19:34 +00:00
dependabot[bot]
55ba3220f8 ⬆ Bump inline-snapshot from 0.14.0 to 0.18.1 (#13132)
Bumps [inline-snapshot](https://github.com/15r10nk/inline-snapshot) from 0.14.0 to 0.18.1.
- [Release notes](https://github.com/15r10nk/inline-snapshot/releases)
- [Changelog](https://github.com/15r10nk/inline-snapshot/blob/main/CHANGELOG.md)
- [Commits](https://github.com/15r10nk/inline-snapshot/compare/v0.14.0...0.18.1)

---
updated-dependencies:
- dependency-name: inline-snapshot
  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>
2025-01-01 17:19:08 +00:00
github-actions
05b62724e0 📝 Update release notes
[skip ci]
2025-01-01 17:18:48 +00:00
dependabot[bot]
324c3ba095 ⬆ Bump mkdocs-macros-plugin from 1.0.5 to 1.3.7 (#13133)
Bumps [mkdocs-macros-plugin](https://github.com/fralau/mkdocs_macros_plugin) from 1.0.5 to 1.3.7.
- [Release notes](https://github.com/fralau/mkdocs_macros_plugin/releases)
- [Changelog](https://github.com/fralau/mkdocs-macros-plugin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fralau/mkdocs_macros_plugin/compare/v1.0.5...v1.3.7)

---
updated-dependencies:
- dependency-name: mkdocs-macros-plugin
  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>
2025-01-01 17:18:26 +00:00
github-actions
1d50bad455 📝 Update release notes
[skip ci]
2024-12-30 19:00:23 +00:00
Sebastián Ramírez
db9da09f72 ✏️ Fix typo in docs/en/docs/virtual-environments.md (#13124) 2024-12-30 18:59:59 +00:00
github-actions
d4b6f1d1f6 📝 Update release notes
[skip ci]
2024-12-30 18:47:07 +00:00
Sebastián Ramírez
acd9c4e1aa 🔨 Add internal scripts to generate language translations with PydanticAI, include Spanish prompt (#13123) 2024-12-30 18:46:43 +00:00
github-actions
e2f6e5f6fc 📝 Update release notes
[skip ci]
2024-12-30 18:28:14 +00:00
Sebastián Ramírez
fe5b2e491e 🌐 Add new Spanish translations for all docs with new LLM-assisted system using PydanticAI (#13122)
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: User <alejsdev@gmail.com>
2024-12-30 18:26:57 +00:00
github-actions
a6afa805cd 📝 Update release notes
[skip ci]
2024-12-30 17:47:07 +00:00
Sebastián Ramírez
495460d3ed 🌐 Update existing Spanish translations using the new LLM-assisted system using PydanticAI (#13118)
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
2024-12-30 17:46:44 +00:00
github-actions
d88473b739 📝 Update release notes
[skip ci]
2024-12-29 20:41:26 +00:00
Chen Pu
13a5b3f9b9 🌐 Update Chinese translation for docs/zh/docs/advanced/security/oauth2-scopes.md (#13110) 2024-12-29 20:41:04 +00:00
github-actions
741b95a454 📝 Update release notes
[skip ci]
2024-12-25 20:33:17 +00:00
Subin Lee
abac475407 ✏️ Fix error in docs/en/docs/contributing.md (#12899) 2024-12-25 20:32:56 +00:00
github-actions
d5a11b6cdc 📝 Update release notes
[skip ci]
2024-12-25 20:10:38 +00:00
alv2017
b7367f2564 📝 Minor corrections in docs/en/docs/tutorial/sql-databases.md (#13081) 2024-12-25 20:10:12 +00:00
github-actions
0370958171 📝 Update release notes
[skip ci]
2024-12-24 16:17:09 +00:00
Gerry Sabar
d529449241 🌐 Add Indonesian translation for docs/id/docs/tutorial/path-params.md (#13086) 2024-12-24 16:16:02 +00:00
github-actions
59401a7829 📝 Update release notes
[skip ci]
2024-12-24 16:14:57 +00:00
Geumbin
eece6344f5 🌐 Add Korean translation for docs/ko/docs/tutorial/sql-databases.md (#13093) 2024-12-24 16:14:29 +00:00
github-actions
b9a27be0d4 📝 Update release notes
[skip ci]
2024-12-23 21:53:32 +00:00
Zhongheng Cheng
f2986a1d53 🌐 Update Chinese translation for docs/zh/docs/async.md (#13095) 2024-12-23 21:53:06 +00:00
github-actions
dd0b335052 📝 Update release notes
[skip ci]
2024-12-20 21:16:17 +00:00
dependabot[bot]
e779069c92 ⬆ Bump astral-sh/setup-uv from 4 to 5 (#13096)
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 4 to 5.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/v4...v5)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  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-12-20 21:15:54 +00:00
github-actions
d041f12331 📝 Update release notes
[skip ci]
2024-12-19 15:31:03 +00:00
Zhongheng Cheng
c015245676 🌐 Add Chinese translation for docs/zh/docs/advanced/openapi-webhooks.md (#13091) 2024-12-19 15:30:38 +00:00
github-actions
986d363a38 📝 Update release notes
[skip ci]
2024-12-17 21:49:28 +00:00
Zhongheng Cheng
a9f63e5d22 🌐 Add Chinese translation for docs/zh/docs/advanced/async-tests.md (#13074) 2024-12-17 21:49:06 +00:00
github-actions
3ca5fe1709 📝 Update release notes
[skip ci]
2024-12-17 21:34:01 +00:00
Yarema Kertytsky
2b78866662 🌐 Add Ukrainian translation for docs/uk/docs/fastapi-cli.md (#13020) 2024-12-17 21:33:34 +00:00
github-actions
334c9bc7ad 📝 Update release notes
[skip ci]
2024-12-17 21:29:01 +00:00
Zhibang Yue
a559f8f397 🌐 Add Chinese translation for docs/zh/docs/advanced/events.md (#12512) 2024-12-17 21:28:37 +00:00
github-actions
0d8e9663d8 📝 Update release notes
[skip ci]
2024-12-17 21:21:39 +00:00
github-actions
52d8ad8bfa 📝 Update release notes
[skip ci]
2024-12-17 21:21:10 +00:00
alv2017
dae2b957ba 🌐 Add Russian translation for /docs/ru/docs/tutorial/sql-databases.md (#13079) 2024-12-17 21:20:20 +00:00
Zhongheng Cheng
a0f6494803 🌐 Update Chinese translation for docs/zh/docs/advanced/testing-dependencies.md (#13066) 2024-12-17 21:18:42 +00:00
github-actions
b19af36826 📝 Update release notes
[skip ci]
2024-12-17 21:18:25 +00:00
YungYueh ChanLee
d03ef24c92 🌐 Update Traditional Chinese translation for docs/zh-hant/docs/tutorial/index.md (#13075) 2024-12-17 21:16:46 +00:00
github-actions
5fc3e91020 📝 Update release notes
[skip ci]
2024-12-15 17:12:47 +00:00
Zhongheng Cheng
929e844754 🌐 Add Chinese translation for docs/zh/docs/tutorial/sql-databases.md (#13051) 2024-12-15 17:11:14 +00:00
github-actions
cfc17e5510 📝 Update release notes
[skip ci]
2024-12-15 17:10:40 +00:00
史雲昔 (Vincy SHI)
d3360406c4 🌐 Update Chinese translation for docs/zh/docs/tutorial/query-params-str-validations.md (#12928) 2024-12-15 17:10:14 +00:00
github-actions
940c0fb9fb 📝 Update release notes
[skip ci]
2024-12-15 16:45:42 +00:00
Zhongheng Cheng
c1220535cc 🌐 Add Chinese translation for docs/zh/docs/tutorial/header-param-models.md (#13040) 2024-12-15 16:44:11 +00:00
github-actions
488763e9f7 📝 Update release notes
[skip ci]
2024-12-15 16:43:41 +00:00
史雲昔 (Vincy SHI)
0e5f5d2e93 🌐 Update Chinese translation for docs/zh/docs/tutorial/path-params.md (#12926) 2024-12-15 16:43:19 +00:00
github-actions
f5f0d20af0 📝 Update release notes
[skip ci]
2024-12-15 16:39:45 +00:00
史雲昔 (Vincy SHI)
97206ee28f 🌐 Update Chinese translation for docs/zh/docs/tutorial/first-steps.md (#12923) 2024-12-15 16:39:22 +00:00
github-actions
d7f88623e1 📝 Update release notes
[skip ci]
2024-12-15 13:35:39 +00:00
Sebastián Ramírez
0f5146fa5d 🔧 Update sponsors: rename CryptAPI to BlockBee (#13078) 2024-12-15 14:35:18 +01:00
github-actions
6ae85b4742 📝 Update release notes
[skip ci]
2024-12-12 22:49:43 +00:00
Aleksandr Lobanov
627242b8ae 🌐 Update Russian translation for docs/ru/docs/deployment/docker.md (#13048) 2024-12-12 22:48:28 +00:00
github-actions
fbd3ff4a6f 📝 Update release notes
[skip ci]
2024-12-12 22:47:34 +00:00
Victor Menezes
a277942a52 🌐 Add Portuguese translation for docs/pt/docs/advanced/generate-clients.md (#13030) 2024-12-12 22:47:10 +00:00
github-actions
a862acb877 📝 Update release notes
[skip ci]
2024-12-12 21:47:03 +00:00
Gerry Sabar
974284be90 🌐 Add Indonesian translation for docs/id/docs/tutorial/first-steps.md (#13042) 2024-12-12 21:46:36 +00:00
github-actions
e90af0c0f9 📝 Update release notes
[skip ci]
2024-12-10 20:39:15 +00:00
Zhongheng Cheng
9802b90b66 🌐 Add Chinese translation for docs/zh/docs/tutorial/cookie-param-models.md (#13038) 2024-12-10 20:38:03 +00:00
github-actions
6c8deb5a4f 📝 Update release notes
[skip ci]
2024-12-10 20:36:33 +00:00
Zhongheng Cheng
0d49633776 🌐 Add Chinese translation for docs/zh/docs/tutorial/request-form-models.md (#13045) 2024-12-10 20:36:08 +00:00
github-actions
727ce82e9b 📝 Update release notes
[skip ci]
2024-12-10 20:35:10 +00:00
dependabot[bot]
6455f4bb01 ⬆ Bump pypa/gh-action-pypi-publish from 1.12.2 to 1.12.3 (#13055)
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.12.2 to 1.12.3.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.12.2...v1.12.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-12-10 20:34:48 +00:00
github-actions
fed6fab8f9 📝 Update release notes
[skip ci]
2024-12-10 11:35:32 +00:00
alv2017
5cc1b065ba 🌐 Add Russian translation for docs/ru/docs/virtual-environments.md (#13026) 2024-12-10 11:34:19 +00:00
github-actions
bacf9e5af6 📝 Update release notes
[skip ci]
2024-12-10 11:25:14 +00:00
timothy
230f2077b9 🌐 Add Korean translation for docs/ko/docs/tutorial/testing.md (#12968) 2024-12-10 11:24:48 +00:00
github-actions
c9470e7aec 📝 Update release notes
[skip ci]
2024-12-10 11:03:42 +00:00
viva-douner
f7ba75e3f7 🌐 Add Korean translation for docs/ko/docs/advanced/async-test.md (#12918) 2024-12-10 11:03:16 +00:00
github-actions
52cdbebbad 📝 Update release notes
[skip ci]
2024-12-10 10:58:06 +00:00
Aleksandr Andrukhov
d8e7edba80 🌐 Add Russian translation for docs/ru/docs/tutorial/security/oauth2-jwt.md (#10601) 2024-12-10 10:56:08 +00:00
github-actions
c355ae1416 📝 Update release notes
[skip ci]
2024-12-10 10:54:21 +00:00
github-actions
bc958ac3da 📝 Update release notes
[skip ci]
2024-12-10 10:53:56 +00:00
Aleksandr Andrukhov
a54e336b22 🌐 Add Russian translation for docs/ru/docs/tutorial/security/simple-oauth2.md (#10599) 2024-12-10 10:53:40 +00:00
Aleksandr Andrukhov
b667e6ff12 🌐 Add Russian translation for docs/ru/docs/tutorial/security/get-current-user.md (#10594) 2024-12-10 10:52:27 +00:00
github-actions
d05d970c4d 📝 Update release notes
[skip ci]
2024-12-10 10:49:09 +00:00
YungYueh ChanLee
365d9b93c3 🌐 Add Traditional Chinese translation for docs/zh-hant/docs/features.md (#12441) 2024-12-10 10:48:41 +00:00
github-actions
f7bff17f98 📝 Update release notes
[skip ci]
2024-12-09 22:53:53 +00:00
dependabot[bot]
889005d07d ⬆ Bump types-ujson from 5.7.0.1 to 5.10.0.20240515 (#13018)
Bumps [types-ujson](https://github.com/python/typeshed) from 5.7.0.1 to 5.10.0.20240515.
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-ujson
  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-12-09 22:53:31 +00:00
github-actions
dfb6a6b74a 📝 Update release notes
[skip ci]
2024-12-09 22:50:51 +00:00
github-actions
b4155f7a76 📝 Update release notes
[skip ci]
2024-12-09 22:46:35 +00:00
dependabot[bot]
329a81777b ⬆ Bump black from 24.3.0 to 24.10.0 (#13014)
Bumps [black](https://github.com/psf/black) from 24.3.0 to 24.10.0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/24.3.0...24.10.0)

---
updated-dependencies:
- dependency-name: black
  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-12-09 22:45:45 +00:00
github-actions
cb6edde2e5 📝 Update release notes
[skip ci]
2024-12-09 22:45:09 +00:00
dependabot[bot]
fe604f360f ⬆ Bump inline-snapshot from 0.13.0 to 0.14.0 (#13017)
Bumps [inline-snapshot](https://github.com/15r10nk/inline-snapshot) from 0.13.0 to 0.14.0.
- [Release notes](https://github.com/15r10nk/inline-snapshot/releases)
- [Changelog](https://github.com/15r10nk/inline-snapshot/blob/main/CHANGELOG.md)
- [Commits](https://github.com/15r10nk/inline-snapshot/compare/v0.13.0...v0.14.0)

---
updated-dependencies:
- dependency-name: inline-snapshot
  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-12-09 22:44:46 +00:00
dependabot[bot]
ce843bb8e1 ⬆ Bump dirty-equals from 0.6.0 to 0.8.0 (#13015)
Bumps [dirty-equals](https://github.com/samuelcolvin/dirty-equals) from 0.6.0 to 0.8.0.
- [Release notes](https://github.com/samuelcolvin/dirty-equals/releases)
- [Commits](https://github.com/samuelcolvin/dirty-equals/compare/v0.6.0...v0.8.0)

---
updated-dependencies:
- dependency-name: dirty-equals
  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-12-09 22:44:36 +00:00
github-actions
28f22e326c 📝 Update release notes
[skip ci]
2024-12-09 22:43:46 +00:00
github-actions
f6cf06c864 📝 Update release notes
[skip ci]
2024-12-09 22:43:37 +00:00
dependabot[bot]
d2891b651d ⬆ Bump cloudflare/wrangler-action from 3.12 to 3.13 (#12996)
Bumps [cloudflare/wrangler-action](https://github.com/cloudflare/wrangler-action) from 3.12 to 3.13.
- [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.12...v3.13)

---
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-12-09 22:43:24 +00:00
dependabot[bot]
2fe5ee4151 ⬆ Bump astral-sh/setup-uv from 3 to 4 (#12982)
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 3 to 4.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/v3...v4)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  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-12-09 22:43:15 +00:00
github-actions
502c928ab1 📝 Update release notes
[skip ci]
2024-12-09 22:40:00 +00:00
史雲昔 (Vincy SHI)
671eba1de6 🌐 Add Traditional Chinese translation for docs/zh-hant/docs/virtual-environments.md (#12791) 2024-12-09 22:39:33 +00:00
github-actions
2bbd7ce821 📝 Update release notes
[skip ci]
2024-12-09 19:51:20 +00:00
tinyboxvk
de1fe4d388 🔧 Remove duplicate actions/checkout in notify-translations.yml (#12915) 2024-12-09 19:50:56 +00:00
github-actions
bb3cf8b902 📝 Update release notes
[skip ci]
2024-12-09 13:07:47 +00:00
heum
d24a334923 🌐 Add Korean translation for docs/ko/docs/advanced/templates.md (#12726) 2024-12-09 13:07:23 +00:00
github-actions
87accca03e 📝 Update release notes
[skip ci]
2024-12-09 13:01:17 +00:00
Alejandra
d0626aa565 📝 Update includes in docs/ru/docs/tutorial/query-param-models.md (#12994) 2024-12-09 14:00:54 +01:00
github-actions
eed1496b0e 📝 Update release notes
[skip ci]
2024-12-09 12:57:32 +00:00
Dave Hay
9e19613311 ✏️ Fix typo in README installation instructions (#13011) 2024-12-09 12:57:05 +00:00
github-actions
40f90b3a94 📝 Update release notes
[skip ci]
2024-12-09 12:51:00 +00:00
github-actions
cbfb27ca91 📝 Update release notes
[skip ci]
2024-12-09 12:50:03 +00:00
alv2017
b0f0abda0d 🌐 Add Russian translation for docs/ru/docs/fastapi-cli.md (#13041) 2024-12-09 12:49:43 +00:00
github-actions
c62fa0bd3b 📝 Update release notes
[skip ci]
2024-12-09 12:47:45 +00:00
hy.lee
95267e58de 🌐 Add Korean translation for docs/ko/docs/tutorial/cookie-param-models.md (#13000) 2024-12-09 12:47:02 +00:00
hy.lee
f4a023451d 🌐 Add Korean translation for docs/ko/docs/tutorial/header-param-models.md (#13001) 2024-12-09 12:45:39 +00:00
github-actions
28f820065f 📝 Update release notes
[skip ci]
2024-12-09 12:45:10 +00:00
github-actions
199803085f 📝 Update release notes
[skip ci]
2024-12-09 12:44:32 +00:00
hy.lee
5e8fa0e842 🌐 Add Korean translation for docs/ko/docs/tutorial/request-form-models.md (#13002) 2024-12-09 12:44:27 +00:00
hy.lee
5480386e39 🌐 Add Korean translation for docs/ko/docs/tutorial/request-forms.md (#13003) 2024-12-09 12:42:55 +00:00
github-actions
92236cf6a4 📝 Update release notes
[skip ci]
2024-12-09 12:42:19 +00:00
hy.lee
30f00ace9a 🌐 Add Korean translation for docs/ko/docs/resources/index.md (#13004) 2024-12-09 12:41:56 +00:00
github-actions
cb33e0aed2 📝 Update release notes
[skip ci]
2024-12-09 12:28:42 +00:00
nahyunkeem
49efaa5b7e 🌐 Add Korean translation for docs/ko/docs/how-to/configure-swagger-ui.md (#12898) 2024-12-09 12:25:19 +00:00
github-actions
d43fe2d2e1 📝 Update release notes
[skip ci]
2024-12-09 12:23:36 +00:00
nahyunkeem
8040927208 🌐 Add Korean translation to docs/ko/docs/advanced/additional-status-codes.md (#12715) 2024-12-09 12:22:47 +00:00
github-actions
131b6dc21f 📝 Update release notes
[skip ci]
2024-12-09 12:21:23 +00:00
YungYueh ChanLee
01c6b41c52 🌐 Add Traditional Chinese translation for docs/zh-hant/docs/tutorial/first-steps.md (#12467) 2024-12-09 12:20:58 +00:00
github-actions
f9514ac4b2 📝 Update release notes
[skip ci]
2024-12-04 15:10:29 +00:00
Sebastián Ramírez
cc4db3294a 🔧 Update team members (#13033) 2024-12-04 16:10:05 +01:00
github-actions
d4e29ea3fe 📝 Update release notes
[skip ci]
2024-12-04 15:00:32 +00:00
Sebastián Ramírez
0b7b222e49 📝 Update sponsors: remove Codacy (#13032) 2024-12-04 15:00:08 +00:00
github-actions
551c5613a9 📝 Update release notes
[skip ci]
2024-12-04 14:39:05 +00:00
Sebastián Ramírez
4881d1e225 📝 Update docs for fastapi-cli (#13031)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-12-04 15:38:39 +01:00
Sebastián Ramírez
293d7c3bf8 📝 Update release notes 2024-12-03 23:45:53 +01:00
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
Sebastián Ramírez
d00af00d3f 🔖 Release version 0.112.2 2024-08-24 14:34:50 -05:00
github-actions
b69a9f3b6f 📝 Update release notes 2024-08-24 19:27:59 +00:00
Giunio
51b625e127 🐛 Fix allow_inf_nan option for Param and Body classes (#11867)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: svlandeg <svlandeg@github.com>
2024-08-24 14:27:37 -05:00
github-actions
48b36f26d8 📝 Update release notes 2024-08-24 19:10:14 +00:00
Pastukhov Nikita
3a4ac24675 🐛 Ensure that app.include_router merges nested lifespans (#9630)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Marcelo Trylesinski <marcelotryle@gmail.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-08-24 14:09:52 -05:00
Sebastián Ramírez
22bf988dfb 📝 Update release notes 2024-08-23 22:48:20 -05:00
github-actions
6935fe8d38 📝 Update release notes 2024-08-24 03:16:48 +00:00
Aymen
8f03716757 📝 Fix a typo in virtual environement page (#12064) 2024-08-23 22:16:23 -05:00
Esteban Maya
866c6987fc Merge branch 'master' into docs/edit-timer-in-middleware 2024-08-22 12:55:06 -05:00
github-actions
d0ce9d2bdf 📝 Update release notes 2024-08-22 00:47:57 +00:00
Sebastián Ramírez
705659bb22 📝 Add docs about Environment Variables and Virtual Environments (#12054) 2024-08-21 19:47:31 -05:00
github-actions
4f3381a95e 📝 Update release notes 2024-08-21 16:58:20 +00:00
João Pedro Pereira Holanda
38ff43b690 🌐 Add Portuguese translation for docs/pt/docs/tutorial/request_file.md (#12018) 2024-08-21 11:56:50 -05:00
github-actions
2fe05762b2 📝 Update release notes 2024-08-21 16:55:38 +00:00
Yuki Watanabe
34e6e63fb2 🌐 Add Japanese translation for docs/ja/docs/learn/index.md (#11592) 2024-08-21 11:55:16 -05:00
github-actions
2d34086b70 📝 Update release notes 2024-08-20 00:40:55 +00:00
pre-commit-ci[bot]
f4dfbae903 ⬆ [pre-commit.ci] pre-commit autoupdate (#12046)
updates:
- [github.com/pre-commit/pre-commit-hooks: v4.4.0 → v4.6.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.4.0...v4.6.0)
- https://github.com/charliermarsh/ruff-pre-commithttps://github.com/astral-sh/ruff-pre-commit

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-08-19 19:40:31 -05:00
github-actions
e8322228b4 📝 Update release notes 2024-08-19 18:15:49 +00:00
Alejandra
6ba8407ff3 📝 Update Spanish translation docs for consistency (#12044) 2024-08-19 13:15:21 -05:00
github-actions
63ae0f1070 📝 Update release notes 2024-08-19 17:35:25 +00:00
xuvjso
f0866bc205 🌐 Update docs about dependencies with yield (#12028) 2024-08-19 12:35:03 -05:00
github-actions
ae97785ded 📝 Update release notes 2024-08-18 23:26:36 +00:00
Sebastián Ramírez
bcd737de33 📝 Add Asyncer mention in async docs (#12037) 2024-08-18 23:26:14 +00:00
github-actions
98712b9e09 📝 Update release notes 2024-08-18 23:17:21 +00:00
Sebastián Ramírez
0e77481acf 📝 Move the Features docs to the top level to improve the main page menu (#12036) 2024-08-18 18:16:56 -05:00
github-actions
6ebaf0efcb 📝 Update release notes 2024-08-18 21:08:39 +00:00
Sebastián Ramírez
4f1eb0cd9e 🔧 Update coverage config files (#12035) 2024-08-18 16:07:03 -05:00
github-actions
0da0814d8a 📝 Update release notes 2024-08-17 21:20:52 +00:00
Sebastián Ramírez
9bfc48ad9f 📝 Update FastAPI People, do not translate to have the most recent info (#12034) 2024-08-17 16:20:31 -05:00
github-actions
882f77f925 📝 Update release notes 2024-08-17 06:54:13 +00:00
0shah0
85cded53c8 ✏️ Fix import typo in reference example for Security (#11168)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-08-17 06:53:52 +00:00
github-actions
066ea10ac5 📝 Update release notes 2024-08-17 06:42:28 +00:00
Ahsan Sheraz
ff1118d6a0 🌐 Update Urdu translation for docs/ur/docs/benchmarks.md (#10046)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-08-17 06:42:07 +00:00
github-actions
6aa0435a3e 📝 Update release notes 2024-08-17 04:52:53 +00:00
Jamie Phan
659350e9cd 🎨 Fix typing annotation for semi-internal FastAPI.add_api_route() (#10240)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-08-17 04:52:31 +00:00
github-actions
980c88c347 📝 Update release notes 2024-08-17 04:14:10 +00:00
Sebastián Ramírez
3a3ad5d66d ⬆️ Upgrade version of Ruff and reformat (#12032)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-08-16 23:13:50 -05:00
github-actions
6433c3b70e 📝 Update release notes 2024-08-17 04:00:12 +00:00
gitworkflows
4a7f6e0ae6 🔨 Standardize shebang across shell scripts (#11942) 2024-08-16 22:59:06 -05:00
github-actions
263e46e540 📝 Update release notes 2024-08-17 03:57:45 +00:00
Sofie Van Landeghem
957d747d21 📝 Highlight correct line in tutorial docs/en/docs/tutorial/body-multiple-params.md (#11978)
Co-authored-by: Esteban Maya <emayacadavid9@gmail.com>
2024-08-16 22:57:21 -05:00
github-actions
8b05d4518b 📝 Update release notes 2024-08-16 23:18:21 +00:00
Alejandra
8a146b7a28 🔥 Remove Sentry link from Advanced Middleware docs (#12031) 2024-08-16 18:18:02 -05:00
github-actions
beedc72281 📝 Update release notes 2024-08-16 22:32:33 +00:00
Esteban Maya
8c85b8f4aa Merge pull request #11979 from fastapi/dependabot/pip/sqlalchemy-gte-1.3.18-and-lt-2.0.33
⬆ Update sqlalchemy requirement from <1.4.43,>=1.3.18 to >=1.3.18,<2.0.33
2024-08-16 17:32:10 -05:00
Esteban Maya
9c9cccef0c Merge branch 'master' into dependabot/pip/sqlalchemy-gte-1.3.18-and-lt-2.0.33 2024-08-16 17:21:47 -05:00
github-actions
7ed9a4971e 📝 Update release notes 2024-08-16 21:56:54 +00:00
Sebastián Ramírez
daf4970ed7 📝 Clarify management tasks for translations, multiples files in one PR (#12030) 2024-08-16 21:56:33 +00:00
dependabot[bot]
be7e7d4433 ⬆ Update sqlalchemy requirement
---
updated-dependencies:
- dependency-name: sqlalchemy
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-16 17:45:47 +00:00
github-actions
29babdc0a1 📝 Update release notes 2024-08-16 17:44:48 +00:00
Sebastián Ramírez
46412ff67d 🔊 Remove old ignore warnings (#11950) 2024-08-16 17:44:28 +00:00
github-actions
2e0f74f58b 📝 Update release notes 2024-08-16 17:29:43 +00:00
Sebastián Ramírez
ff8fcd3b44 ⬆️ Upgrade griffe-typingdoc for the docs (#12029) 2024-08-16 17:29:21 +00:00
github-actions
9a939dec47 📝 Update release notes 2024-08-16 16:56:43 +00:00
gitworkflows
f79247b4e5 🙈 Add .coverage* to .gitignore (#11940) 2024-08-16 11:56:19 -05:00
github-actions
46d0ffc0d7 📝 Update release notes 2024-08-16 16:52:46 +00:00
VaitoSoi
fd5c00ab76 📝 Edit the link to the OpenAPI "Responses Object" and "Response Object" sections in the "Additional Responses in OpenAPI" section (#11996)
Co-authored-by: svlandeg <svlandeg@github.com>
2024-08-16 11:51:25 -05:00
github-actions
9f78e08c14 📝 Update release notes 2024-08-16 16:50:25 +00:00
Jiri Kuncar
c81f575d0d 🔨 Specify email-validator dependency with dash (#11515)
Co-authored-by: svlandeg <svlandeg@github.com>
2024-08-16 11:50:01 -05:00
github-actions
a3f42718de 📝 Update release notes 2024-08-16 02:05:14 +00:00
Alejandra
10eee5c3b3 🌐 Add Spanish translation for docs/es/docs/project-generation.md (#11947)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-08-16 02:04:50 +00:00
github-actions
a51a98b07e 📝 Update release notes 2024-08-16 01:58:02 +00:00
Sławomir Ehlert
0aaaed581e ⚙️ Record and show test coverage contexts (what test covers which line) (#11518)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-08-15 20:57:38 -05:00
github-actions
e8f7bf0ad5 📝 Update release notes 2024-08-16 00:05:21 +00:00
Micael Jarniac
a0c529ef0a 📝 Fix minor typo (#12026) 2024-08-15 19:04:55 -05:00
github-actions
470f1ae57d 📝 Update release notes 2024-08-15 23:30:36 +00:00
Nils Lindemann
8809b3685f 📝 Several docs improvements, tweaks, and clarifications (#11390)
Co-authored-by: svlandeg <svlandeg@github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-08-15 23:30:12 +00:00
github-actions
3c8d0abc87 📝 Update release notes 2024-08-15 22:38:22 +00:00
Jun-Ah 준아
265dbeb663 📝 Add missing compresslevel parameter on docs for GZipMiddleware (#11350)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-08-15 17:38:02 -05:00
github-actions
4636c621a9 📝 Update release notes 2024-08-15 22:31:36 +00:00
Luke Okomilo
2cb1333b97 📝 Fix inconsistent response code when item already exists in docs for testing (#11818)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-08-15 22:31:16 +00:00
github-actions
366bdebd9e 📝 Update release notes 2024-08-15 21:30:26 +00:00
Cedric L'homme
86c8f4fc2b 📝 Update docs/en/docs/tutorial/body.md with Python 3.10 union type example (#11415)
Co-authored-by: svlandeg <svlandeg@github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-08-15 16:29:58 -05:00
Sebastián Ramírez
4f937c0c4a 🔖 Release version 0.112.1 2024-08-15 16:00:47 -05:00
github-actions
94be8ff341 📝 Update release notes 2024-08-15 20:58:06 +00:00
dependabot[bot]
285a54cfbd ⬆ Bump pypa/gh-action-pypi-publish from 1.8.14 to 1.9.0 (#11727)
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.8.14 to 1.9.0.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.8.14...v1.9.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-08-15 15:56:19 -05:00
github-actions
b7c80cbca2 📝 Update release notes 2024-08-15 18:51:01 +00:00
Pierre V-F
0d92b42ff0 🔧 Add changelog URL to pyproject.toml, shows in PyPI (#11152)
Co-authored-by: Alejandra <90076947+alejsdev@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-08-15 13:50:31 -05:00
github-actions
2f5ed4f2d1 📝 Update release notes 2024-08-15 18:39:22 +00:00
Sebastián Ramírez
2c98017200 👷 Do not sync labels as it overrides manually added labels (#12024) 2024-08-15 13:38:43 -05:00
github-actions
fc9107843e 📝 Update release notes 2024-08-15 15:51:59 +00:00
Ben Beasley
5fd9ab9750 ⬆️ Allow Starlette 0.38.x, update the pin to >=0.37.2,<0.39.0 (#11876)
Co-authored-by: svlandeg <svlandeg@github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-08-15 10:51:33 -05:00
github-actions
84d69bb69a 📝 Update release notes 2024-08-15 15:41:45 +00:00
marcelomarkus
646232121b 🌐 Add Portuguese translation for docs/pt/docs/tutorial/bigger-applications.md (#11971) 2024-08-15 10:38:22 -05:00
github-actions
e1b52cf428 📝 Update release notes 2024-08-15 15:38:02 +00:00
Rafael de Oliveira Marques
60fe2b19e8 🌐 Add Portuguese translation for docs/pt/docs/advanced/testing-websockets.md (#11994) 2024-08-15 10:36:31 -05:00
github-actions
4fe1af494a 📝 Update release notes 2024-08-15 15:35:41 +00:00
Rafael de Oliveira Marques
959e793297 🌐 Add Portuguese translation for docs/pt/docs/advanced/testing-dependencies.md (#11995) 2024-08-15 10:35:17 -05:00
github-actions
b04d29c983 📝 Update release notes 2024-08-15 15:21:51 +00:00
Sebastián Ramírez
c82497f78e 📝 Update docs section about "Don't Translate these Pages" (#12022) 2024-08-15 10:21:25 -05:00
github-actions
9c3845be8d 📝 Update release notes 2024-08-14 22:57:35 +00:00
Sebastián Ramírez
85bd4067c2 📝 Add documentation for non-translated pages and scripts to verify them (#12020) 2024-08-14 17:57:10 -05:00
github-actions
75705617a6 📝 Update release notes 2024-08-14 18:29:51 +00:00
Sebastián Ramírez
9f57ecd41f 👷🏻 Update Labeler GitHub Actions (#12019) 2024-08-14 18:29:24 +00:00
github-actions
4c490de33d 📝 Update release notes 2024-08-14 14:33:49 +00:00
Sebastián Ramírez
2dad7c9834 🔧 Update configs for MkDocs for languages and social cards (#12016) 2024-08-14 09:33:27 -05:00
github-actions
96cb538fa3 📝 Update release notes 2024-08-14 00:31:10 +00:00
Sebastián Ramírez
7c6e70a0c7 👷 Update permissions and config for labeler GitHub Action (#12008) 2024-08-13 19:30:46 -05:00
github-actions
69a6456d9e 📝 Update release notes 2024-08-13 05:40:18 +00:00
Sebastián Ramírez
e5f25e3bca 👷🏻 Add GitHub Action label-checker (#12005) 2024-08-13 05:39:57 +00:00
github-actions
26a37a6a20 📝 Update release notes 2024-08-13 04:54:36 +00:00
Sebastián Ramírez
c89533254e 👷 Add label checker GitHub Action (#12004) 2024-08-12 23:54:14 -05:00
github-actions
14c621ea30 📝 Update release notes 2024-08-13 02:00:51 +00:00
Sebastián Ramírez
48c269ba68 👷 Update GitHub Action add-to-project (#12002) 2024-08-12 21:00:25 -05:00
github-actions
14779a3ae1 📝 Update release notes 2024-08-13 01:48:24 +00:00
Sebastián Ramírez
b5e167d406 🔧 Update labeler GitHub Action (#12001) 2024-08-12 20:47:59 -05:00
github-actions
663810cb1a 📝 Update release notes 2024-08-13 01:02:50 +00:00
Sebastián Ramírez
748159289f 👷 Add GitHub Action labeler (#12000) 2024-08-12 20:02:29 -05:00
github-actions
768df2736e 📝 Update release notes 2024-08-12 23:05:15 +00:00
Sebastián Ramírez
922ce32aa2 👷 Add GitHub Action add-to-project (#11999) 2024-08-12 23:04:54 +00:00
github-actions
d839e3ccbb 📝 Update release notes 2024-08-12 21:48:16 +00:00
Sebastián Ramírez
b0a8e7356a 📝 Update admonitions in docs missing (#11998) 2024-08-12 16:47:53 -05:00
github-actions
0e8b6d3bb8 📝 Update release notes 2024-08-09 21:32:11 +00:00
Sebastián Ramírez
06fc1c2cc8 🔨 Update docs.py script to enable dirty reload conditionally (#11986) 2024-08-09 16:30:19 -05:00
github-actions
2b7fc3f340 📝 Update release notes 2024-08-09 21:29:31 +00:00
Sebastián Ramírez
4ec134426d 📝 Update docs about discussions questions (#11985) 2024-08-09 21:29:09 +00:00
github-actions
6d9dc39fcb 📝 Update release notes 2024-08-09 16:54:22 +00:00
Sebastián Ramírez
e06e0b1c4a 🔧 Update MkDocs instant previews (#11982) 2024-08-09 16:53:58 +00:00
github-actions
4cbb846d9e 📝 Update release notes 2024-08-09 15:54:10 +00:00
Sebastián Ramírez
8b6d9ba789 🐛 Fix deploy docs previews script to handle mkdocs.yml files (#11984) 2024-08-09 10:52:41 -05:00
github-actions
0b30cad9d2 📝 Update release notes 2024-08-09 01:43:55 +00:00
Sebastián Ramírez
4f9ca032d6 💡 Add comment about custom Termynal line-height (#11976) 2024-08-08 20:42:26 -05:00
github-actions
4b5342b568 📝 Update release notes 2024-08-08 23:34:46 +00:00
Sebastián Ramírez
51563564c6 👷 Add alls-green for test-redistribute (#11974) 2024-08-08 23:34:25 +00:00
github-actions
fda1813e13 📝 Update release notes 2024-08-08 23:28:35 +00:00
Sebastián Ramírez
233bab7f41 👷 Update docs-previews to handle no docs changes (#11975) 2024-08-08 18:28:14 -05:00
Sebastián Ramírez
8377c5237c 📝 Update release notes 2024-08-07 22:51:13 -05:00
github-actions
b7f035512a 📝 Update release notes 2024-08-07 21:17:38 +00:00
Sebastián Ramírez
58279670b6 🔨 Refactor script deploy_docs_status.py to account for deploy URLs with or without trailing slash (#11965) 2024-08-07 16:17:14 -05:00
Sebastián Ramírez
ead4f8c6a4 Merge branch 'master' into docs/edit-timer-in-middleware 2024-08-07 16:08:05 -05:00
github-actions
0eddc02aca 📝 Update release notes 2024-08-07 20:57:09 +00:00
Sebastián Ramírez
13b56ab499 🔒️ Update permissions for deploy-docs action (#11964) 2024-08-07 20:56:47 +00:00
github-actions
9e84537685 📝 Update release notes 2024-08-07 19:15:50 +00:00
Sebastián Ramírez
f118154576 👷🏻 Add deploy docs status and preview links to PRs (#11961) 2024-08-07 19:15:24 +00:00
github-actions
a031d80e5c 📝 Update release notes 2024-08-07 18:58:22 +00:00
Rafael de Oliveira Marques
f0a146e4f8 🌐 Add Portuguese translation for docs/pt/docs/advanced/using-request-directly.md (#11956) 2024-08-07 13:58:00 -05:00
Dom
7ff5da8bf2 edit middleware docs code sample to use perf_counter as a timer 2024-08-06 14:46:39 +01:00
github-actions
df419b739c 📝 Update release notes 2024-08-06 04:48:52 +00:00
Sebastián Ramírez
0cd844d387 🔧 Update docs setup with latest configs and plugins (#11953) 2024-08-05 23:48:30 -05:00
github-actions
af1a07052a 📝 Update release notes 2024-08-05 15:49:07 +00:00
P-E. Brian
dc384c4f8d 🌐 Add French translation for docs/fr/docs/tutorial/body-multiple-params.md (#11796) 2024-08-05 10:48:45 -05:00
github-actions
9dee1f8b28 📝 Update release notes 2024-08-04 23:34:17 +00:00
CAO Mingpei
abe62d8a81 🌐 Update Chinese translation for docs/zh/docs/tutorial/query-params.md (#11557) 2024-08-04 18:33:57 -05:00
github-actions
35fcb31dca 📝 Update release notes 2024-08-04 18:23:34 +00:00
Sebastián Ramírez
f3e49e5f4e 🔇 Ignore warning from attrs in Trio (#11949) 2024-08-04 18:23:14 +00:00
github-actions
22ffde0356 📝 Update release notes 2024-08-04 17:01:24 +00:00
白宦成
b1774bae1b 🌐 Update typo in Chinese translation for docs/zh/docs/advanced/testing-dependencies.md (#11944) 2024-08-04 12:01:03 -05:00
github-actions
553816ae6a 📝 Update release notes 2024-08-03 00:03:45 +00:00
marcelomarkus
25f1b1548b 🌐 Add Portuguese translation for docs/pt/docs/advanced/sub-applications.md and docs/pt/docs/advanced/behind-a-proxy.md (#11856) 2024-08-02 19:02:06 -05:00
github-actions
f0367e0424 📝 Update release notes 2024-08-03 00:01:47 +00:00
Wesin Ribeiro Alves
2609348471 🌐 Add Portuguese translation for docs/pt/docs/tutorial/cors.md and docs/pt/docs/tutorial/middleware.md (#11916) 2024-08-02 19:01:21 -05:00
github-actions
9723721ea4 📝 Update release notes 2024-08-02 19:38:15 +00:00
P-E. Brian
e4ab536dc5 🌐 Add French translation for docs/fr/docs/tutorial/path-params-numeric-validations.md (#11788) 2024-08-02 14:37:52 -05:00
Sebastián Ramírez
b2e233867c 🔖 Release version 0.112.0 2024-08-02 01:09:03 -05:00
Sebastián Ramírez
003d45428f 📝 Update release notes 2024-08-02 01:08:25 -05:00
github-actions
450bff65f4 📝 Update release notes 2024-08-02 06:03:26 +00:00
Sebastián Ramírez
a25c92ceb9 ♻️ Add support for pip install "fastapi[standard]" with standard dependencies and python -m fastapi (#11935)
* ♻️ Add support for `pip install "fastapi[standard]"` and make `fastapi` not include the optional standard dependencies

* 📝 Update docs to include new fastapi[standard]

*  Add new stub fastapi command that tells people to install fastapi[standard]

*  Add tests for new stub CLI

* 🔧 Add new command fastapi in main fastapi project, for when fastapi-cli is not installed

* ✏️ Fix types

* 📝 Add note about quotes when installing fastapi[standard]

* 📝 Update docs about standard extra dependencies

* ⬆️ Upgrade fastapi-cli
2024-08-02 01:03:05 -05:00
github-actions
3990a0a510 📝 Update release notes 2024-08-01 05:10:11 +00:00
Rafael de Oliveira Marques
1f7dcc58de 🌐 Update Portuguese translation for docs/pt/docs/alternatives.md (#11931) 2024-08-01 00:09:45 -05:00
github-actions
12a4476c3d 📝 Update release notes 2024-08-01 04:54:12 +00:00
Sebastián Ramírez
efb4a077be 🔧 Update sponsors: add liblab (#11934) 2024-07-31 23:53:51 -05:00
github-actions
9d41d6e8a8 📝 Update release notes 2024-08-01 02:18:34 +00:00
Sebastián Ramírez
643a87cc84 👷 Update GitHub Action label-approved permissions (#11933)
👷 Update label-approved permissions
2024-07-31 21:18:05 -05:00
github-actions
b8a06527fc 📝 Update release notes 2024-07-31 23:40:27 +00:00
Sebastián Ramírez
8b930f8847 👷 Refactor GitHub Action to comment docs deployment URLs and update token (#11925) 2024-07-31 18:40:04 -05:00
github-actions
c0ae16ab7a 📝 Update release notes 2024-07-31 14:09:35 +00:00
jianghuyiyuan
2e35b176cf ✏️ Fix typos in docs (#11926) 2024-07-31 09:09:15 -05:00
github-actions
b0801e66d3 📝 Update release notes 2024-07-31 02:18:12 +00:00
Sebastián Ramírez
7723e96317 👷 Update tokens for GitHub Actions (#11924) 2024-07-30 21:17:52 -05:00
github-actions
b9e274dc11 📝 Update release notes 2024-07-30 01:32:52 +00:00
Sebastián Ramírez
0a21b371b7 📝 Tweak management docs (#11918) 2024-07-29 20:32:30 -05:00
github-actions
2c33611c62 📝 Update release notes 2024-07-29 23:35:29 +00:00
Sebastián Ramírez
221e59b0d1 🚚 Rename GitHub links from tiangolo/fastapi to fastapi/fastapi (#11913) 2024-07-29 18:35:07 -05:00
github-actions
12fffbc7ea 📝 Update release notes 2024-07-29 23:09:37 +00:00
Sebastián Ramírez
de70702b7c 👷 Update token permissions to comment deployment URL in docs (#11917) 2024-07-29 23:09:18 +00:00
github-actions
2c57673e07 📝 Update release notes 2024-07-29 22:51:53 +00:00
Sebastián Ramírez
8bd07a4342 👷 Update token permissions for GitHub Actions (#11915) 2024-07-29 17:51:29 -05:00
github-actions
7eb37d08bc 📝 Update release notes 2024-07-29 18:12:37 +00:00
Sebastián Ramírez
9e42833445 👷 Update GitHub Actions token usage (#11914) 2024-07-29 13:12:13 -05:00
Rafael de Oliveira Marques
84b4ac595e 🌐 Add Portuguese translation for docs/pt/docs/advanced/wsgi.md (#11909) 2024-07-29 12:09:51 -05:00
github-actions
dc8e194a20 📝 Update release notes 2024-07-28 20:26:48 +00:00
Sebastián Ramírez
baf1efc8b8 📝 Add docs about FastAPI team and project management (#11908) 2024-07-28 15:26:24 -05:00
github-actions
c944f9c40c 📝 Update release notes 2024-07-28 18:49:31 +00:00
Sebastián Ramírez
d6dfb9397b 👷 Update GitHub Action to notify translations with label approved-1 (#11907)
👷 Update GitHub Action to notify translations with label approved-1
2024-07-28 13:49:12 -05:00
github-actions
dddf07904a 📝 Update release notes 2024-07-28 00:04:20 +00:00
Sebastián Ramírez
81234084cd 📝 Re-structure docs main menu (#11904) 2024-07-27 19:03:57 -05:00
github-actions
a4fd3fd483 📝 Update release notes 2024-07-27 23:59:30 +00:00
Aleksandr Andrukhov
c96afadbd7 🌐 Add Russian translation for docs/ru/docs/tutorial/dependencies/sub-dependencies.md (#10515) 2024-07-27 18:59:11 -05:00
github-actions
386a6796ab 📝 Update release notes 2024-07-24 20:39:30 +00:00
Rafael de Oliveira Marques
4b4c48ecff 🌐 Add Portuguese translation for docs/pt/docs/advanced/response-change-status-code.md (#11863) 2024-07-24 15:39:07 -05:00
github-actions
cd86c72ed6 📝 Update release notes 2024-07-23 19:36:46 +00:00
Sebastián Ramírez
480f928599 🔧 Update sponsors, remove Reflex (#11875) 2024-07-23 14:36:22 -05:00
github-actions
360f4966a6 📝 Update release notes 2024-07-22 20:37:50 +00:00
Nolan Di Mare Sullivan
b80a2590f8 📝 Update Speakeasy URL (#11871)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-07-22 15:37:30 -05:00
github-actions
cd6e9db065 📝 Update release notes 2024-07-18 20:18:17 +00:00
Lucas Balieiro
3898fa88f2 🌐 Add Portuguese translation for docs/pt/docs/reference/background.md (#11849) 2024-07-18 15:15:21 -05:00
github-actions
4592223c86 📝 Update release notes 2024-07-18 20:13:42 +00:00
João Pedro Pereira Holanda
a5fbbeeb61 🌐 Add Portuguese translation for docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md (#11848) 2024-07-18 15:13:18 -05:00
github-actions
15130a3eb5 📝 Update release notes 2024-07-17 22:37:18 +00:00
Sebastián Ramírez
9230978aae 🔧 Update sponsors: remove TalkPython (#11861) 2024-07-17 22:36:02 +00:00
github-actions
84f04cc8a0 📝 Update release notes 2024-07-17 02:13:04 +00:00
Sebastián Ramírez
7bbddf012c 🔨 Update docs Termynal scripts to not include line nums for local dev (#11854) 2024-07-16 21:12:29 -05:00
github-actions
67ed86cb7f 📝 Update release notes 2024-07-15 18:47:15 +00:00
Lucas Balieiro
4c0c05c944 🌐 Add Portuguese translation for docs/pt/docs/reference/apirouter.md (#11843) 2024-07-15 13:46:51 -05:00
Sebastián Ramírez
b199364246 🔖 Release version 0.111.1 2024-07-14 12:54:20 -05:00
Sebastián Ramírez
38db0a5858 📝 Update release notes 2024-07-14 12:53:37 -05:00
github-actions
0f22c76d7d 📝 Update release notes 2024-07-14 17:47:04 +00:00
Sebastián Ramírez
4d3ef06029 Remove orjson and ujson from default dependencies (#11842) 2024-07-14 12:46:40 -05:00
github-actions
7a9396c839 📝 Update release notes 2024-07-14 17:28:03 +00:00
Alejandra
0b1e2ec2a6 ✏️ Rewording in docs/en/docs/fastapi-cli.md (#11716)
Co-authored-by: Andres Pineda <1900897+ajpinedam@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-07-14 12:27:40 -05:00
github-actions
fb15c48556 📝 Update release notes 2024-07-14 17:11:03 +00:00
gitworkflows
9d74b23670 ♻️ Simplify internal docs script (#11777) 2024-07-14 12:10:43 -05:00
github-actions
3a8f6cd1a2 📝 Update release notes 2024-07-14 17:07:22 +00:00
kittydoor
60f7fe4006 📝 Update Hypercorn links in all the docs (#11744) 2024-07-14 12:06:59 -05:00
github-actions
ce5ecaa2a2 📝 Update release notes 2024-07-14 16:22:25 +00:00
Maria Camila Gomez R
ebc6a0653a 🌐 Add Spanish translation for docs/es/docs/how-to/graphql.md (#11697) 2024-07-14 11:22:03 -05:00
github-actions
e23916d2f9 📝 Update release notes 2024-07-14 16:00:56 +00:00
Lucas Balieiro
dfcc0322e4 🌐 Add Portuguese translation for docs/pt/docs/reference/index.md (#11840) 2024-07-14 11:00:35 -05:00
Sebastián Ramírez
9edba691e7 📝 Update release notes 2024-07-13 21:14:00 -05:00
github-actions
36264cffb8 📝 Update release notes 2024-07-14 02:04:19 +00:00
Anita Hammer
511199014f 🌐 Fix link in German translation (#11836)
Broken link on main page
2024-07-13 21:04:00 -05:00
github-actions
9f49708fd8 📝 Update release notes 2024-07-14 01:58:15 +00:00
DamianCzajkowski
a3a6c61164 📝 Update docs with Ariadne reference from Starlette to FastAPI (#11797) 2024-07-13 20:57:52 -05:00
github-actions
41e87c0ded 📝 Update release notes 2024-07-14 01:49:49 +00:00
Nicoló Lino
3960b45223 📝 Update fastapi instrumentation external link (#11317) 2024-07-13 20:48:42 -05:00
github-actions
475f0d0158 📝 Update release notes 2024-07-14 01:46:44 +00:00
Augustus D'Souza
f9ac185bf0 ✏️ Fix links to alembic example repo in docs (#11628) 2024-07-14 01:46:19 +00:00
github-actions
13712e2720 📝 Update release notes 2024-07-14 01:24:27 +00:00
Lucas Balieiro
435c11a406 🌐 Add Portuguese translation for docs/pt/docs/reference/exceptions.md (#11834) 2024-07-13 20:24:05 -05:00
github-actions
2606671a0a 📝 Update release notes 2024-07-12 02:43:47 +00:00
João Pedro Pereira Holanda
7782dd677b 🌐 Add Portuguese translation for docs/pt/docs/tutorial/dependencies/global-dependencies.md (#11826) 2024-07-11 21:42:04 -05:00
github-actions
18d28d4370 📝 Update release notes 2024-07-12 02:41:39 +00:00
Lucas Balieiro
c8414b986f 🌐 Add Portuguese translation for docs/pt/docs/how-to/general.md (#11825) 2024-07-11 21:41:15 -05:00
github-actions
d3cdd3bbd1 📝 Update release notes 2024-07-11 03:37:40 +00:00
Rafael de Oliveira Marques
2d916a9c95 🌐 Add Portuguese translation for docs/pt/docs/advanced/async-tests.md (#11808) 2024-07-10 22:37:20 -05:00
github-actions
912524233b 📝 Update release notes 2024-07-09 17:59:20 +00:00
João Pedro Pereira Holanda
09b0a5d153 🌐 Add Portuguese translation for docs/pt/docs/tutorial/dependencies/sub-dependencies.md (#11792) 2024-07-09 12:58:59 -05:00
github-actions
846e8bc886 📝 Update release notes 2024-07-09 15:46:09 +00:00
Valentyn Khoroshchak
7039c5edc5 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/first-steps.md (#11809) 2024-07-09 10:45:46 -05:00
github-actions
b45d1da717 📝 Update release notes 2024-07-08 16:10:09 +00:00
João Pedro Pereira Holanda
4eb8db3cd3 🌐 Add Portuguese translation for docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-operators.md (#11804) 2024-07-08 11:09:45 -05:00
github-actions
4343170a28 📝 Update release notes 2024-07-05 13:46:40 +00:00
Logan
d60f8c59b9 🌐 Add Chinese translation for docs/zh/docs/fastapi-cli.md (#11786) 2024-07-05 08:46:16 -05:00
github-actions
8d39e5b74a 📝 Update release notes 2024-07-04 20:53:46 +00:00
Rafael de Oliveira Marques
dc3c320020 🌐 Add Portuguese translation for docs/pt/docs/advanced/openapi-webhooks.md (#11791) 2024-07-04 15:53:25 -05:00
github-actions
eca465f4c9 📝 Update release notes 2024-07-03 02:18:33 +00:00
Logan
f785676b83 🌐 Update Chinese translation for docs/tutorial/security/oauth2-jwt.md (#11781) 2024-07-02 21:17:04 -05:00
github-actions
a5ce86dde5 📝 Update release notes 2024-07-03 02:16:13 +00:00
P-E. Brian
6b0dddf55a 📝 Fix image missing in French translation for docs/fr/docs/async.md (#11787) 2024-07-02 21:15:55 -05:00
github-actions
42d52b834a 📝 Update release notes 2024-07-01 23:09:02 +00:00
Sebastián Ramírez
0888b3ffc0 🔧 Update sponsors: add Fine (#11784) 2024-07-01 18:08:40 -05:00
github-actions
c37d71da70 📝 Update release notes 2024-07-01 15:46:09 +00:00
Rafael de Oliveira Marques
172b3dfd43 🌐 Add Portuguese translation for docs/pt/docs/advanced/advanced-dependencies.md (#11775) 2024-07-01 10:45:45 -05:00
github-actions
2afbdb3a44 📝 Update release notes 2024-06-28 14:58:12 +00:00
João Pedro Pereira Holanda
ed22cc107d 🌐 Add Portuguese translation for docs/pt/docs/tutorial/dependencies/classes-as-dependencies.md (#11768) 2024-06-28 09:57:49 -05:00
github-actions
e304414c93 📝 Update release notes 2024-06-26 13:54:46 +00:00
Rafael de Oliveira Marques
8989940569 🌐 Add Portuguese translation for docs/pt/docs/advanced/additional-status-codes.md (#11753) 2024-06-26 08:54:00 -05:00
github-actions
bd7d503314 📝 Update release notes 2024-06-26 13:53:37 +00:00
João Pedro Pereira Holanda
95e667a00a 🌐 Add Portuguese translation for docs/pt/docs/tutorial/dependencies/index.md (#11757) 2024-06-26 08:53:12 -05:00
github-actions
e9f4b7975c 📝 Update release notes 2024-06-26 01:52:20 +00:00
Sebastián Ramírez
b08f15048d 🔧 Tweak sponsors: Kong URL (#11765) 2024-06-25 20:52:00 -05:00
github-actions
f497efaf94 📝 Update release notes 2024-06-26 01:46:45 +00:00
Sebastián Ramírez
4711785594 🔧 Tweak sponsors: Kong URL (#11764) 2024-06-25 20:46:25 -05:00
github-actions
a74cb19495 📝 Update release notes 2024-06-26 01:33:22 +00:00
Sebastián Ramírez
913659c80d 🔧 Update sponsors, add Stainless (#11763) 2024-06-25 20:33:01 -05:00
github-actions
c26931ae17 📝 Update release notes 2024-06-20 19:12:54 +00:00
github-actions
06839414fa 📝 Update release notes 2024-06-20 19:10:49 +00:00
João Pedro Pereira Holanda
85bad3303f 🌐 Add Portuguese translation for docs/pt/docs/advanced/settings.md (#11739) 2024-06-20 14:10:31 -05:00
github-actions
26431224d1 📝 Update release notes 2024-06-20 19:09:46 +00:00
Benjamin Vandamme
b7a0fc7e12 🌐 Add French translation for docs/fr/docs/learn/index.md (#11712) 2024-06-20 14:09:17 -05:00
Victor Senna
e62e5e8812 🌐 Add Portuguese translation for docs/pt/docs/how-to/index.md (#11731) 2024-06-20 14:07:51 -05:00
github-actions
33e2fbe20f 📝 Update release notes 2024-06-20 19:07:28 +00:00
Rafael de Oliveira Marques
1b9c402643 🌐 Add Portuguese translation for docs/pt/docs/advanced/additional-responses.md (#11736) 2024-06-20 14:06:58 -05:00
github-actions
653315c496 📝 Update release notes 2024-06-18 02:25:32 +00:00
Sebastián Ramírez
32259588e8 🔧 Update sponsors, add Zuplo (#11729) 2024-06-17 21:25:11 -05:00
github-actions
d3388bb4ae 📝 Update release notes 2024-06-17 14:21:03 +00:00
Sebastián Ramírez
696dedf8e6 🔧 Update Sponsor link: Coherence (#11730) 2024-06-17 14:20:40 +00:00
github-actions
d92a76f315 📝 Update release notes 2024-06-14 15:07:37 +00:00
github-actions
df4291699f 📝 Update release notes 2024-06-14 15:07:16 +00:00
Rafael de Oliveira Marques
a0761e2b16 🌐 Add Portuguese translation for docs/pt/docs/advanced/benchmarks.md (#11713) 2024-06-14 10:07:11 -05:00
Nayeon Kim
9d1f0e3512 🌐 Fix Korean translation for docs/ko/docs/tutorial/response-status-code.md (#11718) 2024-06-14 10:06:53 -05:00
github-actions
343f5539bd 📝 Update release notes 2024-06-14 02:45:32 +00:00
Nayeon Kim
e4d08e9e1f 🌐 Add Korean translation for docs/ko/docs/tutorial/extra-data-types.md (#11711) 2024-06-13 21:45:10 -05:00
github-actions
6257afe304 📝 Update release notes 2024-06-12 23:40:10 +00:00
Alejandra
5422612008 ✏️ Update docs/en/docs/fastapi-cli.md (#11715) 2024-06-12 18:39:50 -05:00
github-actions
a883442ee0 📝 Update release notes 2024-06-12 12:49:59 +00:00
Nayeon Kim
40bb8fac5b 🌐 Fix Korean translation for docs/ko/docs/tutorial/body-nested-models.md (#11710) 2024-06-12 07:49:35 -05:00
github-actions
57c8490b0a 📝 Update release notes 2024-06-12 00:49:10 +00:00
Devon Ray
7030237306 📝 Update External Links (#11500) 2024-06-11 19:47:57 -05:00
github-actions
6bc235b2bb 📝 Update release notes 2024-06-12 00:46:09 +00:00
Eduardo Zepeda
ad2a09f9f5 📝 Add External Link: Tutorial de FastAPI, ¿el mejor framework de Python? (#11618) 2024-06-11 19:45:46 -05:00
github-actions
695601dff4 📝 Update release notes 2024-06-11 23:50:18 +00:00
Ayrton
706d2499b5 🌐 Add Portuguese translation for docs/pt/docs/advanced/fastapi-cli.md (#11641) 2024-06-11 18:49:51 -05:00
github-actions
60d87c0ccb 📝 Update release notes 2024-06-09 02:02:11 +00:00
Walid B
99a491e95c 📝 Fix typo in docs/en/docs/tutorial/body-multiple-params.md (#11698) 2024-06-08 21:01:51 -05:00
github-actions
ceaed0a447 📝 Update release notes 2024-06-05 21:38:20 +00:00
Ishan Anand
6fa46e4256 📝 Add External Link: Deploy a Serverless FastAPI App with Neon Postgres and AWS App Runner at any scale (#11633) 2024-06-05 16:37:59 -05:00
github-actions
a9819dfd8d 📝 Update release notes 2024-06-05 00:08:22 +00:00
Max Su
c5bcb806bb 🌐 Add Traditional Chinese translation for docs/zh-hant/docs/fastapi-people.md (#11639) 2024-06-04 19:07:01 -05:00
github-actions
72346962b0 📝 Update release notes 2024-06-05 00:06:12 +00:00
Hasan Sezer Taşan
e1068116df 🌐 Add Turkish translation for docs/tr/docs/advanced/index.md (#11606) 2024-06-04 19:05:51 -05:00
github-actions
aed266a7ef 📝 Update release notes 2024-06-03 01:48:39 +00:00
Alejandra
00ebe9c841 📝 Update security/first-steps.md (#11674) 2024-06-03 01:48:20 +00:00
github-actions
e3d9f8cfc7 📝 Update release notes 2024-06-03 01:36:06 +00:00
Alejandra
3641c1ea55 📝 Update security/first-steps.md (#11673)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-06-02 20:35:46 -05:00
github-actions
54ab928acd 📝 Update release notes 2024-06-03 01:11:29 +00:00
Sebastián Ramírez
e37dd75485 👥 Update FastAPI People (#11669)
Co-authored-by: github-actions <github-actions@github.com>
2024-06-02 20:09:53 -05:00
github-actions
bcb8e64f67 📝 Update release notes 2024-06-01 21:06:19 +00:00
Alejandra
256426ede1 📝 Update note in path-params-numeric-validations.md (#11672) 2024-06-01 16:05:52 -05:00
github-actions
563b355a75 📝 Update release notes 2024-05-31 02:38:23 +00:00
Sebastián Ramírez
ab8974ef04 📝 Tweak intro docs about Annotated and Query() params (#11664) 2024-05-30 21:38:05 -05:00
github-actions
995bd43619 📝 Update release notes 2024-05-30 13:28:41 +00:00
Sebastián Ramírez
803b9fca98 🔧 Add sponsor Kong (#11662) 2024-05-30 08:28:20 -05:00
github-actions
ba1ac2b1f6 📝 Update release notes 2024-05-28 14:06:23 +00:00
Hasan Sezer Taşan
a751cdd17f 🌐 Add Turkish translation for docs/tr/docs/deployment/cloud.md (#11610) 2024-05-28 09:05:55 -05:00
github-actions
8b4ce06065 📝 Update release notes 2024-05-27 16:23:10 +00:00
github-actions
d523f7f340 📝 Update release notes 2024-05-27 16:22:14 +00:00
github-actions
aadc3e7dc1 📝 Update release notes 2024-05-27 16:21:46 +00:00
Hasan Sezer Taşan
a8a3971a99 🌐 Add Turkish translation for docs/tr/docs/advanced/security/index.md (#11609) 2024-05-27 11:21:37 -05:00
Hasan Sezer Taşan
59b17ce804 🌐 Add Turkish translation for docs/tr/docs/advanced/testing-websockets.md (#11608) 2024-05-27 11:21:03 -05:00
Hasan Sezer Taşan
54d0be2388 🌐 Add Turkish translation for docs/tr/docs/how-to/general.md (#11607) 2024-05-27 11:20:52 -05:00
github-actions
36269edf6a 📝 Update release notes 2024-05-27 16:19:42 +00:00
chaoless
f7a11bc0b4 🌐 Update Chinese translation for docs/zh/docs/advanced/templates.md (#11620) 2024-05-27 11:19:21 -05:00
github-actions
86b410e623 📝 Update release notes 2024-05-23 22:59:22 +00:00
Nir Schulman
a69f38340f 📝 Restored Swagger-UI links to use the latest version possible. (#11459) 2024-05-23 17:59:02 -05:00
github-actions
dda2337722 📝 Update release notes 2024-05-23 22:47:02 +00:00
Hasan Sezer Taşan
f1ab5300a7 🌐 Add Turkish translation for docs/tr/docs/deployment/index.md (#11605) 2024-05-23 17:46:42 -05:00
github-actions
3e6a59183b 📝 Update release notes 2024-05-20 23:57:31 +00:00
Hasan Sezer Taşan
a4c4eb2964 🌐 Add Turkish translation for docs/tr/docs/tutorial/static-files.md (#11599) 2024-05-20 18:57:08 -05:00
github-actions
bfe698c667 📝 Update release notes 2024-05-20 17:37:51 +00:00
Esteban Maya
5fa8e38681 📝 Update JWT auth documentation to use PyJWT instead of pyhon-jose (#11589)
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-05-20 10:37:28 -07:00
github-actions
710b320fd0 📝 Update release notes 2024-05-20 00:25:11 +00:00
Alejandra
651dd00a9e 📝 Update docs (#11603)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-05-19 17:24:48 -07:00
github-actions
ca321db5db 📝 Update release notes 2024-05-18 23:43:36 +00:00
Hasan Sezer Taşan
76d0d81e70 ✏️ Fix typo: convert every 're-use' to 'reuse'. (#11598) 2024-05-18 18:43:13 -05:00
github-actions
ad85917f61 📝 Update release notes 2024-05-18 00:52:09 +00:00
Igor Sulim
22b033ebd7 🌐 Polish translation for docs/pl/docs/fastapi-people.md (#10196) 2024-05-17 19:50:03 -05:00
github-actions
d4ce9d5a4a 📝 Update release notes 2024-05-18 00:49:30 +00:00
Hasan Sezer Taşan
23bc02c45a 🌐 Add Turkish translation for docs/tr/docs/advanced/wsgi.md (#11575) 2024-05-17 19:49:03 -05:00
github-actions
1dae11ce50 📝 Update release notes 2024-05-18 00:48:23 +00:00
Petar Marić
817cc1d754 ✏️ Fix typo in fastapi/applications.py (#11593) 2024-05-17 19:48:03 -05:00
github-actions
a32902606e 📝 Update release notes 2024-05-14 19:35:25 +00:00
Hasan Sezer Taşan
61ab73ea0f 🌐 Add Turkish translation for docs/tr/docs/tutorial/cookie-params.md (#11561) 2024-05-14 14:35:04 -05:00
github-actions
038e1142d7 📝 Update release notes 2024-05-13 00:58:56 +00:00
s111d
dfa75c1587 🌐 Add Russian translation for docs/ru/docs/about/index.md (#10961) 2024-05-12 19:58:32 -05:00
github-actions
af60d6d8ea 📝 Update release notes 2024-05-10 01:06:55 +00:00
Sebastián Ramírez
efeee95db7 👷 Update Smokeshow, fix sync download artifact and smokeshow configs (#11563) 2024-05-09 18:06:31 -07:00
github-actions
2c6fb2ecd1 📝 Update release notes 2024-05-10 00:49:28 +00:00
Sebastián Ramírez
1f0eecba81 👷 Update Smokeshow download artifact GitHub Action (#11562) 2024-05-09 17:48:58 -07:00
github-actions
e82e6479f2 📝 Update release notes 2024-05-10 00:30:46 +00:00
Tamir Duberstein
722107fe60 👷 Update GitHub actions to download and upload artifacts to v4, for docs and coverage (#11550)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-05-09 17:30:25 -07:00
github-actions
9642ff2637 📝 Update release notes 2024-05-08 19:11:08 +00:00
Hasan Sezer Taşan
8187c54c73 🌐 Add Turkish translation for docs/tr/docs/tutorial/request-forms.md (#11553) 2024-05-08 14:10:46 -05:00
github-actions
17c1ae886b 📝 Update release notes 2024-05-07 21:00:47 +00:00
chaoless
c4f6439888 🌐 Update Chinese translation for docs/zh/docs/tutorial/sql-databases.md (#11539) 2024-05-07 16:00:22 -05:00
github-actions
8c2e9ddd50 📝 Update release notes 2024-05-07 18:31:47 +00:00
Sebastián Ramírez
aa50dc200f 👷 Tweak CI for test-redistribute, add needed env vars for slim (#11549) 2024-05-07 11:31:27 -07:00
github-actions
e04d397e32 📝 Update release notes 2024-05-05 21:35:58 +00:00
Lucas-lyh
0c82015a8c 🌐 Add Chinese translation for docs/zh/docs/how-to/configure-swagger-ui.md (#11501) 2024-05-05 16:34:13 -05:00
github-actions
e688c57f30 📝 Update release notes 2024-05-05 21:33:20 +00:00
Nick Chen
6ec46c17d3 🌐 Update Chinese translation for /docs/advanced/security/http-basic-auth.md (#11512) 2024-05-05 16:32:54 -05:00
github-actions
8c572a9ef2 📝 Update release notes 2024-05-03 23:25:42 +00:00
Sofie Van Landeghem
9406e822ec ✏️ Fix link in fastapi-cli.md (#11524)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2024-05-03 16:25:16 -07:00
github-actions
f243315696 📝 Update release notes 2024-05-03 22:21:32 +00:00
Sebastián Ramírez
96b1625eed 👥 Update FastAPI People (#11511)
Co-authored-by: github-actions <github-actions@github.com>
2024-05-03 17:21:11 -05:00
Sebastián Ramírez
1c3e691875 📝 Update release notes 2024-05-02 17:20:30 -07:00
Sebastián Ramírez
ab8f557250 📝 Update release notes 2024-05-02 17:16:02 -07:00
Sebastián Ramírez
67da3bb52e 🔖 Release version 0.111.0 2024-05-02 15:50:18 -07:00
github-actions
9ed94e4f68 📝 Update release notes 2024-05-02 22:37:53 +00:00
Sebastián Ramírez
d71be59217 Add FastAPI CLI, the new fastapi command (#11522) 2024-05-02 15:37:31 -07:00
github-actions
a94ef3351e 📝 Update release notes 2024-04-30 06:38:41 +00:00
Sebastián Ramírez
ea1f2190d3 🔧 Add configs and setup for fastapi-slim including optional extras fastapi-slim[standard], and fastapi including by default the same standard extras (#11503) 2024-04-29 23:38:13 -07:00
Sebastián Ramírez
32be95dd86 🔖 Release version 0.110.3 2024-04-29 17:34:06 -07:00
Sebastián Ramírez
92b67b1b29 📝 Update release notes 2024-04-29 17:33:37 -07:00
Sebastián Ramírez
e0a9692261 📝 Update release notes 2024-04-29 17:31:58 -07:00
github-actions
62f82296f3 📝 Update release notes 2024-04-30 00:03:35 +00:00
Sebastián Ramírez
f49da74200 🔨 Update internal scripts and remove unused ones (#11499) 2024-04-29 17:03:14 -07:00
github-actions
13ce009e9a 📝 Update release notes 2024-04-29 23:49:03 +00:00
Sebastián Ramírez
41fcbc7d00 🔧 Migrate from Hatch to PDM for the internal build (#11498) 2024-04-29 16:48:42 -07:00
github-actions
bec2ec7e4c 📝 Update release notes 2024-04-29 05:18:26 +00:00
Sebastián Ramírez
7b55bf37b5 📝 Update references to Python version, FastAPI supports all the current versions, no need to make the version explicit (#11496) 2024-04-28 22:18:04 -07:00
github-actions
285ac017a9 📝 Update release notes 2024-04-28 00:28:00 +00:00
dependabot[bot]
d1293b8786 ⬆ Bump mkdocstrings[python] from 0.23.0 to 0.24.3 (#11469)
Bumps [mkdocstrings[python]](https://github.com/mkdocstrings/mkdocstrings) from 0.23.0 to 0.24.3.
- [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.23.0...0.24.3)

---
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>
2024-04-27 19:27:34 -05:00
github-actions
1d41a7d2df 📝 Update release notes 2024-04-27 14:31:16 +00:00
Ian Chiu
8045f34c52 🌐 Add Traditional Chinese translation for docs/zh-hant/benchmarks.md (#11484) 2024-04-27 09:30:56 -05:00
github-actions
b254688f37 📝 Update release notes 2024-04-25 17:10:18 +00:00
Bill Zhong
026af6e248 🌐 Update Chinese translation for docs/zh/docs/fastapi-people.md (#11476) 2024-04-25 12:09:48 -05:00
github-actions
38929aae1b 📝 Update release notes 2024-04-23 22:29:42 +00:00
ch33zer
550092a3bd ✏️ Fix typo in fastapi/security/api_key.py (#11481) 2024-04-23 17:29:18 -05:00
github-actions
5c054fdd65 📝 Update release notes 2024-04-22 23:41:32 +00:00
Bill Zhong
943159afb0 🌐 Add Chinese translation for docs/zh/docs/how-to/index.md and docs/zh/docs/how-to/general.md (#11443) 2024-04-22 18:41:09 -05:00
github-actions
91dad1cb3a 📝 Update release notes 2024-04-19 19:30:49 +00:00
Fabian Falon
1551913223 🌐 Add Spanish translation for cookie-params docs/es/docs/tutorial/cookie-params.md (#11410) 2024-04-19 14:30:26 -05:00
github-actions
e00d29e784 📝 Update release notes 2024-04-19 15:30:04 +00:00
Omar Mokhtar
ce1fb1a23b ✏️ Fix typo in security/http.py (#11455) 2024-04-19 10:29:38 -05:00
github-actions
25c692d77d 📝 Update release notes 2024-04-19 01:03:14 +00:00
Sebastián Ramírez
2f686ce1e5 ⬆️ Upgrade MkDocs Material and re-enable cards (#11466) 2024-04-18 19:56:59 -05:00
github-actions
14442d356f 📝 Update release notes 2024-04-19 00:46:03 +00:00
dependabot[bot]
11f95ddef6 ⬆ Bump pillow from 10.2.0 to 10.3.0 (#11403)
Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.2.0 to 10.3.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.2.0...10.3.0)

---
updated-dependencies:
- dependency-name: pillow
  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-04-18 19:43:24 -05:00
github-actions
fb165a55f0 📝 Update release notes 2024-04-19 00:42:15 +00:00
Sebastián Ramírez
1aedc6e29d 🔧 Ungroup dependabot updates (#11465) 2024-04-18 19:41:55 -05:00
1858 changed files with 128020 additions and 90134 deletions

View File

@@ -0,0 +1,45 @@
labels: [lang-all]
body:
- type: markdown
attributes:
value: |
Thanks for your interest in helping translate the FastAPI docs! 🌍
Please follow these instructions carefully to propose a new language translation. 🙏
This structured process helps ensure translations can be properly maintained long-term.
- type: checkboxes
id: checks
attributes:
label: Initial Checks
description: Please confirm and check all the following options.
options:
- label: I checked that this language is not already being translated in FastAPI docs.
required: true
- label: I searched existing discussions to ensure no one else proposed this language.
required: true
- label: I am a native speaker of the language I want to help translate.
required: true
- type: input
id: language
attributes:
label: Target Language
description: What language do you want to translate the FastAPI docs into?
placeholder: e.g. Latin
validations:
required: true
- type: textarea
id: additional_info
attributes:
label: Additional Information
description: Any other relevant information about your translation proposal
- type: markdown
attributes:
value: |
Translations are automatized with AI and then reviewed by native speakers. 🤖 🙋
This allows us to keep them consistent and up-to-date.
If there are several native speakers commenting on this discussion and
committing to help review new translations, the FastAPI team will review it
and potentially make it an official translation. 😎

View File

@@ -4,13 +4,13 @@ contact_links:
about: Please report security vulnerabilities to security@tiangolo.com
- name: Question or Problem
about: Ask a question or ask about a problem in GitHub Discussions.
url: https://github.com/tiangolo/fastapi/discussions/categories/questions
url: https://github.com/fastapi/fastapi/discussions/categories/questions
- name: Feature Request
about: To suggest an idea or ask about a feature, please start with a question saying what you would like to achieve. There might be a way to do it already.
url: https://github.com/tiangolo/fastapi/discussions/categories/questions
url: https://github.com/fastapi/fastapi/discussions/categories/questions
- name: Show and tell
about: Show what you built with FastAPI or to be used with FastAPI.
url: https://github.com/tiangolo/fastapi/discussions/categories/show-and-tell
url: https://github.com/fastapi/fastapi/discussions/categories/show-and-tell
- name: Translations
about: Coordinate translations in GitHub Discussions.
url: https://github.com/tiangolo/fastapi/discussions/categories/translations
url: https://github.com/fastapi/fastapi/discussions/categories/translations

View File

@@ -6,7 +6,7 @@ body:
value: |
Thanks for your interest in FastAPI! 🚀
If you are not @tiangolo or he didn't ask you directly to create an issue here, please start the conversation in a [Question in GitHub Discussions](https://github.com/tiangolo/fastapi/discussions/categories/questions) instead.
If you are not @tiangolo or he didn't ask you directly to create an issue here, please start the conversation in a [Question in GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions) instead.
- type: checkboxes
id: privileged
attributes:

View File

@@ -1,9 +0,0 @@
FROM python:3.10
COPY ./requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt
COPY ./app /app
CMD ["python", "/app/main.py"]

View File

@@ -1,13 +0,0 @@
name: Comment Docs Preview in PR
description: Comment with the docs URL preview in the PR
author: Sebastián Ramírez <tiangolo@gmail.com>
inputs:
token:
description: Token for the repo. Can be passed in using {{ secrets.GITHUB_TOKEN }}
required: true
deploy_url:
description: The deployment URL to comment in the PR
required: true
runs:
using: docker
image: Dockerfile

View File

@@ -1,69 +0,0 @@
import logging
import sys
from pathlib import Path
from typing import Union
import httpx
from github import Github
from github.PullRequest import PullRequest
from pydantic import BaseModel, SecretStr, ValidationError
from pydantic_settings import BaseSettings
github_api = "https://api.github.com"
class Settings(BaseSettings):
github_repository: str
github_event_path: Path
github_event_name: Union[str, None] = None
input_token: SecretStr
input_deploy_url: str
class PartialGithubEventHeadCommit(BaseModel):
id: str
class PartialGithubEventWorkflowRun(BaseModel):
head_commit: PartialGithubEventHeadCommit
class PartialGithubEvent(BaseModel):
workflow_run: PartialGithubEventWorkflowRun
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
settings = Settings()
logging.info(f"Using config: {settings.json()}")
g = Github(settings.input_token.get_secret_value())
repo = g.get_repo(settings.github_repository)
try:
event = PartialGithubEvent.parse_file(settings.github_event_path)
except ValidationError as e:
logging.error(f"Error parsing event file: {e.errors()}")
sys.exit(0)
use_pr: Union[PullRequest, None] = None
for pr in repo.get_pulls():
if pr.head.sha == event.workflow_run.head_commit.id:
use_pr = pr
break
if not use_pr:
logging.error(f"No PR found for hash: {event.workflow_run.head_commit.id}")
sys.exit(0)
github_headers = {
"Authorization": f"token {settings.input_token.get_secret_value()}"
}
url = f"{github_api}/repos/{settings.github_repository}/issues/{use_pr.number}/comments"
logging.info(f"Using comments URL: {url}")
response = httpx.post(
url,
headers=github_headers,
json={
"body": f"📝 Docs preview for commit {use_pr.head.sha} at: {settings.input_deploy_url}"
},
)
if not (200 <= response.status_code <= 300):
logging.error(f"Error posting comment: {response.text}")
sys.exit(1)
logging.info("Finished")

View File

@@ -1,4 +0,0 @@
PyGithub
pydantic>=2.5.3,<3.0.0
pydantic-settings>=2.1.0,<3.0.0
httpx

View File

@@ -1,7 +0,0 @@
FROM python:3.9
RUN pip install httpx PyGithub "pydantic==1.5.1" "pyyaml>=5.3.1,<6.0.0"
COPY ./app /app
CMD ["python", "/app/main.py"]

View File

@@ -1,10 +0,0 @@
name: "Notify Translations"
description: "Notify in the issue for a translation when there's a new PR available"
author: "Sebastián Ramírez <tiangolo@gmail.com>"
inputs:
token:
description: 'Token, to read the GitHub API. Can be passed in using {{ secrets.GITHUB_TOKEN }}'
required: true
runs:
using: 'docker'
image: 'Dockerfile'

View File

@@ -1,7 +0,0 @@
FROM python:3.9
RUN pip install httpx PyGithub "pydantic==2.0.2" pydantic-settings "pyyaml>=5.3.1,<6.0.0"
COPY ./app /app
CMD ["python", "/app/main.py"]

View File

@@ -1,10 +0,0 @@
name: "Generate FastAPI People"
description: "Generate the data for the FastAPI People page"
author: "Sebastián Ramírez <tiangolo@gmail.com>"
inputs:
token:
description: 'User token, to read the GitHub API. Can be passed in using {{ secrets.FASTAPI_PEOPLE }}'
required: true
runs:
using: 'docker'
image: 'Dockerfile'

View File

@@ -1,682 +0,0 @@
import logging
import subprocess
import sys
from collections import Counter, defaultdict
from datetime import datetime, timedelta, timezone
from pathlib import Path
from typing import Any, Container, DefaultDict, Dict, List, Set, Union
import httpx
import yaml
from github import Github
from pydantic import BaseModel, SecretStr
from pydantic_settings import BaseSettings
github_graphql_url = "https://api.github.com/graphql"
questions_category_id = "MDE4OkRpc2N1c3Npb25DYXRlZ29yeTMyMDAxNDM0"
discussions_query = """
query Q($after: String, $category_id: ID) {
repository(name: "fastapi", owner: "tiangolo") {
discussions(first: 100, after: $after, categoryId: $category_id) {
edges {
cursor
node {
number
author {
login
avatarUrl
url
}
title
createdAt
comments(first: 100) {
nodes {
createdAt
author {
login
avatarUrl
url
}
isAnswer
replies(first: 10) {
nodes {
createdAt
author {
login
avatarUrl
url
}
}
}
}
}
}
}
}
}
}
"""
prs_query = """
query Q($after: String) {
repository(name: "fastapi", owner: "tiangolo") {
pullRequests(first: 100, after: $after) {
edges {
cursor
node {
number
labels(first: 100) {
nodes {
name
}
}
author {
login
avatarUrl
url
}
title
createdAt
state
comments(first: 100) {
nodes {
createdAt
author {
login
avatarUrl
url
}
}
}
reviews(first:100) {
nodes {
author {
login
avatarUrl
url
}
state
}
}
}
}
}
}
}
"""
sponsors_query = """
query Q($after: String) {
user(login: "tiangolo") {
sponsorshipsAsMaintainer(first: 100, after: $after) {
edges {
cursor
node {
sponsorEntity {
... on Organization {
login
avatarUrl
url
}
... on User {
login
avatarUrl
url
}
}
tier {
name
monthlyPriceInDollars
}
}
}
}
}
}
"""
class Author(BaseModel):
login: str
avatarUrl: str
url: str
# Discussions
class CommentsNode(BaseModel):
createdAt: datetime
author: Union[Author, None] = None
class Replies(BaseModel):
nodes: List[CommentsNode]
class DiscussionsCommentsNode(CommentsNode):
replies: Replies
class Comments(BaseModel):
nodes: List[CommentsNode]
class DiscussionsComments(BaseModel):
nodes: List[DiscussionsCommentsNode]
class DiscussionsNode(BaseModel):
number: int
author: Union[Author, None] = None
title: str
createdAt: datetime
comments: DiscussionsComments
class DiscussionsEdge(BaseModel):
cursor: str
node: DiscussionsNode
class Discussions(BaseModel):
edges: List[DiscussionsEdge]
class DiscussionsRepository(BaseModel):
discussions: Discussions
class DiscussionsResponseData(BaseModel):
repository: DiscussionsRepository
class DiscussionsResponse(BaseModel):
data: DiscussionsResponseData
# PRs
class LabelNode(BaseModel):
name: str
class Labels(BaseModel):
nodes: List[LabelNode]
class ReviewNode(BaseModel):
author: Union[Author, None] = None
state: str
class Reviews(BaseModel):
nodes: List[ReviewNode]
class PullRequestNode(BaseModel):
number: int
labels: Labels
author: Union[Author, None] = None
title: str
createdAt: datetime
state: str
comments: Comments
reviews: Reviews
class PullRequestEdge(BaseModel):
cursor: str
node: PullRequestNode
class PullRequests(BaseModel):
edges: List[PullRequestEdge]
class PRsRepository(BaseModel):
pullRequests: PullRequests
class PRsResponseData(BaseModel):
repository: PRsRepository
class PRsResponse(BaseModel):
data: PRsResponseData
# Sponsors
class SponsorEntity(BaseModel):
login: str
avatarUrl: str
url: str
class Tier(BaseModel):
name: str
monthlyPriceInDollars: float
class SponsorshipAsMaintainerNode(BaseModel):
sponsorEntity: SponsorEntity
tier: Tier
class SponsorshipAsMaintainerEdge(BaseModel):
cursor: str
node: SponsorshipAsMaintainerNode
class SponsorshipAsMaintainer(BaseModel):
edges: List[SponsorshipAsMaintainerEdge]
class SponsorsUser(BaseModel):
sponsorshipsAsMaintainer: SponsorshipAsMaintainer
class SponsorsResponseData(BaseModel):
user: SponsorsUser
class SponsorsResponse(BaseModel):
data: SponsorsResponseData
class Settings(BaseSettings):
input_token: SecretStr
github_repository: str
httpx_timeout: int = 30
def get_graphql_response(
*,
settings: Settings,
query: str,
after: Union[str, None] = None,
category_id: Union[str, None] = None,
) -> Dict[str, Any]:
headers = {"Authorization": f"token {settings.input_token.get_secret_value()}"}
# category_id is only used by one query, but GraphQL allows unused variables, so
# keep it here for simplicity
variables = {"after": after, "category_id": category_id}
response = httpx.post(
github_graphql_url,
headers=headers,
timeout=settings.httpx_timeout,
json={"query": query, "variables": variables, "operationName": "Q"},
)
if response.status_code != 200:
logging.error(
f"Response was not 200, after: {after}, category_id: {category_id}"
)
logging.error(response.text)
raise RuntimeError(response.text)
data = response.json()
if "errors" in data:
logging.error(f"Errors in response, after: {after}, category_id: {category_id}")
logging.error(data["errors"])
logging.error(response.text)
raise RuntimeError(response.text)
return data
def get_graphql_question_discussion_edges(
*,
settings: Settings,
after: Union[str, None] = None,
):
data = get_graphql_response(
settings=settings,
query=discussions_query,
after=after,
category_id=questions_category_id,
)
graphql_response = DiscussionsResponse.model_validate(data)
return graphql_response.data.repository.discussions.edges
def get_graphql_pr_edges(*, settings: Settings, after: Union[str, None] = None):
data = get_graphql_response(settings=settings, query=prs_query, after=after)
graphql_response = PRsResponse.model_validate(data)
return graphql_response.data.repository.pullRequests.edges
def get_graphql_sponsor_edges(*, settings: Settings, after: Union[str, None] = None):
data = get_graphql_response(settings=settings, query=sponsors_query, after=after)
graphql_response = SponsorsResponse.model_validate(data)
return graphql_response.data.user.sponsorshipsAsMaintainer.edges
class DiscussionExpertsResults(BaseModel):
commenters: Counter
last_month_commenters: Counter
three_months_commenters: Counter
six_months_commenters: Counter
one_year_commenters: Counter
authors: Dict[str, Author]
def get_discussion_nodes(settings: Settings) -> List[DiscussionsNode]:
discussion_nodes: List[DiscussionsNode] = []
discussion_edges = get_graphql_question_discussion_edges(settings=settings)
while discussion_edges:
for discussion_edge in discussion_edges:
discussion_nodes.append(discussion_edge.node)
last_edge = discussion_edges[-1]
discussion_edges = get_graphql_question_discussion_edges(
settings=settings, after=last_edge.cursor
)
return discussion_nodes
def get_discussions_experts(
discussion_nodes: List[DiscussionsNode],
) -> DiscussionExpertsResults:
commenters = Counter()
last_month_commenters = Counter()
three_months_commenters = Counter()
six_months_commenters = Counter()
one_year_commenters = Counter()
authors: Dict[str, Author] = {}
now = datetime.now(tz=timezone.utc)
one_month_ago = now - timedelta(days=30)
three_months_ago = now - timedelta(days=90)
six_months_ago = now - timedelta(days=180)
one_year_ago = now - timedelta(days=365)
for discussion in discussion_nodes:
discussion_author_name = None
if discussion.author:
authors[discussion.author.login] = discussion.author
discussion_author_name = discussion.author.login
discussion_commentors: dict[str, datetime] = {}
for comment in discussion.comments.nodes:
if comment.author:
authors[comment.author.login] = comment.author
if comment.author.login != discussion_author_name:
author_time = discussion_commentors.get(
comment.author.login, comment.createdAt
)
discussion_commentors[comment.author.login] = max(
author_time, comment.createdAt
)
for reply in comment.replies.nodes:
if reply.author:
authors[reply.author.login] = reply.author
if reply.author.login != discussion_author_name:
author_time = discussion_commentors.get(
reply.author.login, reply.createdAt
)
discussion_commentors[reply.author.login] = max(
author_time, reply.createdAt
)
for author_name, author_time in discussion_commentors.items():
commenters[author_name] += 1
if author_time > one_month_ago:
last_month_commenters[author_name] += 1
if author_time > three_months_ago:
three_months_commenters[author_name] += 1
if author_time > six_months_ago:
six_months_commenters[author_name] += 1
if author_time > one_year_ago:
one_year_commenters[author_name] += 1
discussion_experts_results = DiscussionExpertsResults(
authors=authors,
commenters=commenters,
last_month_commenters=last_month_commenters,
three_months_commenters=three_months_commenters,
six_months_commenters=six_months_commenters,
one_year_commenters=one_year_commenters,
)
return discussion_experts_results
def get_pr_nodes(settings: Settings) -> List[PullRequestNode]:
pr_nodes: List[PullRequestNode] = []
pr_edges = get_graphql_pr_edges(settings=settings)
while pr_edges:
for edge in pr_edges:
pr_nodes.append(edge.node)
last_edge = pr_edges[-1]
pr_edges = get_graphql_pr_edges(settings=settings, after=last_edge.cursor)
return pr_nodes
class ContributorsResults(BaseModel):
contributors: Counter
commenters: Counter
reviewers: Counter
translation_reviewers: Counter
authors: Dict[str, Author]
def get_contributors(pr_nodes: List[PullRequestNode]) -> ContributorsResults:
contributors = Counter()
commenters = Counter()
reviewers = Counter()
translation_reviewers = Counter()
authors: Dict[str, Author] = {}
for pr in pr_nodes:
author_name = None
if pr.author:
authors[pr.author.login] = pr.author
author_name = pr.author.login
pr_commentors: Set[str] = set()
pr_reviewers: Set[str] = set()
for comment in pr.comments.nodes:
if comment.author:
authors[comment.author.login] = comment.author
if comment.author.login == author_name:
continue
pr_commentors.add(comment.author.login)
for author_name in pr_commentors:
commenters[author_name] += 1
for review in pr.reviews.nodes:
if review.author:
authors[review.author.login] = review.author
pr_reviewers.add(review.author.login)
for label in pr.labels.nodes:
if label.name == "lang-all":
translation_reviewers[review.author.login] += 1
break
for reviewer in pr_reviewers:
reviewers[reviewer] += 1
if pr.state == "MERGED" and pr.author:
contributors[pr.author.login] += 1
return ContributorsResults(
contributors=contributors,
commenters=commenters,
reviewers=reviewers,
translation_reviewers=translation_reviewers,
authors=authors,
)
def get_individual_sponsors(settings: Settings):
nodes: List[SponsorshipAsMaintainerNode] = []
edges = get_graphql_sponsor_edges(settings=settings)
while edges:
for edge in edges:
nodes.append(edge.node)
last_edge = edges[-1]
edges = get_graphql_sponsor_edges(settings=settings, after=last_edge.cursor)
tiers: DefaultDict[float, Dict[str, SponsorEntity]] = defaultdict(dict)
for node in nodes:
tiers[node.tier.monthlyPriceInDollars][
node.sponsorEntity.login
] = node.sponsorEntity
return tiers
def get_top_users(
*,
counter: Counter,
authors: Dict[str, Author],
skip_users: Container[str],
min_count: int = 2,
):
users = []
for commenter, count in counter.most_common(50):
if commenter in skip_users:
continue
if count >= min_count:
author = authors[commenter]
users.append(
{
"login": commenter,
"count": count,
"avatarUrl": author.avatarUrl,
"url": author.url,
}
)
return users
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
settings = Settings()
logging.info(f"Using config: {settings.model_dump_json()}")
g = Github(settings.input_token.get_secret_value())
repo = g.get_repo(settings.github_repository)
discussion_nodes = get_discussion_nodes(settings=settings)
experts_results = get_discussions_experts(discussion_nodes=discussion_nodes)
pr_nodes = get_pr_nodes(settings=settings)
contributors_results = get_contributors(pr_nodes=pr_nodes)
authors = {**experts_results.authors, **contributors_results.authors}
maintainers_logins = {"tiangolo"}
bot_names = {"codecov", "github-actions", "pre-commit-ci", "dependabot"}
maintainers = []
for login in maintainers_logins:
user = authors[login]
maintainers.append(
{
"login": login,
"answers": experts_results.commenters[login],
"prs": contributors_results.contributors[login],
"avatarUrl": user.avatarUrl,
"url": user.url,
}
)
skip_users = maintainers_logins | bot_names
experts = get_top_users(
counter=experts_results.commenters,
authors=authors,
skip_users=skip_users,
)
last_month_experts = get_top_users(
counter=experts_results.last_month_commenters,
authors=authors,
skip_users=skip_users,
)
three_months_experts = get_top_users(
counter=experts_results.three_months_commenters,
authors=authors,
skip_users=skip_users,
)
six_months_experts = get_top_users(
counter=experts_results.six_months_commenters,
authors=authors,
skip_users=skip_users,
)
one_year_experts = get_top_users(
counter=experts_results.one_year_commenters,
authors=authors,
skip_users=skip_users,
)
top_contributors = get_top_users(
counter=contributors_results.contributors,
authors=authors,
skip_users=skip_users,
)
top_reviewers = get_top_users(
counter=contributors_results.reviewers,
authors=authors,
skip_users=skip_users,
)
top_translations_reviewers = get_top_users(
counter=contributors_results.translation_reviewers,
authors=authors,
skip_users=skip_users,
)
tiers = get_individual_sponsors(settings=settings)
keys = list(tiers.keys())
keys.sort(reverse=True)
sponsors = []
for key in keys:
sponsor_group = []
for login, sponsor in tiers[key].items():
sponsor_group.append(
{"login": login, "avatarUrl": sponsor.avatarUrl, "url": sponsor.url}
)
sponsors.append(sponsor_group)
people = {
"maintainers": maintainers,
"experts": experts,
"last_month_experts": last_month_experts,
"three_months_experts": three_months_experts,
"six_months_experts": six_months_experts,
"one_year_experts": one_year_experts,
"top_contributors": top_contributors,
"top_reviewers": top_reviewers,
"top_translations_reviewers": top_translations_reviewers,
}
github_sponsors = {
"sponsors": sponsors,
}
# For local development
# people_path = Path("../../../../docs/en/data/people.yml")
people_path = Path("./docs/en/data/people.yml")
github_sponsors_path = Path("./docs/en/data/github_sponsors.yml")
people_old_content = people_path.read_text(encoding="utf-8")
github_sponsors_old_content = github_sponsors_path.read_text(encoding="utf-8")
new_people_content = yaml.dump(
people, sort_keys=False, width=200, allow_unicode=True
)
new_github_sponsors_content = yaml.dump(
github_sponsors, sort_keys=False, width=200, allow_unicode=True
)
if (
people_old_content == new_people_content
and github_sponsors_old_content == new_github_sponsors_content
):
logging.info("The FastAPI People data hasn't changed, finishing.")
sys.exit(0)
people_path.write_text(new_people_content, encoding="utf-8")
github_sponsors_path.write_text(new_github_sponsors_content, encoding="utf-8")
logging.info("Setting up GitHub Actions git user")
subprocess.run(["git", "config", "user.name", "github-actions"], check=True)
subprocess.run(
["git", "config", "user.email", "github-actions@github.com"], check=True
)
branch_name = "fastapi-people"
logging.info(f"Creating a new branch {branch_name}")
subprocess.run(["git", "checkout", "-b", branch_name], check=True)
logging.info("Adding updated file")
subprocess.run(
["git", "add", str(people_path), str(github_sponsors_path)], check=True
)
logging.info("Committing updated file")
message = "👥 Update FastAPI People"
result = subprocess.run(["git", "commit", "-m", message], check=True)
logging.info("Pushing branch")
subprocess.run(["git", "push", "origin", branch_name], check=True)
logging.info("Creating PR")
pr = repo.create_pull(title=message, body=message, base="master", head=branch_name)
logging.info(f"Created PR: {pr.number}")
logging.info("Finished")

View File

@@ -12,9 +12,5 @@ updates:
directory: "/"
schedule:
interval: "monthly"
groups:
python-packages:
patterns:
- "*"
commit-message:
prefix:

39
.github/labeler.yml vendored Normal file
View File

@@ -0,0 +1,39 @@
docs:
- all:
- changed-files:
- any-glob-to-any-file:
- docs/en/docs/**
- docs_src/**
- all-globs-to-all-files:
- '!fastapi/**'
- '!pyproject.toml'
- '!docs/en/data/sponsors.yml'
- '!docs/en/overrides/main.html'
lang-all:
- all:
- changed-files:
- any-glob-to-any-file:
- docs/*/docs/**
- all-globs-to-all-files:
- '!docs/en/docs/**'
- '!docs/*/**/_*.md'
- '!fastapi/**'
- '!pyproject.toml'
internal:
- all:
- changed-files:
- any-glob-to-any-file:
- .github/**
- scripts/**
- .gitignore
- .pre-commit-config.yaml
- pdm_build.py
- requirements*.txt
- docs/en/data/sponsors.yml
- docs/en/overrides/main.html
- all-globs-to-all-files:
- '!docs/*/docs/**'
- '!fastapi/**'
- '!pyproject.toml'

18
.github/workflows/add-to-project.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
name: Add to Project
on:
pull_request_target:
issues:
types:
- opened
- reopened
jobs:
add-to-project:
name: Add to project
runs-on: ubuntu-latest
steps:
- uses: actions/add-to-project@v1.0.2
with:
project-url: https://github.com/orgs/fastapi/projects/2
github-token: ${{ secrets.PROJECTS_TOKEN }}

View File

@@ -7,6 +7,10 @@ on:
types:
- opened
- synchronize
env:
UV_SYSTEM_PYTHON: 1
jobs:
changes:
runs-on: ubuntu-latest
@@ -17,8 +21,8 @@ jobs:
outputs:
docs: ${{ steps.filter.outputs.docs }}
steps:
- uses: actions/checkout@v4
# For pull requests it's not necessary to checkout the code but for master it is
- uses: actions/checkout@v6
# For pull requests it's not necessary to checkout the code but for the main branch it is
- uses: dorny/paths-filter@v3
id: filter
with:
@@ -30,9 +34,10 @@ jobs:
- requirements-docs.txt
- pyproject.toml
- mkdocs.yml
- mkdocs.insiders.yml
- mkdocs.env.yml
- .github/workflows/build-docs.yml
- .github/workflows/deploy-docs.yml
- scripts/mkdocs_hooks.py
langs:
needs:
- changes
@@ -40,26 +45,21 @@ jobs:
outputs:
langs: ${{ steps.show-langs.outputs.langs }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: "3.11"
- uses: actions/cache@v4
id: cache
- name: Setup uv
uses: astral-sh/setup-uv@v7
with:
path: ${{ env.pythonLocation }}
key: ${{ runner.os }}-python-docs-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'requirements-docs.txt', 'requirements-docs-tests.txt') }}-v07
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
# Install MkDocs Material Insiders here just to put it in the cache for the rest of the steps
- name: Install Material for MkDocs Insiders
if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' ) && steps.cache.outputs.cache-hit != 'true'
run: |
pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/squidfunk/mkdocs-material-insiders.git
pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/griffe-typing-deprecated.git
pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/mkdocstrings-python.git
run: uv pip install -r requirements-docs.txt
- name: Verify Docs
run: python ./scripts/docs.py verify-docs
- name: Export Language Codes
@@ -81,25 +81,21 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: "3.11"
- uses: actions/cache@v4
id: cache
- name: Setup uv
uses: astral-sh/setup-uv@v7
with:
path: ${{ env.pythonLocation }}
key: ${{ runner.os }}-python-docs-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'requirements-docs.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
- name: Install Material for MkDocs Insiders
if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' ) && steps.cache.outputs.cache-hit != 'true'
run: |
pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/squidfunk/mkdocs-material-insiders.git
pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/griffe-typing-deprecated.git
pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/mkdocstrings-python.git
run: uv pip install -r requirements-docs.txt
- name: Update Languages
run: python ./scripts/docs.py update-languages
- uses: actions/cache@v4
@@ -108,10 +104,11 @@ jobs:
path: docs/${{ matrix.lang }}/.cache
- name: Build Docs
run: python ./scripts/docs.py build-lang ${{ matrix.lang }}
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v5
with:
name: docs-site
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

53
.github/workflows/contributors.yml vendored Normal file
View File

@@ -0,0 +1,53 @@
name: FastAPI People Contributors
on:
schedule:
- cron: "0 3 1 * *"
workflow_dispatch:
inputs:
debug_enabled:
description: "Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)"
required: false
default: "false"
env:
UV_SYSTEM_PYTHON: 1
jobs:
job:
if: github.repository_owner == 'fastapi'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
cache-dependency-glob: |
requirements**.txt
pyproject.toml
- name: Install Dependencies
run: uv pip install -r requirements-github-actions.txt
# Allow debugging with tmate
- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }}
with:
limit-access-to-actor: true
env:
GITHUB_TOKEN: ${{ secrets.FASTAPI_PR_TOKEN }}
- name: FastAPI People Contributors
run: python ./scripts/contributors.py
env:
GITHUB_TOKEN: ${{ secrets.FASTAPI_PR_TOKEN }}

View File

@@ -6,6 +6,15 @@ on:
types:
- completed
permissions:
deployments: write
issues: write
pull-requests: write
statuses: write
env:
UV_SYSTEM_PYTHON: 1
jobs:
deploy-docs:
runs-on: ubuntu-latest
@@ -14,35 +23,64 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
uses: astral-sh/setup-uv@v7
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: 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 }}
STATE: "pending"
- name: Clean site
run: |
rm -rf ./site
mkdir ./site
- name: Download Artifact Docs
id: download
uses: dawidd6/action-download-artifact@v3.1.4
- uses: actions/download-artifact@v6
with:
if_no_artifact_found: ignore
github_token: ${{ secrets.FASTAPI_PREVIEW_DOCS_DOWNLOAD_ARTIFACTS }}
workflow: build-docs.yml
run_id: ${{ github.event.workflow_run.id }}
name: docs-site
path: ./site/
pattern: docs-site-*
merge-multiple: true
github-token: ${{ secrets.GITHUB_TOKEN }}
run-id: ${{ github.event.workflow_run.id }}
- name: Deploy to Cloudflare Pages
if: steps.download.outputs.found_artifact == 'true'
# hashFiles returns an empty string if there are no files
if: hashFiles('./site/*')
id: deploy
uses: cloudflare/pages-action@v1
env:
PROJECT_NAME: fastapitiangolo
BRANCH: ${{ ( github.event.workflow_run.head_repository.full_name == github.repository && github.event.workflow_run.head_branch == 'master' && 'main' ) || ( github.event.workflow_run.head_sha ) }}
uses: cloudflare/wrangler-action@v3
with:
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: Deploy Docs Status Error
if: failure()
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 }}
STATE: "error"
- name: Comment Deploy
if: steps.deploy.outputs.url != ''
uses: ./.github/actions/comment-docs-preview-in-pr
with:
token: ${{ secrets.FASTAPI_PREVIEW_DOCS_COMMENT_DEPLOY }}
deploy_url: "${{ steps.deploy.outputs.url }}"
run: python ./scripts/deploy_docs_status.py
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DEPLOY_URL: ${{ steps.deploy.outputs.deployment-url }}
COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
RUN_ID: ${{ github.run_id }}
STATE: "success"

19
.github/workflows/detect-conflicts.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
name: "Conflict detector"
on:
push:
pull_request_target:
types: [synchronize]
jobs:
main:
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- name: Check if PRs have merge conflicts
uses: eps1lon/actions-label-merge-conflict@v3
with:
dirtyLabel: "conflicts"
repoToken: "${{ secrets.GITHUB_TOKEN }}"
commentOnDirty: "This pull request has a merge conflict that needs to be resolved."

View File

@@ -2,7 +2,7 @@ name: Issue Manager
on:
schedule:
- cron: "10 3 * * *"
- cron: "13 22 * * *"
issue_comment:
types:
- created
@@ -14,26 +14,38 @@ on:
- labeled
workflow_dispatch:
permissions:
issues: write
pull-requests: write
jobs:
issue-manager:
if: github.repository_owner == 'tiangolo'
if: github.repository_owner == 'fastapi'
runs-on: ubuntu-latest
steps:
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: tiangolo/issue-manager@0.5.0
- uses: tiangolo/issue-manager@0.6.0
with:
token: ${{ secrets.FASTAPI_ISSUE_MANAGER }}
token: ${{ secrets.GITHUB_TOKEN }}
config: >
{
"answered": {
"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.",
"reminder": {
"before": "P3D",
"message": "Heads-up: this will be closed in 3 days unless theres new activity."
}
},
"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

@@ -5,19 +5,41 @@ on:
- cron: "0 12 * * *"
workflow_dispatch:
permissions:
pull-requests: write
env:
UV_SYSTEM_PYTHON: 1
jobs:
label-approved:
if: github.repository_owner == 'tiangolo'
if: github.repository_owner == 'fastapi'
runs-on: ubuntu-latest
steps:
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: docker://tiangolo/label-approved:0.0.4
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
token: ${{ secrets.FASTAPI_LABEL_APPROVED }}
config: >
python-version: "3.11"
- name: Setup uv
uses: astral-sh/setup-uv@v7
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":
{

33
.github/workflows/labeler.yml vendored Normal file
View File

@@ -0,0 +1,33 @@
name: Labels
on:
pull_request_target:
types:
- opened
- synchronize
- reopened
# For label-checker
- labeled
- unlabeled
jobs:
labeler:
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/labeler@v6
if: ${{ github.event.action != 'labeled' && github.event.action != 'unlabeled' }}
- run: echo "Done adding labels"
# Run this after labeler applied labels
check-labels:
needs:
- labeler
permissions:
pull-requests: read
runs-on: ubuntu-latest
steps:
- uses: docker://agilepathway/pull-request-label-checker:latest
with:
one_of: breaking,security,feature,bug,refactor,upgrade,docs,lang-all,internal
repo_token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -24,7 +24,9 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v4
# pin to actions/checkout@v5 for compatibility with latest-changes
# Ref: https://github.com/actions/checkout/issues/2313
- uses: actions/checkout@v5
with:
# To allow latest-changes to commit to the main branch
token: ${{ secrets.FASTAPI_LATEST_CHANGES }}
@@ -34,8 +36,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.4.1
with:
token: ${{ secrets.GITHUB_TOKEN }}
latest_changes_file: docs/en/docs/release-notes.md

View File

@@ -15,21 +15,45 @@ on:
required: false
default: 'false'
env:
UV_SYSTEM_PYTHON: 1
jobs:
notify-translations:
job:
runs-on: ubuntu-latest
permissions:
discussions: write
steps:
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
cache-dependency-glob: |
requirements**.txt
pyproject.toml
- name: Install Dependencies
run: uv pip install -r requirements-github-actions.txt
# Allow debugging with tmate
- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }}
with:
limit-access-to-actor: true
- uses: ./.github/actions/notify-translations
with:
token: ${{ secrets.FASTAPI_NOTIFY_TRANSLATIONS }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Notify Translations
run: python ./scripts/notify_translations.py
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NUMBER: ${{ github.event.inputs.number || null }}
DEBUG: ${{ github.event.inputs.debug_enabled || 'false' }}

View File

@@ -6,29 +6,49 @@ on:
workflow_dispatch:
inputs:
debug_enabled:
description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)'
description: Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)
required: false
default: 'false'
default: "false"
env:
UV_SYSTEM_PYTHON: 1
jobs:
fastapi-people:
if: github.repository_owner == 'tiangolo'
job:
if: github.repository_owner == 'fastapi'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v4
# Ref: https://github.com/actions/runner/issues/2033
- name: Fix git safe.directory in container
run: mkdir -p /home/runner/work/_temp/_github_home && printf "[safe]\n\tdirectory = /github/workspace" > /home/runner/work/_temp/_github_home/.gitconfig
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
cache-dependency-glob: |
requirements**.txt
pyproject.toml
- name: Install Dependencies
run: uv pip install -r requirements-github-actions.txt
# Allow debugging with tmate
- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }}
with:
limit-access-to-actor: true
- uses: ./.github/actions/people
with:
token: ${{ secrets.FASTAPI_PEOPLE }}
env:
GITHUB_TOKEN: ${{ secrets.FASTAPI_PEOPLE }}
- name: FastAPI People Experts
run: python ./scripts/people.py
env:
GITHUB_TOKEN: ${{ secrets.FASTAPI_PEOPLE }}
SLEEP_INTERVAL: ${{ vars.PEOPLE_SLEEP_INTERVAL }}

88
.github/workflows/pre-commit.yml vendored Normal file
View File

@@ -0,0 +1,88 @@
name: pre-commit
on:
pull_request:
types:
- opened
- synchronize
env:
IS_FORK: ${{ github.event.pull_request.head.repo.full_name != github.repository }}
jobs:
pre-commit:
runs-on: ubuntu-latest
steps:
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v5
name: Checkout PR for own repo
if: env.IS_FORK == 'false'
with:
# To be able to commit it needs more than the last commit
ref: ${{ github.head_ref }}
# A token other than the default GITHUB_TOKEN is needed to be able to trigger CI
token: ${{ secrets.PRE_COMMIT }}
# pre-commit lite ci needs the default checkout configs to work
- uses: actions/checkout@v5
name: Checkout PR for fork
if: env.IS_FORK == 'true'
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.14"
- name: Setup uv
uses: astral-sh/setup-uv@v7
with:
cache-dependency-glob: |
requirements**.txt
pyproject.toml
uv.lock
- name: Install Dependencies
run: |
uv venv
uv pip install -r requirements.txt
- name: Run pre-commit
id: precommit
run: |
# Fetch the base branch for comparison
git fetch origin ${{ github.base_ref }}
uvx pre-commit run --from-ref origin/${{ github.base_ref }} --to-ref HEAD --show-diff-on-failure
continue-on-error: true
- name: Commit and push changes
if: env.IS_FORK == 'false'
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add -A
if git diff --staged --quiet; then
echo "No changes to commit"
else
git commit -m "🎨 Auto format"
git push
fi
- uses: pre-commit-ci/lite-action@v1.1.0
if: env.IS_FORK == 'true'
with:
msg: 🎨 Auto format
- name: Error out on pre-commit errors
if: steps.precommit.outcome == 'failure'
run: exit 1
# https://github.com/marketplace/actions/alls-green#why
pre-commit-alls-green: # This job does nothing and is only used for the branch protection
if: always()
needs:
- pre-commit
runs-on: ubuntu-latest
steps:
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- name: Decide whether the needed jobs succeeded or failed
uses: re-actors/alls-green@release/v1
with:
jobs: ${{ toJSON(needs) }}

View File

@@ -8,32 +8,34 @@ on:
jobs:
publish:
runs-on: ubuntu-latest
strategy:
matrix:
package:
- fastapi
- fastapi-slim
permissions:
id-token: write
steps:
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: "3.10"
# Issue ref: https://github.com/actions/setup-python/issues/436
# cache: "pip"
# cache-dependency-path: pyproject.toml
- uses: actions/cache@v4
id: cache
with:
path: ${{ env.pythonLocation }}
key: ${{ runner.os }}-python-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml') }}-publish
- name: Install build dependencies
run: pip install build
- name: Build distribution
env:
TIANGOLO_BUILD_PACKAGE: ${{ matrix.package }}
run: python -m build
- name: Publish
uses: pypa/gh-action-pypi-publish@v1.8.14
with:
password: ${{ secrets.PYPI_API_TOKEN }}
uses: pypa/gh-action-pypi-publish@v1.13.0
- 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,23 +21,40 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/setup-python@v5
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: '3.9'
- run: pip install smokeshow
- uses: dawidd6/action-download-artifact@v3.1.4
- name: Setup uv
uses: astral-sh/setup-uv@v7
with:
github_token: ${{ secrets.FASTAPI_SMOKESHOW_DOWNLOAD_ARTIFACTS }}
workflow: test.yml
commit: ${{ github.event.workflow_run.head_sha }}
- run: smokeshow upload coverage-html
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@v6
with:
name: coverage-html
path: htmlcov
github-token: ${{ secrets.GITHUB_TOKEN }}
run-id: ${{ github.event.workflow_run.id }}
# Try 5 times to upload coverage to smokeshow
- name: Upload coverage to Smokeshow
run: |
for i in 1 2 3 4 5; do
if smokeshow upload htmlcov; then
echo "Smokeshow upload success!"
break
fi
echo "Smokeshow upload error, sleep 1 sec and try again."
sleep 1
done
env:
SMOKESHOW_GITHUB_STATUS_DESCRIPTION: Coverage {coverage-percentage}
SMOKESHOW_GITHUB_COVERAGE_THRESHOLD: 100
SMOKESHOW_GITHUB_CONTEXT: coverage
SMOKESHOW_GITHUB_TOKEN: ${{ secrets.FASTAPI_SMOKESHOW_UPLOAD }}
SMOKESHOW_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SMOKESHOW_GITHUB_PR_HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
SMOKESHOW_AUTH_KEY: ${{ secrets.SMOKESHOW_AUTH_KEY }}

52
.github/workflows/sponsors.yml vendored Normal file
View File

@@ -0,0 +1,52 @@
name: FastAPI People Sponsors
on:
schedule:
- cron: "0 6 1 * *"
workflow_dispatch:
inputs:
debug_enabled:
description: "Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)"
required: false
default: "false"
env:
UV_SYSTEM_PYTHON: 1
jobs:
job:
if: github.repository_owner == 'fastapi'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
cache-dependency-glob: |
requirements**.txt
pyproject.toml
- name: Install Dependencies
run: uv pip install -r requirements-github-actions.txt
# Allow debugging with tmate
- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }}
with:
limit-access-to-actor: true
- name: FastAPI People Sponsors
run: python ./scripts/sponsors.py
env:
SPONSORS_TOKEN: ${{ secrets.SPONSORS_TOKEN }}
PR_TOKEN: ${{ secrets.FASTAPI_PR_TOKEN }}

View File

@@ -12,22 +12,26 @@ on:
jobs:
test-redistribute:
runs-on: ubuntu-latest
strategy:
matrix:
package:
- fastapi
- fastapi-slim
steps:
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: "3.10"
# Issue ref: https://github.com/actions/setup-python/issues/436
# cache: "pip"
# cache-dependency-path: pyproject.toml
- name: Install build dependencies
run: pip install build
- name: Build source distribution
env:
TIANGOLO_BUILD_PACKAGE: ${{ matrix.package }}
run: python -m build --sdist
- name: Decompress source distribution
run: |
@@ -35,17 +39,31 @@ jobs:
tar xvf fastapi*.tar.gz
- name: Install test dependencies
run: |
cd dist/fastapi-*/
cd dist/fastapi*/
pip install -r requirements-tests.txt
env:
TIANGOLO_BUILD_PACKAGE: ${{ matrix.package }}
- name: Run source distribution tests
run: |
cd dist/fastapi-*/
cd dist/fastapi*/
bash scripts/test.sh
- name: Build wheel distribution
run: |
cd dist
pip wheel --no-deps fastapi-*.tar.gz
pip wheel --no-deps fastapi*.tar.gz
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
# https://github.com/marketplace/actions/alls-green#why
test-redistribute-alls-green: # This job does nothing and is only used for the branch protection
if: always()
needs:
- test-redistribute
runs-on: ubuntu-latest
steps:
- name: Decide whether the needed jobs succeeded or failed
uses: re-actors/alls-green@release/v1
with:
jobs: ${{ toJSON(needs) }}

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
@@ -20,24 +23,23 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
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@v7
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
@@ -46,40 +48,48 @@ jobs:
strategy:
matrix:
python-version:
- "3.14"
- "3.13"
- "3.12"
- "3.11"
- "3.10"
- "3.9"
- "3.8"
pydantic-version: ["pydantic-v1", "pydantic-v2"]
exclude:
- python-version: "3.14"
pydantic-version: "pydantic-v1"
fail-fast: false
steps:
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
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@v7
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"
# TODO: Remove this once Python 3.8 is no longer supported
- name: Install older AnyIO in Python 3.8
if: matrix.python-version == '3.8'
run: uv pip install "anyio[trio]<4.0.0"
- run: mkdir coverage
- name: Test
run: bash scripts/test.sh
@@ -87,10 +97,11 @@ jobs:
COVERAGE_FILE: coverage/.coverage.${{ runner.os }}-py${{ matrix.python-version }}
CONTEXT: ${{ runner.os }}-py${{ matrix.python-version }}
- name: Store coverage files
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v5
with:
name: coverage
name: coverage-${{ matrix.python-version }}-${{ matrix.pydantic-version }}
path: coverage
include-hidden-files: true
coverage-combine:
needs: [test]
@@ -100,28 +111,36 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: '3.8'
# Issue ref: https://github.com/actions/setup-python/issues/436
# cache: "pip"
# cache-dependency-path: pyproject.toml
- name: Get coverage files
uses: actions/download-artifact@v3
- name: Setup uv
uses: astral-sh/setup-uv@v7
with:
name: coverage
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@v6
with:
pattern: coverage-*
path: coverage
- run: pip install coverage[toml]
merge-multiple: true
- run: ls -la coverage
- run: coverage combine coverage
- run: coverage report
- run: coverage html --show-contexts --title "Coverage for ${{ github.sha }}"
- run: coverage html --title "Coverage for ${{ github.sha }}"
- name: Store coverage HTML
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v5
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

40
.github/workflows/topic-repos.yml vendored Normal file
View File

@@ -0,0 +1,40 @@
name: Update Topic Repos
on:
schedule:
- cron: "0 12 1 * *"
workflow_dispatch:
env:
UV_SYSTEM_PYTHON: 1
jobs:
topic-repos:
if: github.repository_owner == 'fastapi'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
uses: astral-sh/setup-uv@v7
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: Update Topic Repos
run: python ./scripts/topic_repos.py
env:
GITHUB_TOKEN: ${{ secrets.FASTAPI_PR_TOKEN }}

77
.github/workflows/translate.yml vendored Normal file
View File

@@ -0,0 +1,77 @@
name: Translate
on:
workflow_dispatch:
inputs:
debug_enabled:
description: Run with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)
required: false
default: "false"
command:
description: Command to run
type: choice
options:
- translate-page
- translate-lang
- update-outdated
- add-missing
- update-and-add
- remove-all-removable
language:
description: Language to translate to as a letter code (e.g. "es" for Spanish)
type: string
required: false
default: ""
en_path:
description: File path in English to translate (e.g. docs/en/docs/index.md)
type: string
required: false
default: ""
env:
UV_SYSTEM_PYTHON: 1
jobs:
job:
if: github.repository_owner == 'fastapi'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Setup uv
uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
cache-dependency-glob: |
requirements**.txt
pyproject.toml
- name: Install Dependencies
run: uv pip install -r requirements-github-actions.txt -r requirements-translations.txt
# Allow debugging with tmate
- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }}
with:
limit-access-to-actor: true
env:
GITHUB_TOKEN: ${{ secrets.FASTAPI_TRANSLATIONS }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
- name: FastAPI Translate
run: |
python ./scripts/translate.py ${{ github.event.inputs.command }}
python ./scripts/translate.py make-pr
env:
GITHUB_TOKEN: ${{ secrets.FASTAPI_TRANSLATIONS }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
LANGUAGE: ${{ github.event.inputs.language }}
EN_PATH: ${{ github.event.inputs.en_path }}

5
.gitignore vendored
View File

@@ -7,7 +7,7 @@ __pycache__
htmlcov
dist
site
.coverage
.coverage*
coverage.xml
.netlify
test.db
@@ -28,3 +28,6 @@ archive.zip
# macOS
.DS_Store
# Ignore while the setup still depends on requirements.txt files
uv.lock

View File

@@ -1,25 +1,29 @@
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
default_language_version:
python: python3.10
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v6.0.0
hooks:
- id: check-added-large-files
- id: check-toml
- id: check-yaml
- id: check-added-large-files
- id: check-toml
- id: check-yaml
args:
- --unsafe
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/charliermarsh/ruff-pre-commit
rev: v0.2.0
- --unsafe
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.14.3
hooks:
- id: ruff
- id: ruff
args:
- --fix
- id: ruff-format
ci:
autofix_commit_msg: 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks
autoupdate_commit_msg: ⬆ [pre-commit.ci] pre-commit autoupdate
- id: ruff-format
- repo: local
hooks:
- id: local-script
language: unsupported
name: local script
entry: uv run ./scripts/docs.py add-permalinks-pages
args:
- --update-existing
files: ^docs/en/docs/.*\.md$

View File

@@ -12,7 +12,7 @@ authors:
family-names: Ramírez
email: tiangolo@gmail.com
identifiers:
repository-code: 'https://github.com/tiangolo/fastapi'
repository-code: 'https://github.com/fastapi/fastapi'
url: 'https://fastapi.tiangolo.com'
abstract: >-
FastAPI framework, high performance, easy to learn, fast to code,

205
README.md
View File

@@ -5,11 +5,11 @@
<em>FastAPI framework, high performance, easy to learn, fast to code, ready for production</em>
</p>
<p align="center">
<a href="https://github.com/tiangolo/fastapi/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster" target="_blank">
<img src="https://github.com/tiangolo/fastapi/workflows/Test/badge.svg?event=push&branch=master" alt="Test">
<a href="https://github.com/fastapi/fastapi/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster" target="_blank">
<img src="https://github.com/fastapi/fastapi/actions/workflows/test.yml/badge.svg?event=push&branch=master" alt="Test">
</a>
<a href="https://coverage-badge.samuelcolvin.workers.dev/redirect/tiangolo/fastapi" target="_blank">
<img src="https://coverage-badge.samuelcolvin.workers.dev/tiangolo/fastapi.svg" alt="Coverage">
<a href="https://coverage-badge.samuelcolvin.workers.dev/redirect/fastapi/fastapi" target="_blank">
<img src="https://coverage-badge.samuelcolvin.workers.dev/fastapi/fastapi.svg" alt="Coverage">
</a>
<a href="https://pypi.org/project/fastapi" target="_blank">
<img src="https://img.shields.io/pypi/v/fastapi?color=%2334D058&label=pypi%20package" alt="Package version">
@@ -23,11 +23,11 @@
**Documentation**: <a href="https://fastapi.tiangolo.com" target="_blank">https://fastapi.tiangolo.com</a>
**Source Code**: <a href="https://github.com/tiangolo/fastapi" target="_blank">https://github.com/tiangolo/fastapi</a>
**Source Code**: <a href="https://github.com/fastapi/fastapi" target="_blank">https://github.com/fastapi/fastapi</a>
---
FastAPI is a modern, fast (high-performance), web framework for building APIs with Python 3.8+ based on standard Python type hints.
FastAPI is a modern, fast (high-performance), web framework for building APIs with Python based on standard Python type hints.
The key features are:
@@ -40,27 +40,35 @@ The key features are:
* **Robust**: Get production-ready code. With automatic interactive documentation.
* **Standards-based**: Based on (and fully compatible with) the open standards for APIs: <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> (previously known as Swagger) and <a href="https://json-schema.org/" class="external-link" target="_blank">JSON Schema</a>.
<small>* estimation based on tests on an internal development team, building production applications.</small>
<small>* estimation based on tests conducted by an internal development team, building production applications.</small>
## Sponsors
<!-- sponsors -->
### Keystone Sponsor
<a href="https://cryptapi.io/" target="_blank" title="CryptAPI: Your easy to use, secure and privacy oriented payment gateway."><img src="https://fastapi.tiangolo.com/img/sponsors/cryptapi.svg"></a>
<a href="https://platform.sh/try-it-now/?utm_source=fastapi-signup&utm_medium=banner&utm_campaign=FastAPI-signup-June-2023" target="_blank" title="Build, run and scale your apps on a modern, reliable, and secure PaaS."><img src="https://fastapi.tiangolo.com/img/sponsors/platform-sh.png"></a>
<a href="https://www.porter.run" target="_blank" title="Deploy FastAPI on AWS with a few clicks"><img src="https://fastapi.tiangolo.com/img/sponsors/porter.png"></a>
<a href="https://bump.sh/fastapi?utm_source=fastapi&utm_medium=referral&utm_campaign=sponsor" target="_blank" title="Automate FastAPI documentation generation with Bump.sh"><img src="https://fastapi.tiangolo.com/img/sponsors/bump-sh.svg"></a>
<a href="https://reflex.dev" target="_blank" title="Reflex"><img src="https://fastapi.tiangolo.com/img/sponsors/reflex.png"></a>
<a href="https://fastapicloud.com" target="_blank" title="FastAPI Cloud. By the same team behind FastAPI. You code. We Cloud."><img src="https://fastapi.tiangolo.com/img/sponsors/fastapicloud.png"></a>
### Gold and Silver Sponsors
<a href="https://blockbee.io?ref=fastapi" target="_blank" title="BlockBee Cryptocurrency Payment Gateway"><img src="https://fastapi.tiangolo.com/img/sponsors/blockbee.png"></a>
<a href="https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge" target="_blank" title="Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files"><img src="https://fastapi.tiangolo.com/img/sponsors/scalar.svg"></a>
<a href="https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge" target="_blank" title="Auth, user management and more for your B2B product"><img src="https://fastapi.tiangolo.com/img/sponsors/propelauth.png"></a>
<a href="https://www.withcoherence.com/?utm_medium=advertising&utm_source=fastapi&utm_campaign=banner%20january%2024" 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://training.talkpython.fm/fastapi-courses" target="_blank" title="FastAPI video courses on demand from people you trust"><img src="https://fastapi.tiangolo.com/img/sponsors/talkpython-v2.jpg"></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://speakeasyapi.dev?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>
<a href="https://zuplo.link/fastapi-gh" target="_blank" title="Zuplo: Deploy, Secure, Document, and Monetize your FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/zuplo.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://www.coderabbit.ai/?utm_source=fastapi&utm_medium=badge&utm_campaign=fastapi" target="_blank" title="Cut Code Review Time & Bugs in Half with CodeRabbit"><img src="https://fastapi.tiangolo.com/img/sponsors/coderabbit.png"></a>
<a href="https://subtotal.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=open-source" target="_blank" title="The Gold Standard in Retail Account Linking"><img src="https://fastapi.tiangolo.com/img/sponsors/subtotal.svg"></a>
<a href="https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi" target="_blank" title="Deploy enterprise applications at startup speed"><img src="https://fastapi.tiangolo.com/img/sponsors/railway.png"></a>
<a href="https://serpapi.com/?utm_source=fastapi_website" target="_blank" title="SerpApi: Web Search API"><img src="https://fastapi.tiangolo.com/img/sponsors/serpapi.png"></a>
<a href="https://www.greptile.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=fastapi_sponsor_page" target="_blank" title="Greptile: The AI Code Reviewer"><img src="https://fastapi.tiangolo.com/img/sponsors/greptile.png"></a>
<a href="https://databento.com/?utm_source=fastapi&utm_medium=sponsor&utm_content=display" 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/editor?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>
<a href="https://www.svix.com/" target="_blank" title="Svix - Webhooks as a service"><img src="https://fastapi.tiangolo.com/img/sponsors/svix.svg"></a>
<a href="https://www.codacy.com/?utm_source=github&utm_medium=sponsors&utm_id=pioneers" target="_blank" title="Take code reviews from hours to minutes"><img src="https://fastapi.tiangolo.com/img/sponsors/codacy.png"></a>
<a href="https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral" target="_blank" title="Stainless | Generate best-in-class SDKs"><img src="https://fastapi.tiangolo.com/img/sponsors/stainless.png"></a>
<a href="https://www.permit.io/blog/implement-authorization-in-fastapi?utm_source=github&utm_medium=referral&utm_campaign=fastapi" target="_blank" title="Fine-Grained Authorization for FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/permit.png"></a>
<a href="https://www.interviewpal.com/?utm_source=fastapi&utm_medium=open-source&utm_campaign=dev-hiring" target="_blank" title="InterviewPal - AI Interview Coach for Engineers and Devs"><img src="https://fastapi.tiangolo.com/img/sponsors/interviewpal.png"></a>
<a href="https://dribia.com/en/" target="_blank" title="Dribia - Data Science within your reach"><img src="https://fastapi.tiangolo.com/img/sponsors/dribia.png"></a>
<!-- /sponsors -->
@@ -70,7 +78,7 @@ The key features are:
"_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._"
<div style="text-align: right; margin-right: 10%;">Kabir Khan - <strong>Microsoft</strong> <a href="https://github.com/tiangolo/fastapi/pull/26" target="_blank"><small>(ref)</small></a></div>
<div style="text-align: right; margin-right: 10%;">Kabir Khan - <strong>Microsoft</strong> <a href="https://github.com/fastapi/fastapi/pull/26" target="_blank"><small>(ref)</small></a></div>
---
@@ -88,13 +96,13 @@ The key features are:
"_Im over the moon excited about **FastAPI**. Its so fun!_"
<div style="text-align: right; margin-right: 10%;">Brian Okken - <strong><a href="https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855" target="_blank">Python Bytes</a> podcast host</strong> <a href="https://twitter.com/brianokken/status/1112220079972728832" target="_blank"><small>(ref)</small></a></div>
<div style="text-align: right; margin-right: 10%;">Brian Okken - <strong><a href="https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855" target="_blank">Python Bytes</a> podcast host</strong> <a href="https://x.com/brianokken/status/1112220079972728832" target="_blank"><small>(ref)</small></a></div>
---
"_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>
---
@@ -102,7 +110,7 @@ The key features are:
"_We've switched over to **FastAPI** for our **APIs** [...] I think you'll like it [...]_"
<div style="text-align: right; margin-right: 10%;">Ines Montani - Matthew Honnibal - <strong><a href="https://explosion.ai" target="_blank">Explosion AI</a> founders - <a href="https://spacy.io" target="_blank">spaCy</a> creators</strong> <a href="https://twitter.com/_inesmontani/status/1144173225322143744" target="_blank"><small>(ref)</small></a> - <a href="https://twitter.com/honnibal/status/1144031421859655680" target="_blank"><small>(ref)</small></a></div>
<div style="text-align: right; margin-right: 10%;">Ines Montani - Matthew Honnibal - <strong><a href="https://explosion.ai" target="_blank">Explosion AI</a> founders - <a href="https://spacy.io" target="_blank">spaCy</a> creators</strong> <a href="https://x.com/_inesmontani/status/1144173225322143744" target="_blank"><small>(ref)</small></a> - <a href="https://x.com/honnibal/status/1144031421859655680" target="_blank"><small>(ref)</small></a></div>
---
@@ -122,42 +130,32 @@ If you are building a <abbr title="Command Line Interface">CLI</abbr> app to be
## Requirements
Python 3.8+
FastAPI stands on the shoulders of giants:
* <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a> for the web parts.
* <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a> for the web parts.
* <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> for the data parts.
## Installation
Create and activate a <a href="https://fastapi.tiangolo.com/virtual-environments/" class="external-link" target="_blank">virtual environment</a> and then install FastAPI:
<div class="termy">
```console
$ pip install fastapi
$ pip install "fastapi[standard]"
---> 100%
```
</div>
You will also need an ASGI server, for production such as <a href="https://www.uvicorn.org" class="external-link" target="_blank">Uvicorn</a> or <a href="https://github.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>.
<div class="termy">
```console
$ pip install "uvicorn[standard]"
---> 100%
```
</div>
**Note**: Make sure you put `"fastapi[standard]"` in quotes to ensure it works in all terminals.
## Example
### Create it
* Create a file `main.py` with:
Create a file `main.py` with:
```Python
from typing import Union
@@ -213,11 +211,24 @@ Run the server with:
<div class="termy">
```console
$ uvicorn main:app --reload
$ fastapi dev main.py
╭────────── FastAPI CLI - Development mode ───────────╮
│ │
│ Serving at: http://127.0.0.1:8000 │
│ │
│ API docs: http://127.0.0.1:8000/docs │
│ │
│ Running in development mode, for production use: │
│ │
│ fastapi run │
│ │
╰─────────────────────────────────────────────────────╯
INFO: Will watch for changes in these directories: ['/home/user/code/awesomeapp']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [28720]
INFO: Started server process [28722]
INFO: Started reloader process [2248755] using WatchFiles
INFO: Started server process [2248757]
INFO: Waiting for application startup.
INFO: Application startup complete.
```
@@ -225,13 +236,13 @@ INFO: Application startup complete.
</div>
<details markdown="1">
<summary>About the command <code>uvicorn main:app --reload</code>...</summary>
<summary>About the command <code>fastapi dev main.py</code>...</summary>
The command `uvicorn main:app` refers to:
The command `fastapi dev` reads your `main.py` file, detects the **FastAPI** app in it, and starts a server using <a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a>.
* `main`: the file `main.py` (the Python "module").
* `app`: the object created inside of `main.py` with the line `app = FastAPI()`.
* `--reload`: make the server restart after code changes. Only do this for development.
By default, `fastapi dev` will start with auto-reload enabled for local development.
You can read more about it in the <a href="https://fastapi.tiangolo.com/fastapi-cli/" target="_blank">FastAPI CLI docs</a>.
</details>
@@ -304,7 +315,7 @@ def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
```
The server should reload automatically (because you added `--reload` to the `uvicorn` command above).
The `fastapi dev` server should reload automatically.
### Interactive API docs upgrade
@@ -338,7 +349,7 @@ You do that with standard modern Python types.
You don't have to learn a new syntax, the methods or classes of a specific library, etc.
Just standard **Python 3.8+**.
Just standard **Python**.
For example, for an `int`:
@@ -388,7 +399,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.
@@ -442,36 +453,110 @@ For a more complete example including more features, see the <a href="https://fa
* **Cookie Sessions**
* ...and more.
### Deploy your app (optional)
You can optionally deploy your FastAPI app to <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>, go and join the waiting list if you haven't. 🚀
If you already have a **FastAPI Cloud** account (we invited you from the waiting list 😉), you can deploy your application with one command.
Before deploying, make sure you are logged in:
<div class="termy">
```console
$ fastapi login
You are logged in to FastAPI Cloud 🚀
```
</div>
Then deploy your app:
<div class="termy">
```console
$ fastapi deploy
Deploying to FastAPI Cloud...
✅ Deployment successful!
🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev
```
</div>
That's it! Now you can access your app at that URL. ✨
#### About FastAPI Cloud
**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** is built by the same author and team behind **FastAPI**.
It streamlines the process of **building**, **deploying**, and **accessing** an API with minimal effort.
It brings the same **developer experience** of building apps with FastAPI to **deploying** them to the cloud. 🎉
FastAPI Cloud is the primary sponsor and funding provider for the *FastAPI and friends* open source projects. ✨
#### Deploy to other cloud providers
FastAPI is open source and based on standards. You can deploy FastAPI apps to any cloud provider you choose.
Follow your cloud provider's guides to deploy FastAPI apps with them. 🤓
## Performance
Independent TechEmpower benchmarks show **FastAPI** applications running under Uvicorn as <a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">one of the fastest Python frameworks available</a>, only below Starlette and Uvicorn themselves (used internally by FastAPI). (*)
To understand more about it, see the section <a href="https://fastapi.tiangolo.com/benchmarks/" class="internal-link" target="_blank">Benchmarks</a>.
## Optional Dependencies
## Dependencies
FastAPI depends on Pydantic and Starlette.
### `standard` Dependencies
When you install FastAPI with `pip install "fastapi[standard]"` it comes with the `standard` group of optional dependencies:
Used by Pydantic:
* <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email_validator</code></a> - for email validation.
* <a href="https://docs.pydantic.dev/latest/usage/pydantic_settings/" target="_blank"><code>pydantic-settings</code></a> - for settings management.
* <a href="https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/" target="_blank"><code>pydantic-extra-types</code></a> - for extra types to be used with Pydantic.
* <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email-validator</code></a> - for email validation.
Used by Starlette:
* <a href="https://www.python-httpx.org" target="_blank"><code>httpx</code></a> - Required if you want to use the `TestClient`.
* <a href="https://jinja.palletsprojects.com" target="_blank"><code>jinja2</code></a> - Required if you want to use the default template configuration.
* <a href="https://github.com/Kludex/python-multipart" target="_blank"><code>python-multipart</code></a> - Required if you want to support form <abbr title="converting the string that comes from an HTTP request into Python data">"parsing"</abbr>, with `request.form()`.
* <a href="https://pythonhosted.org/itsdangerous/" target="_blank"><code>itsdangerous</code></a> - Required for `SessionMiddleware` support.
* <a href="https://pyyaml.org/wiki/PyYAMLDocumentation" target="_blank"><code>pyyaml</code></a> - Required for Starlette's `SchemaGenerator` support (you probably don't need it with FastAPI).
Used by FastAPI / Starlette:
Used by FastAPI:
* <a href="https://www.uvicorn.dev" target="_blank"><code>uvicorn</code></a> - for the server that loads and serves your application. This includes `uvicorn[standard]`, which includes some dependencies (e.g. `uvloop`) needed for high performance serving.
* `fastapi-cli[standard]` - to provide the `fastapi` command.
* This includes `fastapi-cloud-cli`, which allows you to deploy your FastAPI application to <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>.
### Without `standard` Dependencies
If you don't want to include the `standard` optional dependencies, you can install with `pip install fastapi` instead of `pip install "fastapi[standard]"`.
### Without `fastapi-cloud-cli`
If you want to install FastAPI with the standard dependencies but without the `fastapi-cloud-cli`, you can install with `pip install "fastapi[standard-no-fastapi-cloud-cli]"`.
### Additional Optional Dependencies
There are some additional dependencies you might want to install.
Additional optional Pydantic dependencies:
* <a href="https://docs.pydantic.dev/latest/usage/pydantic_settings/" target="_blank"><code>pydantic-settings</code></a> - for settings management.
* <a href="https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/" target="_blank"><code>pydantic-extra-types</code></a> - for extra types to be used with Pydantic.
Additional optional FastAPI dependencies:
* <a href="https://www.uvicorn.org" target="_blank"><code>uvicorn</code></a> - for the server that loads and serves your application.
* <a href="https://github.com/ijl/orjson" target="_blank"><code>orjson</code></a> - Required if you want to use `ORJSONResponse`.
* <a href="https://github.com/esnme/ultrajson" target="_blank"><code>ujson</code></a> - Required if you want to use `UJSONResponse`.
You can install all of these with `pip install "fastapi[all]"`.
## License
This project is licensed under the terms of the MIT license.

View File

@@ -16,7 +16,7 @@ You can learn more about [FastAPI versions and how to pin and upgrade them](http
If you think you found a vulnerability, and even if you are not sure about it, please report it right away by sending an email to: security@tiangolo.com. Please try to be as explicit as possible, describing all the steps and example code to reproduce the security issue.
I (the author, [@tiangolo](https://twitter.com/tiangolo)) will review it thoroughly and get back to you.
I (the author, [@tiangolo](https://x.com/tiangolo)) will review it thoroughly and get back to you.
## Public Discussions

View File

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

View File

@@ -1,469 +0,0 @@
<p align="center">
<a href="https://fastapi.tiangolo.com"><img src="https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png" alt="FastAPI"></a>
</p>
<p align="center">
<em>FastAPI framework, yüksək məshuldarlı, öyrənməsi asan, çevik kodlama, istifadəyə hazırdır</em>
</p>
<p align="center">
<a href="https://github.com/tiangolo/fastapi/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster" target="_blank">
<img src="https://github.com/tiangolo/fastapi/workflows/Test/badge.svg?event=push&branch=master" alt="Test">
</a>
<a href="https://coverage-badge.samuelcolvin.workers.dev/redirect/tiangolo/fastapi" target="_blank">
<img src="https://coverage-badge.samuelcolvin.workers.dev/tiangolo/fastapi.svg" alt="Əhatə">
</a>
<a href="https://pypi.org/project/fastapi" target="_blank">
<img src="https://img.shields.io/pypi/v/fastapi?color=%2334D058&label=pypi%20package" alt="Paket versiyası">
</a>
<a href="https://pypi.org/project/fastapi" target="_blank">
<img src="https://img.shields.io/pypi/pyversions/fastapi.svg?color=%2334D058" alt="Dəstəklənən Python versiyaları">
</a>
</p>
---
**Sənədlər**: <a href="https://fastapi.tiangolo.com" target="_blank">https://fastapi.tiangolo.com</a>
**Qaynaq Kodu**: <a href="https://github.com/tiangolo/fastapi" target="_blank">https://github.com/tiangolo/fastapi</a>
---
FastAPI Python 3.8+ ilə API yaratmaq üçün standart Python <abbr title="Tip Məsləhətləri: Type Hints">tip məsləhətlərinə</abbr> əsaslanan, müasir, sürətli (yüksək performanslı) framework-dür.
Əsas xüsusiyyətləri bunlardır:
* **Sürətli**: Çox yüksək performans, **NodeJS****Go** səviyyəsində (Starlette və Pydantic-ə təşəkkürlər). [Ən sürətli Python frameworklərindən biridir](#performans).
* **Çevik kodlama**: Funksiyanallıqları inkişaf etdirmək sürətini təxminən 200%-dən 300%-ə qədər artırın. *
* **Daha az xəta**: İnsan (developer) tərəfindən törədilən səhvlərin təxminən 40% -ni azaldın. *
* **İntuitiv**: Əla redaktor dəstəyi. Hər yerdə <abbr title="auto-complete, autocompletion, IntelliSense olaraq da bilinir">otomatik tamamlama</abbr>. Xətaları müəyyənləşdirməyə daha az vaxt sərf edəcəksiniz.
* **Asan**: İstifadəsi və öyrənilməsi asan olması üçün nəzərdə tutulmuşdur. Sənədləri oxumaq üçün daha az vaxt ayıracaqsınız.
* **Qısa**: Kod təkrarlanmasını minimuma endirin. Hər bir parametr tərifində birdən çox xüsusiyyət ilə və daha az səhvlə qarşılaşacaqsınız.
* **Güclü**: Avtomatik və interaktiv sənədlərlə birlikdə istifadəyə hazır kod əldə edə bilərsiniz.
* **Standartlara əsaslanan**: API-lar üçün açıq standartlara əsaslanır (və tam uyğun gəlir): <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> (əvvəlki adı ilə Swagger) və <a href="https://json-schema.org/" class="external-link" target="_blank">JSON Schema</a>.
<small>* Bu fikirlər daxili development komandasının hazırladıqları məhsulların sınaqlarına əsaslanır.</small>
## Sponsorlar
<!-- sponsors -->
{% if sponsors %}
{% for sponsor in sponsors.gold -%}
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
{% endfor -%}`
{%- for sponsor in sponsors.silver -%}
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
{% endfor %}
{% endif %}
<!-- /sponsors -->
<a href="https://fastapi.tiangolo.com/az/fastapi-people/#sponsors" class="external-link" target="_blank">Digər sponsorlar</a>
## Rəylər
"_[...] Son günlərdə **FastAPI**-ı çox istifadə edirəm. [...] Əslində onu komandamın bütün **Microsoftda ML sevislərində** istifadə etməyi planlayıram. Onların bəziləri **windows**-un əsas məhsuluna və bəzi **Office** məhsullarına inteqrasiya olunurlar._"
<div style="text-align: right; margin-right: 10%;">Kabir Khan - <strong>Microsoft</strong> <a href="https://github.com/tiangolo/fastapi/pull/26" target="_blank"><small>(ref)</small></a></div>
---
"_**FastAPI** kitabxanasını **Proqnozlar** əldə etmək üçün sorğulana bilən **REST** serverini yaratmaqda istifadə etdik._"
<div style="text-align: right; margin-right: 10%;">Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - <strong>Uber</strong> <a href="https://eng.uber.com/ludwig-v0-2/" target="_blank"><small>(ref)</small></a></div>
---
"_**Netflix** **böhran idarəçiliyi** orkestrləşmə framework-nün açıq qaynaqlı buraxılışını elan etməkdən məmnundur: **Dispatch**! [**FastAPI** ilə quruldu]_"
<div style="text-align: right; margin-right: 10%;">Kevin Glisson, Marc Vilanova, Forest Monsen - <strong>Netflix</strong> <a href="https://netflixtechblog.com/introducing-dispatch-da4b8a2a8072" target="_blank"><small>(ref)</small></a></div>
---
"_**FastAPI** üçün həyəcanlıyam. Çox əyləncəlidir!_"
<div style="text-align: right; margin-right: 10%;">Brian Okken - <strong><a href="https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855" target="_blank">Python Bytes</a> podcast host</strong> <a href="https://twitter.com/brianokken/status/1112220079972728832" target="_blank"><small>(ref)</small></a></div>
---
"_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>
---
"_Əgər REST API-lər yaratmaq üçün **müasir framework** öyrənmək istəyirsinizsə, **FastAPI**-a baxın [...] Sürətli, istifadəsi və öyrənməsi asandır. [...]_"
"_**API** xidmətlərimizi **FastAPI**-a köçürdük [...] Sizin də bəyənəcəyinizi düşünürük._"
<div style="text-align: right; margin-right: 10%;">Ines Montani - Matthew Honnibal - <strong><a href="https://explosion.ai" target="_blank">Explosion AI</a> founders - <a href="https://spacy.io" target="_blank">spaCy</a> creators</strong> <a href="https://twitter.com/_inesmontani/status/1144173225322143744" target="_blank"><small>(ref)</small></a> - <a href="https://twitter.com/honnibal/status/1144031421859655680" target="_blank"><small>(ref)</small></a></div>
---
"_Python ilə istifadəyə hazır API qurmaq istəyən hər kəsə **FastAPI**-ı tövsiyə edirəm. **Möhtəşəm şəkildə dizayn edilmiş**, **istifadəsi asan** və **yüksək dərəcədə genişlənə bilən**-dir, API əsaslı inkişaf strategiyamızın **əsas komponentinə** çevrilib və Virtual TAC Engineer kimi bir çox avtomatlaşdırma və servisləri idarə edir._"
<div style="text-align: right; margin-right: 10%;">Deon Pillsbury - <strong>Cisco</strong> <a href="https://www.linkedin.com/posts/deonpillsbury_cisco-cx-python-activity-6963242628536487936-trAp/" target="_blank"><small>(ref)</small></a></div>
---
## **Typer**, CLI-ların FastAPI-ı
<a href="https://typer.tiangolo.com" target="_blank"><img src="https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg" style="width: 20%;"></a>
Əgər siz veb API əvəzinə terminalda istifadə ediləcək <abbr title="Command Line Interface">CLI</abbr> proqramı qurursunuzsa, <a href="https://typer.tiangolo.com/" class="external-link" target="_blank">**Typer**</a>-a baxa bilərsiniz.
**Typer** FastAPI-ın kiçik qardaşıdır. Və o, CLI-lərin **FastAPI**-ı olmaq üçün nəzərdə tutulub. ⌨️ 🚀
## Tələblər
Python 3.8+
FastAPI nəhənglərin çiyinlərində dayanır:
* Web tərəfi üçün <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a>.
* Data tərəfi üçün <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>.
## Quraşdırma
<div class="termy">
```console
$ pip install fastapi
---> 100%
```
</div>
Tətbiqimizi əlçatan etmək üçün bizə <a href="https://www.uvicorn.org" class="external-link" target="_blank">Uvicorn</a> və ya <a href="https://github.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a> kimi ASGI server lazımdır.
<div class="termy">
```console
$ pip install "uvicorn[standard]"
---> 100%
```
</div>
## Nümunə
### Kodu yaradaq
* `main.py` adlı fayl yaradaq və ona aşağıdakı kodu yerləşdirək:
```Python
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
<details markdown="1">
<summary>Və ya <code>async def</code>...</summary>
Əgər kodunuzda `async` və ya `await` vardırsa `async def` istifadə edə bilərik:
```Python hl_lines="9 14"
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
**Qeyd**:
Əgər bu mövzu haqqında məlumatınız yoxdursa <a href="https://fastapi.tiangolo.com/az/async/#in-a-hurry" target="_blank">`async` və `await` sənədindəki</a> _"Tələsirsən?"_ bölməsinə baxa bilərsiniz.
</details>
### Kodu işə salaq
Serveri aşağıdakı əmr ilə işə salaq:
<div class="termy">
```console
$ uvicorn main:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [28720]
INFO: Started server process [28722]
INFO: Waiting for application startup.
INFO: Application startup complete.
```
</div>
<details markdown="1">
<summary><code>uvicorn main:app --reload</code> əmri haqqında...</summary>
`uvicorn main:app` əmri aşağıdakılara instinad edir:
* `main`: `main.py` faylı (yəni Python "modulu").
* `app`: `main.py` faylında `app = FastAPI()` sətrində yaratdığımız `FastAPI` obyektidir.
* `--reload`: kod dəyişikliyindən sonra avtomatik olaraq serveri yenidən işə salır. Bu parametrdən yalnız development mərhələsində istifadə etməliyik.
</details>
### İndi yoxlayaq
Bu linki brauzerimizdə açaq <a href="http://127.0.0.1:8000/items/5?q=somequery" class="external-link" target="_blank">http://127.0.0.1:8000/items/5?q=somequery</a>.
Aşağıdakı kimi bir JSON cavabı görəcəksiniz:
```JSON
{"item_id": 5, "q": "somequery"}
```
Siz artıq bir API yaratmısınız, hansı ki:
* `/` və `/items/{item_id}` <abbr title="Yol: Path ">_yollarında_</abbr> HTTP sorğularını qəbul edir.
* Hər iki _yolda_ `GET` <em>əməliyyatlarını</em> (həmçinin HTTP _metodları_ kimi bilinir) aparır.
* `/items/{item_id}` _yolu_ `item_id` adlı `int` qiyməti almalı olan _yol parametrinə_ sahibdir.
* `/items/{item_id}` _yolunun_ `q` adlı yol parametri var və bu parametr istəyə bağlı olsa da, `str` qiymətini almalıdır.
### İnteraktiv API Sənədləri
İndi <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> ünvanına daxil olun.
Avtomatik interaktiv API sənədlərini görəcəksiniz (<a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a> tərəfindən təmin edilir):
![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png)
### Alternativ API sənədləri
İndi isə <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a> ünvanına daxil olun.
<a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a> tərəfindən təqdim edilən avtomatik sənədləri görəcəksiniz:
![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
## Nümunəni Yeniləyək
İndi gəlin `main.py` faylını `PUT` sorğusu ilə birlikdə <abbr title="Gövdə: Body ">gövdə</abbr> qəbul edəcək şəkildə dəyişdirək.
Pydantic sayəsində standart Python tiplərindən istifadə edərək <abbr title="Gövdə: Body ">gövdə</abbr>ni müəyyən edək.
```Python hl_lines="4 9-12 25-27"
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: Union[bool, None] = None
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
```
Server avtomatik olaraq yenidən işə salınmalı idi (çünki biz yuxarıda `uvicorn` əmri ilə `--reload` parametrindən istifadə etmişik).
### İnteraktiv API sənədlərindəki dəyişikliyə baxaq
Yenidən <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> ünvanına daxil olun.
* İnteraktiv API sənədləri yeni gövdə də daxil olmaq ilə avtomatik olaraq yenilənəcək:
![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png)
* "Try it out" düyməsini klikləyin, bu, parametrləri doldurmağa və API ilə birbaşa əlaqə saxlamağa imkan verir:
![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png)
* Sonra "Execute" düyməsini klikləyin, istifadəçi interfeysi API ilə əlaqə quracaq, parametrləri göndərəcək, nəticələri əldə edəcək və onları ekranda göstərəcək:
![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png)
### Alternativ API Sənədlərindəki Dəyişikliyə Baxaq
İndi isə yenidən <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a> ünvanına daxil olun.
* Alternativ sənədlər həm də yeni sorğu parametri və gövdəsini əks etdirəcək:
![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png)
### Xülasə
Ümumiləşdirsək, parametrlər, gövdə və s. Biz məlumat növlərini **bir dəfə** funksiya parametrləri kimi təyin edirik.
Bunu standart müasir Python tipləri ilə edirsiniz.
Yeni sintaksis, müəyyən bir kitabxananın metodlarını və ya siniflərini və s. öyrənmək məcburiyyətində deyilsiniz.
Sadəcə standart **Python 3.8+**.
Məsələn, `int` üçün:
```Python
item_id: int
```
və ya daha mürəkkəb `Item` modeli üçün:
```Python
item: Item
```
...və yalnız parametr tipini təyin etməklə bunları əldə edirsiniz:
* Redaktor dəstəyi ilə:
* Avtomatik tamamlama.
* Tip yoxlanması.
* Məlumatların Təsdiqlənməsi:
* Məlumat etibarsız olduqda avtomatik olaraq aydın xətalar göstərir.
* Hətta çox dərin JSON obyektlərində belə doğrulama aparır.
* Daxil olan məlumatları <abbr title="Çevrilmə: serialization, parsing, marshalling olaraq da bilinir">çevirmək</abbr> üçün aşağıdakı məlumat növlərindən istifadə edilir:
* JSON.
* <abbr title="Yol: Path">Yol</abbr> parametrləri.
* <abbr title="Sorğu: Query">Sorğu</abbr> parametrləri.
* <abbr title="Çərəz: Cookie">Çərəzlər</abbr>.
* <abbr title="Başlıq: Header">Başlıqlaq</abbr>.
* <abbr title="Forma: Form">Formalar</abbr>.
* Fayllar.
* Daxil olan məlumatları <abbr title="Çevrilmə: serialization, parsing, marshalling olaraq da bilinir">çevirmək</abbr> üçün aşağıdakı məlumat növlərindən istifadə edilir (JSON olaraq):
* Python tiplərinin (`str`, `int`, `float`, `bool`, `list`, və s) çevrilməsi.
* `datetime` obyektləri.
* `UUID` obyektləri.
* Verilənlər bazası modelləri.
* və daha çoxu...
* 2 alternativ istifadəçi interfeysi daxil olmaqla avtomatik interaktiv API sənədlərini təmin edir:
* Swagger UI.
* ReDoc.
---
Gəlin əvvəlki nümunəyə qayıdaq və **FastAPI**-nin nələr edəcəyinə nəzər salaq:
* `GET` və `PUT` sorğuları üçün `item_id`-nin <abbr title="Yol: Path">yolda</abbr> olub-olmadığını yoxlayacaq.
* `item_id`-nin `GET` və `PUT` sorğuları üçün növünün `int` olduğunu yoxlayacaq.
* Əgər `int` deyilsə, səbəbini göstərən bir xəta mesajı göstərəcəkdir.
* <abbr title="Məcburi olmayan: Optional">məcburi olmayan</abbr> `q` parametrinin `GET` (`http://127.0.0.1:8000/items/foo?q=somequery` burdakı kimi) sorğusu içərisində olub olmadığını yoxlayacaq.
* `q` parametrini `= None` ilə yaratdığımız üçün, <abbr title="Məcburi olmayan: Optional">məcburi olmayan</abbr> parametr olacaq.
* Əgər `None` olmasaydı, bu məcburi parametr olardı (`PUT` metodunun gövdəsində olduğu kimi).
* `PUT` sorğusu üçün, `/items/{item_id}` gövdəsini JSON olaraq oxuyacaq:
* `name` adında məcburi bir parametr olub olmadığını və əgər varsa, tipinin `str` olub olmadığını yoxlayacaq.
* `price` adında məcburi bir parametr olub olmadığını və əgər varsa, tipinin `float` olub olmadığını yoxlayacaq.
* `is_offer` adında <abbr title="Məcburi olmayan: Optional">məcburi olmayan</abbr> bir parametr olub olmadığını və əgər varsa, tipinin `float` olub olmadığını yoxlayacaq.
* Bütün bunlar ən dərin JSON obyektlərində belə işləyəcək.
* Məlumatların JSON-a və JSON-un Python obyektinə çevrilməsi avtomatik həyata keçiriləcək.
* Hər şeyi OpenAPI ilə uyğun olacaq şəkildə avtomatik olaraq sənədləşdirəcək və onları aşağıdakı kimi istifadə edə biləcək:
* İnteraktiv sənədləşmə sistemləri.
* Bir çox proqramlaşdırma dilləri üçün avtomatlaşdırılmış <abbr title="Müştəri: Client">müştəri</abbr> kodu yaratma sistemləri.
* 2 interaktiv sənədləşmə veb interfeysini birbaşa təmin edəcək.
---
Yeni başlamışıq, amma siz artıq işin məntiqini başa düşmüsünüz.
İndi aşağıdakı sətri dəyişdirməyə çalışın:
```Python
return {"item_name": item.name, "item_id": item_id}
```
...bundan:
```Python
... "item_name": item.name ...
```
...buna:
```Python
... "item_price": item.price ...
```
...və redaktorun məlumat tiplərini bildiyini və avtomatik tamaladığını görəcəksiniz:
![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png)
Daha çox funksiyaya malik daha dolğun nümunə üçün <a href="https://fastapi.tiangolo.com/az/tutorial/">Öyrədici - İstifadəçi Təlimatı</a> səhifəsinə baxa bilərsiniz.
**Spoiler xəbərdarlığı**: Öyrədici - istifadəçi təlimatına bunlar daxildir:
* **Parametrlərin**, <abbr title="Başlıq: Header">**başlıqlar**</abbr>, <abbr title="Çərəz: Cookie">çərəzlər</abbr>, **forma sahələri** və **fayllar** olaraq müəyyən edilməsi.
* `maximum_length` və ya `regex` kimi **doğrulama məhdudiyyətlərinin** necə təyin ediləcəyi.
* Çox güclü və istifadəsi asan **<abbr title="components, resources, providers, services, injectables olaraq da bilinir">Dependency Injection</abbr>** sistemi.
* Təhlükəsizlik və autentifikasiya, **JWT tokenləri** ilə **OAuth2** dəstəyi və **HTTP Basic** autentifikasiyası.
* **çox dərin JSON modellərini** müəyyən etmək üçün daha irəli səviyyə (lakin eyni dərəcədə asan) üsullar (Pydantic sayəsində).
* <a href="https://strawberry.rocks" class="external-link" target="_blank">Strawberry</a> və digər kitabxanalar ilə **GraphQL** inteqrasiyası.
* Digər əlavə xüsusiyyətlər (Starlette sayəsində):
* **WebSockets**
* HTTPX və `pytest` sayəsində çox asan testlər
* **CORS**
* **Cookie Sessions**
* ...və daha çoxu.
## Performans
Müstəqil TechEmpower meyarları göstərir ki, Uvicorn üzərində işləyən **FastAPI** proqramları <a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">ən sürətli Python kitabxanalarından biridir</a>, yalnız Starlette və Uvicorn-un özündən yavaşdır, ki FastAPI bunların üzərinə qurulmuş bir framework-dür. (*)
Ətraflı məlumat üçün bu bölməyə nəzər salın <a href="https://fastapi.tiangolo.com/az/benchmarks/" class="internal-link" target="_blank"><abbr title="Müqayisələr: Benchmarks">Müqayisələr</abbr></a>.
## Məcburi Olmayan Tələblər
Pydantic tərəfindən istifadə olunanlar:
* <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email_validator</code></a> - e-poçtun yoxlanılması üçün.
* <a href="https://docs.pydantic.dev/latest/usage/pydantic_settings/" target="_blank"><code>pydantic-settings</code></a> - parametrlərin idarə edilməsi üçün.
* <a href="https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/" target="_blank"><code>pydantic-extra-types</code></a> - Pydantic ilə istifadə edilə bilən əlavə tiplər üçün.
Starlette tərəfindən istifadə olunanlar:
* <a href="https://www.python-httpx.org" target="_blank"><code>httpx</code></a> - Əgər `TestClient` strukturundan istifadə edəcəksinizsə, tələb olunur.
* <a href="https://jinja.palletsprojects.com" target="_blank"><code>jinja2</code></a> - Standart <abbr title="Şablon: Template">şablon</abbr> konfiqurasiyasından istifadə etmək istəyirsinizsə, tələb olunur.
* <a href="https://github.com/Kludex/python-multipart" target="_blank"><code>python-multipart</code></a> - `request.form()` ilə forma <abbr title="HTTP sorğusu ilə alınan string məlumatın Python obyektinə çevrilməsi">"çevirmə"</abbr> dəstəyindən istifadə etmək istəyirsinizsə, tələb olunur.
* <a href="https://pythonhosted.org/itsdangerous/" target="_blank"><code>itsdangerous</code></a> - `SessionMiddleware` dəstəyi üçün tələb olunur.
* <a href="https://pyyaml.org/wiki/PyYAMLDocumentation" target="_blank"><code>pyyaml</code></a> - `SchemaGenerator` dəstəyi üçün tələb olunur (Çox güman ki, FastAPI istifadə edərkən buna ehtiyacınız olmayacaq).
* <a href="https://github.com/esnme/ultrajson" target="_blank"><code>ujson</code></a> - `UJSONResponse` istifadə etmək istəyirsinizsə, tələb olunur.
Həm FastAPI, həm də Starlette tərəfindən istifadə olunur:
* <a href="https://www.uvicorn.org" target="_blank"><code>uvicorn</code></a> - Yaratdığımız proqramı servis edəcək veb server kimi fəaliyyət göstərir.
* <a href="https://github.com/ijl/orjson" target="_blank"><code>orjson</code></a> - `ORJSONResponse` istifadə edəcəksinizsə tələb olunur.
Bütün bunları `pip install fastapi[all]` ilə quraşdıra bilərsiniz.
## Lisenziya
Bu layihə MIT lisenziyasının şərtlərinə əsasən lisenziyalaşdırılıb.

View File

@@ -1,5 +0,0 @@
# Öyrən
Burada **FastAPI** öyrənmək üçün giriş bölmələri və dərsliklər yer alır.
Siz bunu kitab, kurs, FastAPI öyrənmək üçün rəsmi və tövsiyə olunan üsul hesab edə bilərsiniz. 😎

View File

@@ -1 +0,0 @@
INHERIT: ../en/mkdocs.yml

View File

@@ -1,463 +0,0 @@
<p align="center">
<a href="https://fastapi.tiangolo.com"><img src="https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png" alt="FastAPI"></a>
</p>
<p align="center">
<em>FastAPI উচ্চক্ষমতা সম্পন্ন, সহজে শেখার এবং দ্রুত কোড করে প্রোডাকশনের জন্য ফ্রামওয়ার্ক।</em>
</p>
<p align="center">
<a href="https://github.com/tiangolo/fastapi/actions?query=workflow%3ATest" target="_blank">
<img src="https://github.com/tiangolo/fastapi/workflows/Test/badge.svg" alt="Test">
</a>
<a href="https://codecov.io/gh/tiangolo/fastapi" target="_blank">
<img src="https://img.shields.io/codecov/c/github/tiangolo/fastapi?color=%2334D058" alt="Coverage">
</a>
<a href="https://pypi.org/project/fastapi" target="_blank">
<img src="https://img.shields.io/pypi/v/fastapi?color=%2334D058&label=pypi%20package" alt="Package version">
</a>
</p>
---
**নির্দেশিকা নথি**: <a href="https://fastapi.tiangolo.com" target="_blank">https://fastapi.tiangolo.com</a>
**সোর্স কোড**: <a href="https://github.com/tiangolo/fastapi" target="_blank">https://github.com/tiangolo/fastapi</a>
---
FastAPI একটি আধুনিক, দ্রুত ( বেশি ক্ষমতা ) সম্পন্ন, Python 3.6+ দিয়ে API তৈরির জন্য স্ট্যান্ডার্ড পাইথন টাইপ ইঙ্গিত ভিত্তিক ওয়েব ফ্রেমওয়ার্ক।
এর মূল বৈশিষ্ট্য গুলো হলঃ
- **গতি**: এটি **NodeJS** এবং **Go** এর মত কার্যক্ষমতা সম্পন্ন (Starlette এবং Pydantic এর সাহায্যে)। [পাইথন এর দ্রুততম ফ্রেমওয়ার্ক গুলোর মধ্যে এটি একটি](#_11)।
- **দ্রুত কোড করা**:বৈশিষ্ট্য তৈরির গতি ২০০% থেকে ৩০০% বৃদ্ধি করে৷ \*
- **স্বল্প bugs**: মানুব (ডেভেলপার) সৃষ্ট ত্রুটির প্রায় % হ্রাস করে। \*
- **স্বজ্ঞাত**: দুর্দান্ত এডিটর সাহায্য <abbr title="also known as auto-complete, autocompletion, IntelliSense">Completion</abbr> নামেও পরিচিত। দ্রুত ডিবাগ করা যায়।
- **সহজ**: এটি এমন ভাবে সজানো হয়েছে যেন নির্দেশিকা নথি পড়ে সহজে শেখা এবং ব্যবহার করা যায়।
- **সংক্ষিপ্ত**: কোড পুনরাবৃত্তি কমানোর পাশাপাশি, bug কমায় এবং প্রতিটি প্যারামিটার ঘোষণা থেকে একাধিক ফিচার পাওয়া যায় ।
- **জোরালো**: স্বয়ংক্রিয় ভাবে তৈরি ক্রিয়াশীল নির্দেশনা নথি (documentation) সহ উৎপাদন উপযোগি (Production-ready) কোড পাওয়া যায়।
- **মান-ভিত্তিক**: এর ভিত্তি <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> (যা পুর্বে Swagger নামে পরিচিত ছিল) এবং <a href="https://json-schema.org/" class="external-link" target="_blank">JSON Schema</a> এর আদর্শের মানের ওপর
<small>\* উৎপাদনমুখি এপ্লিকেশন বানানোর এক দল ডেভেলপার এর মতামত ভিত্তিক ফলাফল।</small>
## স্পনসর গণ
<!-- sponsors -->
{% if sponsors %}
{% for sponsor in sponsors.gold -%}
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
{% endfor -%}
{%- for sponsor in sponsors.silver -%}
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
{% endfor %}
{% endif %}
<!-- /sponsors -->
<a href="https://fastapi.tiangolo.com/fastapi-people/#sponsors" class="external-link" target="_blank">অন্যান্য স্পনসর গণ</a>
## মতামত সমূহ
"_আমি আজকাল **FastAPI** ব্যবহার করছি। [...] আমরা ভাবছি মাইক্রোসফ্টে **ML সার্ভিস** এ সকল দলের জন্য এটি ব্যবহার করব। যার মধ্যে কিছু পণ্য **Windows** এ সংযোযন হয় এবং কিছু **Office** এর সাথে সংযোযন হচ্ছে।_"
<div style="text-align: right; margin-right: 10%;">কবির খান - <strong>মাইক্রোসফ্টে</strong> <a href="https://github.com/tiangolo/fastapi/pull/26" target="_blank"><small>(ref)</small></a></div>
---
"_আমরা **FastAPI** লাইব্রেরি গ্রহণ করেছি একটি **REST** সার্ভার তৈরি করতে, যা **ভবিষ্যদ্বাণী** পাওয়ার জন্য কুয়েরি করা যেতে পারে। [লুডউইগের জন্য]_"
<div style="text-align: right; margin-right: 10%;">পিয়েরো মোলিনো, ইয়ারোস্লাভ দুদিন, এবং সাই সুমন্থ মিরিয়ালা - <strong>উবার</strong> <a href="https://eng.uber.com/ludwig-v0-2/" target="_blank"><small>(ref)</small></a></div>
---
"_**Netflix** আমাদের **ক্রাইসিস ম্যানেজমেন্ট** অর্কেস্ট্রেশন ফ্রেমওয়ার্ক: **ডিসপ্যাচ** এর ওপেন সোর্স রিলিজ ঘোষণা করতে পেরে আনন্দিত! [যাকিনা **FastAPI** দিয়ে নির্মিত]_"
<div style="text-align: right; margin-right: 10%;">কেভিন গ্লিসন, মার্ক ভিলানোভা, ফরেস্ট মনসেন - <strong>নেটফ্লিক্স</strong> <a href="https://netflixtechblog.com/introducing-dispatch-da4b8a2a8072" target="_blank"><small>(ref)</small></a></div>
---
"_আমি **FastAPI** নিয়ে চাঁদের সমান উৎসাহিত। এটি খুবই মজার!_"
<div style="text-align: right; margin-right: 10%;">ব্রায়ান ওকেন - <strong><a href="https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855" target="_blank">পাইথন বাইটস</a> পডকাস্ট হোস্ট</strong> <a href="https://twitter.com/brianokken/status/1112220079972728832" target="_blank"><small>(ref)</small></a></div>
---
"\_সত্যিই, আপনি যা তৈরি করেছেন তা খুব মজবুত এবং পরিপূর্ন৷ অনেক উপায়ে, আমি যা **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>
---
"আপনি যদি REST API তৈরির জন্য একটি **আধুনিক ফ্রেমওয়ার্ক** শিখতে চান, তাহলে **FastAPI** দেখুন [...] এটি দ্রুত, ব্যবহার করা সহজ এবং শিখতেও সহজ [...]\_"
"_আমরা আমাদের **APIs** [...] এর জন্য **FastAPI**- তে এসেছি [...] আমি মনে করি আপনিও এটি পছন্দ করবেন [...]_"
<div style="text-align: right; margin-right: 10%;">ইনেস মন্টানি - ম্যাথিউ হোনিবাল - <strong><a href="https://explosion.ai" target="_blank">Explosion AI</a> প্রতিষ্ঠাতা - <a href="https://spacy.io" target="_blank">spaCy</a> স্রষ্টা</strong> <a href="https://twitter.com/_inesmontani/status/1144173225322143744" target="_blank"><small>(ref)</small></a> - <a href="https://twitter.com/honnibal/status/1144031421859655680" target="_blank"><small>(ref)</small></a></div>
---
## **Typer**, CLI এর জন্য FastAPI
<a href="https://typer.tiangolo.com" target="_blank"><img src="https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg" style="width: 20%;"></a>
আপনি যদি <abbr title="Command Line Interface">CLI</abbr> অ্যাপ বানাতে চান, যা কিনা ওয়েব API এর পরিবর্তে টার্মিনালে ব্যবহার হবে, তাহলে দেখুন<a href="https://typer.tiangolo.com/" class="external-link" target="_blank">**Typer**</a>.
**টাইপার** হল FastAPI এর ছোট ভাইয়ের মত। এবং এটির উদ্দেশ্য ছিল **CLIs এর FastAPI** হওয়া। ⌨️ 🚀
## প্রয়োজনীয়তা গুলো
Python 3.7+
FastAPI কিছু দানবেদের কাঁধে দাঁড়িয়ে আছে:
- <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a> ওয়েব অংশের জন্য.
- <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> ডেটা অংশগুলির জন্য.
## ইনস্টলেশন প্রক্রিয়া
<div class="termy">
```console
$ pip install fastapi
---> 100%
```
</div>
আপনার একটি ASGI সার্ভারেরও প্রয়োজন হবে, প্রোডাকশনের জন্য <a href="https://www.uvicorn.org" class="external-link" target="_blank">Uvicorn</a> অথবা <a href="https://gitlab.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>.
<div class="termy">
```console
$ pip install "uvicorn[standard]"
---> 100%
```
</div>
## উদাহরণ
### তৈরি
- `main.py` নামে একটি ফাইল তৈরি করুন:
```Python
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
<details markdown="1">
<summary>অথবা ব্যবহার করুন <code>async def</code>...</summary>
যদি আপনার কোড `async` / `await`, ব্যবহার করে তাহলে `async def` ব্যবহার করুন:
```Python hl_lines="9 14"
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
**টীকা**:
আপনি যদি না জানেন, _"তাড়াহুড়ো?"_ বিভাগটি দেখুন <a href="https://fastapi.tiangolo.com/async/#in-a-hurry" target="_blank">`async` এবং `await` নথির মধ্যে দেখুন </a>.
</details>
### এটি চালান
সার্ভার চালু করুন:
<div class="termy">
```console
$ uvicorn main:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [28720]
INFO: Started server process [28722]
INFO: Waiting for application startup.
INFO: Application startup complete.
```
</div>
<details markdown="1">
<summary>নির্দেশনা সম্পর্কে <code>uvicorn main:app --reload</code>...</summary>
`uvicorn main:app` নির্দেশনাটি দ্বারা বোঝায়:
- `main`: ফাইল `main.py` (পাইথন "মডিউল")।
- `app`: `app = FastAPI()` লাইন দিয়ে `main.py` এর ভিতরে তৈরি করা অবজেক্ট।
- `--reload`: কোড পরিবর্তনের পরে সার্ভার পুনরায় চালু করুন। এটি শুধুমাত্র ডেভেলপমেন্ট এর সময় ব্যবহার করুন।
</details>
### এটা চেক করুন
আপনার ব্রাউজার খুলুন <a href="http://127.0.0.1:8000/items/5?q=somequery" class="external-link" target="_blank">http://127.0.0.1:8000/items/5?q=somequery</a> এ।
আপনি JSON রেসপন্স দেখতে পাবেন:
```JSON
{"item_id": 5, "q": "somequery"}
```
আপনি ইতিমধ্যে একটি API তৈরি করেছেন যা:
- `/` এবং `/items/{item_id}` _paths_ এ HTTP অনুরোধ গ্রহণ করে।
- উভয় *path*ই `GET` <em>অপারেশন</em> নেয় ( যা HTTP _methods_ নামেও পরিচিত)।
- _path_ `/items/{item_id}`-এ একটি _path প্যারামিটার_ `item_id` আছে যা কিনা `int` হতে হবে।
- _path_ `/items/{item_id}`-এর একটি ঐচ্ছিক `str` _query প্যারামিটার_ `q` আছে।
### ক্রিয়াশীল API নির্দেশিকা নথি
এখন যান <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
আপনি স্বয়ংক্রিয় ভাবে প্রস্তুত ক্রিয়াশীল API নির্দেশিকা নথি দেখতে পাবেন (<a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a> প্রদত্ত):
![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png)
### বিকল্প API নির্দেশিকা নথি
এবং এখন <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a> এ যান.
আপনি স্বয়ংক্রিয় ভাবে প্রস্তুত বিকল্প নির্দেশিকা নথি দেখতে পাবেন (<a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a> প্রদত্ত):
![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
## উদাহরণস্বরূপ আপগ্রেড
এখন `main.py` ফাইলটি পরিবর্তন করুন যেন এটি `PUT` রিকুয়েস্ট থেকে বডি পেতে পারে।
Python স্ট্যান্ডার্ড লাইব্রেরি, Pydantic এর সাহায্যে বডি ঘোষণা করুন।
```Python hl_lines="4 9-12 25-27"
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: Union[bool, None] = None
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
```
সার্ভারটি স্বয়ংক্রিয়ভাবে পুনরায় লোড হওয়া উচিত (কারণ আপনি উপরের `uvicorn` কমান্ডে `--reload` যোগ করেছেন)।
### ক্রিয়াশীল API নির্দেশিকা নথি উন্নীতকরণ
এখন <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> এডড্রেসে যান.
- ক্রিয়াশীল API নির্দেশিকা নথিটি স্বয়ংক্রিয়ভাবে উন্নীত হযে যাবে, নতুন বডি সহ:
![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png)
- "Try it out" বাটনে চাপুন, এটি আপনাকে পেরামিটারগুলো পূরণ করতে এবং API এর সাথে সরাসরি ক্রিয়া-কলাপ করতে দিবে:
![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png)
- তারপরে "Execute" বাটনে চাপুন, ব্যবহারকারীর ইন্টারফেস আপনার API এর সাথে যোগাযোগ করবে, পেরামিটার পাঠাবে, ফলাফলগুলি পাবে এবং সেগুলি পর্রদায় দেখাবে:
![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png)
### বিকল্প API নির্দেশিকা নথি আপগ্রেড
এবং এখন <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a> এ যান।
- বিকল্প নির্দেশিকা নথিতেও নতুন কুয়েরি প্যারামিটার এবং বডি প্রতিফলিত হবে:
![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png)
### সংক্ষিপ্তকরণ
সংক্ষেপে, আপনি **শুধু একবার** প্যারামিটারের ধরন, বডি ইত্যাদি ফাংশন প্যারামিটার হিসেবে ঘোষণা করেন।
আপনি সেটি আধুনিক পাইথনের সাথে করেন।
আপনাকে নতুন করে নির্দিষ্ট কোন লাইব্রেরির বাক্য গঠন, ফাংশন বা ক্লাস কিছুই শিখতে হচ্ছে না।
শুধুই আধুনিক **Python 3.6+**
উদাহরণস্বরূপ, `int` এর জন্য:
```Python
item_id: int
```
অথবা আরও জটিল `Item` মডেলের জন্য:
```Python
item: Item
```
...এবং সেই একই ঘোষণার সাথে আপনি পাবেন:
- এডিটর সাহায্য, যেমন
- সমাপ্তি।
- ধরণ যাচাই
- তথ্য যাচাইকরণ:
- ডেটা অবৈধ হলে স্বয়ংক্রিয় এবং পরিষ্কার ত্রুটির নির্দেশনা।
- এমনকি গভীরভাবে নেস্ট করা JSON অবজেক্টের জন্য বৈধতা।
- প্রেরিত তথ্য <abbr title="যা পরিচিত: serialization, parsing, marshalling">রূপান্তর</abbr>: যা নেটওয়ার্ক থেকে পাইথনের তথ্য এবং ধরনে আসে, এবং সেখান থেকে পড়া:
- JSON।
- পাথ প্যারামিটার।
- কুয়েরি প্যারামিটার।
- কুকিজ
- হেডার
- ফর্ম
- ফাইল
- আউটপুট ডেটার <abbr title="যা পরিচিত: serialization, parsing, marshalling">রূপান্তর</abbr>: পাইথন ডেটা এবং টাইপ থেকে নেটওয়ার্ক ডেটাতে রূপান্তর করা (JSON হিসাবে):
-পাইথন টাইপে রূপান্তর করুন (`str`, `int`, `float`, `bool`, `list`, ইত্যাদি)।
- `datetime` অবজেক্ট।
- `UUID` objeঅবজেক্টcts।
- ডাটাবেস মডেল।
- ...এবং আরো অনেক।
- স্বয়ংক্রিয় ক্রিয়াশীল API নির্দেশিকা নথি, 2টি বিকল্প ব্যবহারকারীর ইন্টারফেস সহ:
- সোয়াগার ইউ আই (Swagger UI)।
- রিডক (ReDoc)।
---
পূর্ববর্তী কোড উদাহরণে ফিরে আসা যাক, **FastAPI** যা করবে:
- `GET` এবং `PUT` অনুরোধের জন্য পথে `item_id` আছে কিনা তা যাচাই করবে।
- `GET` এবং `PUT` অনুরোধের জন্য `item_id` টাইপ `int` এর হতে হবে তা যাচাই করবে।
- যদি না হয় তবে ক্লায়েন্ট একটি উপযুক্ত, পরিষ্কার ত্রুটি দেখতে পাবেন।
- `GET` অনুরোধের জন্য একটি ঐচ্ছিক ক্যুয়েরি প্যারামিটার নামক `q` (যেমন `http://127.0.0.1:8000/items/foo?q=somequery`) আছে কি তা চেক করবে।
- যেহেতু `q` প্যারামিটারটি `= None` দিয়ে ঘোষণা করা হয়েছে, তাই এটি ঐচ্ছিক।
- `None` ছাড়া এটি প্রয়োজনীয় হতো (যেমন `PUT` এর ক্ষেত্রে হয়েছে)।
- `/items/{item_id}` এর জন্য `PUT` অনুরোধের বডি JSON হিসাবে পড়ুন:
- লক্ষ করুন, `name` একটি প্রয়োজনীয় অ্যাট্রিবিউট হিসাবে বিবেচনা করেছে এবং এটি `str` হতে হবে।
- লক্ষ করুন এখানে, `price` অ্যাট্রিবিউটটি আবশ্যক এবং এটি `float` হতে হবে।
- লক্ষ করুন `is_offer` একটি ঐচ্ছিক অ্যাট্রিবিউট এবং এটি `bool` হতে হবে যদি উপস্থিত থাকে।
- এই সবটি গভীরভাবে অবস্থানরত JSON অবজেক্টগুলিতেও কাজ করবে।
- স্বয়ংক্রিয়ভাবে JSON হতে এবং JSON থেকে কনভার্ট করুন।
- OpenAPI দিয়ে সবকিছু ডকুমেন্ট করুন, যা ব্যবহার করা যেতে পারে:
- ক্রিয়াশীল নির্দেশিকা নথি।
- অনেক ভাষার জন্য স্বয়ংক্রিয় ক্লায়েন্ট কোড তৈরির ব্যবস্থা।
- সরাসরি 2টি ক্রিয়াশীল নির্দেশিকা নথি ওয়েব পৃষ্ঠ প্রদান করা হয়েছে।
---
আমরা এতক্ষন শুধু এর পৃষ্ঠ তৈরি করেছি, কিন্তু আপনি ইতমধ্যেই এটি কিভাবে কাজ করে তার ধারণাও পেয়ে গিয়েছেন।
নিম্নোক্ত লাইন গুলো পরিবর্তন করার চেষ্টা করুন:
```Python
return {"item_name": item.name, "item_id": item_id}
```
...পুর্বে:
```Python
... "item_name": item.name ...
```
...পরবর্তীতে:
```Python
... "item_price": item.price ...
```
...এবং দেখুন কিভাবে আপনার এডিটর উপাদানগুলোকে সয়ংক্রিয়ভাবে-সম্পন্ন করবে এবং তাদের ধরন জানতে পারবে:
![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png)
আরও বৈশিষ্ট্য সম্পন্ন উদাহরণের জন্য, দেখুন <a href="https://fastapi.tiangolo.com/tutorial/">টিউটোরিয়াল - ব্যবহারকারীর গাইড</a>.
**স্পয়লার সতর্কতা**: টিউটোরিয়াল - ব্যবহারকারীর গাইড নিম্নোক্ত বিষয়গুলি অন্তর্ভুক্ত করে:
- **হেডার**, **কুকিজ**, **ফর্ম ফিল্ড** এবং **ফাইলগুলি** এমন অন্যান্য জায়গা থেকে প্যারামিটার ঘোষণা করা।
- `maximum_length` বা `regex` এর মতো **যাচাইকরণ বাধামুক্তি** সেট করা হয় কিভাবে, তা নিয়ে আলোচনা করা হবে।
- একটি খুব শক্তিশালী এবং ব্যবহার করা সহজ <abbr title="also known as components, resources, providers, services, injectables">ডিপেন্ডেন্সি ইনজেকশন</abbr> পদ্ধতি
- **OAuth2** এবং **JWT টোকেন** এবং **HTTP Basic** auth সহ নিরাপত্তা এবং অনুমোদনপ্রাপ্তি সম্পর্কিত বিষয়সমূহের উপর।
- **গভীরভাবে অবস্থানরত JSON মডেল** ঘোষণা করার জন্য আরও উন্নত (কিন্তু সমান সহজ) কৌশল (Pydantic কে ধন্যবাদ)।
- আরো অতিরিক্ত বৈশিষ্ট্য (স্টারলেটকে ধন্যবাদ) হিসাবে:
- **WebSockets**
- **GraphQL**
- HTTPX এবং `pytest` ভিত্তিক অত্যন্ত সহজ পরীক্ষা
- **CORS**
- **Cookie Sessions**
- ...এবং আরো।
## কর্মক্ষমতা
স্বাধীন TechEmpower Benchmarks দেখায় যে **FastAPI** অ্যাপ্লিকেশনগুলি Uvicorn-এর অধীনে চলমান দ্রুততম<a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">পাইথন ফ্রেমওয়ার্কগুলির মধ্যে একটি,</a> শুধুমাত্র Starlette এবং Uvicorn-এর পর (FastAPI দ্বারা অভ্যন্তরীণভাবে ব্যবহৃত)। (\*)
এটি সম্পর্কে আরও বুঝতে, দেখুন <a href="https://fastapi.tiangolo.com/benchmarks/" class="internal-link" target="_blank">Benchmarks</a>.
## ঐচ্ছিক নির্ভরশীলতা
Pydantic দ্বারা ব্যবহৃত:
- <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email_validator</code></a> - ইমেল যাচাইকরণের জন্য।
স্টারলেট দ্বারা ব্যবহৃত:
- <a href="https://www.python-httpx.org" target="_blank"><code>httpx</code></a> - আপনি যদি `TestClient` ব্যবহার করতে চান তাহলে আবশ্যক।
- <a href="https://jinja.palletsprojects.com" target="_blank"><code>jinja2</code></a> - আপনি যদি প্রদত্ত টেমপ্লেট রূপরেখা ব্যবহার করতে চান তাহলে প্রয়োজন।
- <a href="https://github.com/Kludex/python-multipart" target="_blank"><code>python-multipart</code></a> - আপনি যদি ফর্ম সহায়তা করতে চান তাহলে প্রয়োজন <abbr title="converting the string that comes from an HTTP request into Python data">"parsing"</abbr>, `request.form()` সহ।
- <a href="https://pythonhosted.org/itsdangerous/" target="_blank"><code>itsdangerous</code></a> - `SessionMiddleware` সহায়তার জন্য প্রয়োজন।
- <a href="https://pyyaml.org/wiki/PyYAMLDocumentation" target="_blank"><code>pyyaml</code></a> - স্টারলেটের SchemaGenerator সাপোর্ট এর জন্য প্রয়োজন (আপনার সম্ভাবত FastAPI প্রয়োজন নেই)।
- <a href="https://graphene-python.org/" target="_blank"><code>graphene</code></a> - `GraphQLApp` সহায়তার জন্য প্রয়োজন।
FastAPI / Starlette দ্বারা ব্যবহৃত:
- <a href="https://www.uvicorn.org" target="_blank"><code>uvicorn</code></a> - সার্ভারের জন্য যা আপনার অ্যাপ্লিকেশন লোড করে এবং পরিবেশন করে।
- <a href="https://github.com/ijl/orjson" target="_blank"><code>orjson</code></a> - আপনি `ORJSONResponse` ব্যবহার করতে চাইলে প্রয়োজন।
- <a href="https://github.com/esnme/ultrajson" target="_blank"><code>ujson</code></a> - আপনি `UJSONResponse` ব্যবহার করতে চাইলে প্রয়োজন।
আপনি এই সব ইনস্টল করতে পারেন `pip install fastapi[all]` দিয়ে.
## লাইসেন্স
এই প্রজেক্ট MIT লাইসেন্স নীতিমালার অধীনে শর্তায়িত।

View File

@@ -1,5 +0,0 @@
# শিখুন
এখানে **FastAPI** শিখার জন্য প্রাথমিক বিভাগগুলি এবং টিউটোরিয়ালগুলি রয়েছে।
আপনি এটিকে একটি **বই**, একটি **কোর্স**, এবং FastAPI শিখার **অফিসিয়াল** এবং প্রস্তাবিত উপায় বিবেচনা করতে পারেন। 😎

View File

@@ -1,537 +0,0 @@
# পাইথন এর <abbr title="একটি ভেরিয়েবল কি ধরনের ডেটা ধারণ করতে পারে।">টাইপ্স</abbr> পরিচিতি
Python-এ ঐচ্ছিক "টাইপ হিন্ট" (যা "টাইপ অ্যানোটেশন" নামেও পরিচিত) এর জন্য সাপোর্ট রয়েছে।
এই **"টাইপ হিন্ট"** বা অ্যানোটেশনগুলি এক ধরণের বিশেষ <abbr title="সিনট্যাক্স হল প্রোগ্রামিং ভাষায় কোড লেখার নিয়ম ও গঠন।">সিনট্যাক্স</abbr> যা একটি ভেরিয়েবলের <abbr title="যেমন: str, int, float, bool">টাইপ</abbr> ঘোষণা করতে দেয়।
ভেরিয়েবলগুলির জন্য টাইপ ঘোষণা করলে, এডিটর এবং টুলগুলি আপনাকে আরও ভালো সাপোর্ট দিতে পারে।
এটি পাইথন টাইপ হিন্ট সম্পর্কে একটি দ্রুত **টিউটোরিয়াল / রিফ্রেশার** মাত্র। এটি **FastAPI** এর সাথে ব্যবহার করার জন্য শুধুমাত্র ন্যূনতম প্রয়োজনীয়তা কভার করে... যা আসলে খুব একটা বেশি না।
**FastAPI** এই টাইপ হিন্টগুলির উপর ভিত্তি করে নির্মিত, যা এটিকে অনেক সুবিধা এবং লাভ প্রদান করে।
তবে, আপনি যদি কখনো **FastAPI** ব্যবহার নাও করেন, তবুও এগুলি সম্পর্কে একটু শেখা আপনার উপকারে আসবে।
!!! Note
যদি আপনি একজন Python বিশেষজ্ঞ হন, এবং টাইপ হিন্ট সম্পর্কে সবকিছু জানেন, তাহলে পরবর্তী অধ্যায়ে চলে যান।
## প্রেরণা
চলুন একটি সাধারণ উদাহরণ দিয়ে শুরু করি:
```Python
{!../../../docs_src/python_types/tutorial001.py!}
```
এই প্রোগ্রামটি কল করলে আউটপুট হয়:
```
John Doe
```
ফাংশনটি নিম্নলিখিত কাজ করে:
* `first_name` এবং `last_name` নেয়।
* প্রতিটির প্রথম অক্ষরকে `title()` ব্যবহার করে বড় হাতের অক্ষরে রূপান্তর করে।
* তাদেরকে মাঝখানে একটি স্পেস দিয়ে <abbr title="একটার পরে একটা একত্রিত করা">concatenate</abbr> করে।
```Python hl_lines="2"
{!../../../docs_src/python_types/tutorial001.py!}
```
### এটি সম্পাদনা করুন
এটি একটি খুব সাধারণ প্রোগ্রাম।
কিন্তু এখন কল্পনা করুন যে আপনি এটি শুরু থেকে লিখছিলেন।
এক পর্যায়ে আপনি ফাংশনের সংজ্ঞা শুরু করেছিলেন, আপনার প্যারামিটারগুলি প্রস্তুত ছিল...
কিন্তু তারপর আপনাকে "সেই method কল করতে হবে যা প্রথম অক্ষরকে বড় হাতের অক্ষরে রূপান্তর করে"।
এটা কি `upper` ছিল? নাকি `uppercase`? `first_uppercase`? `capitalize`?
তারপর, আপনি পুরোনো প্রোগ্রামারের বন্ধু, এডিটর অটোকমপ্লিশনের সাহায্যে নেওয়ার চেষ্টা করেন।
আপনি ফাংশনের প্রথম প্যারামিটার `first_name` টাইপ করেন, তারপর একটি ডট (`.`) টাইপ করেন এবং `Ctrl+Space` চাপেন অটোকমপ্লিশন ট্রিগার করার জন্য।
কিন্তু, দুর্ভাগ্যবশত, আপনি কিছুই উপযোগী পান না:
<img src="/img/python-types/image01.png">
### টাইপ যোগ করুন
আসুন আগের সংস্করণ থেকে একটি লাইন পরিবর্তন করি।
আমরা ঠিক এই অংশটি পরিবর্তন করব অর্থাৎ ফাংশনের প্যারামিটারগুলি, এইগুলি:
```Python
first_name, last_name
```
থেকে এইগুলি:
```Python
first_name: str, last_name: str
```
ব্যাস।
এগুলিই "টাইপ হিন্ট":
```Python hl_lines="1"
{!../../../docs_src/python_types/tutorial002.py!}
```
এটি ডিফল্ট ভ্যালু ঘোষণা করার মত নয় যেমন:
```Python
first_name="john", last_name="doe"
```
এটি একটি ভিন্ন জিনিস।
আমরা সমান (`=`) নয়, কোলন (`:`) ব্যবহার করছি।
এবং টাইপ হিন্ট যোগ করা সাধারণত তেমন কিছু পরিবর্তন করে না যা টাইপ হিন্ট ছাড়াই ঘটত।
কিন্তু এখন, কল্পনা করুন আপনি আবার সেই ফাংশন তৈরির মাঝখানে আছেন, কিন্তু টাইপ হিন্ট সহ।
একই পর্যায়ে, আপনি অটোকমপ্লিট ট্রিগার করতে `Ctrl+Space` চাপেন এবং আপনি দেখতে পান:
<img src="/img/python-types/image02.png">
এর সাথে, আপনি অপশনগুলি দেখে, স্ক্রল করতে পারেন, যতক্ষণ না আপনি এমন একটি অপশন খুঁজে পান যা কিছু মনে পরিয়ে দেয়:
<img src="/img/python-types/image03.png">
## আরও প্রেরণা
এই ফাংশনটি দেখুন, এটিতে ইতিমধ্যে টাইপ হিন্ট রয়েছে:
```Python hl_lines="1"
{!../../../docs_src/python_types/tutorial003.py!}
```
এডিটর ভেরিয়েবলগুলির টাইপ জানার কারণে, আপনি শুধুমাত্র অটোকমপ্লিশনই পান না, আপনি এরর চেকও পান:
<img src="/img/python-types/image04.png">
এখন আপনি জানেন যে আপনাকে এটি ঠিক করতে হবে, `age`-কে একটি স্ট্রিং হিসেবে রূপান্তর করতে `str(age)` ব্যবহার করতে হবে:
```Python hl_lines="2"
{!../../../docs_src/python_types/tutorial004.py!}
```
## টাইপ ঘোষণা
আপনি এতক্ষন টাইপ হিন্ট ঘোষণা করার মূল স্থানটি দেখে ফেলেছেন-- ফাংশন প্যারামিটার হিসেবে।
সাধারণত এটি **FastAPI** এর ক্ষেত্রেও একই।
### সিম্পল টাইপ
আপনি `str` ছাড়াও সমস্ত স্ট্যান্ডার্ড পাইথন টাইপ ঘোষণা করতে পারেন।
উদাহরণস্বরূপ, আপনি এগুলো ব্যবহার করতে পারেন:
* `int`
* `float`
* `bool`
* `bytes`
```Python hl_lines="1"
{!../../../docs_src/python_types/tutorial005.py!}
```
### টাইপ প্যারামিটার সহ জেনেরিক টাইপ
কিছু ডাটা স্ট্রাকচার অন্যান্য মান ধারণ করতে পারে, যেমন `dict`, `list`, `set` এবং `tuple`। এবং অভ্যন্তরীণ মানগুলোরও নিজেদের টাইপ থাকতে পারে।
এই ধরনের টাইপগুলিকে বলা হয় "**জেনেরিক**" টাইপ এবং এগুলিকে তাদের অভ্যন্তরীণ টাইপগুলি সহ ঘোষণা করা সম্ভব।
এই টাইপগুলি এবং অভ্যন্তরীণ টাইপগুলি ঘোষণা করতে, আপনি Python মডিউল `typing` ব্যবহার করতে পারেন। এটি বিশেষভাবে এই টাইপ হিন্টগুলি সমর্থন করার জন্য রয়েছে।
#### Python এর নতুন সংস্করণ
`typing` ব্যবহার করা সিনট্যাক্সটি Python 3.6 থেকে সর্বশেষ সংস্করণগুলি পর্যন্ত, অর্থাৎ Python 3.9, Python 3.10 ইত্যাদি সহ সকল সংস্করণের সাথে **সামঞ্জস্যপূর্ণ**।
Python যত এগিয়ে যাচ্ছে, **নতুন সংস্করণগুলি** এই টাইপ অ্যানোটেশনগুলির জন্য তত উন্নত সাপোর্ট নিয়ে আসছে এবং অনেক ক্ষেত্রে আপনাকে টাইপ অ্যানোটেশন ঘোষণা করতে `typing` মডিউল ইম্পোর্ট এবং ব্যবহার করার প্রয়োজন হবে না।
যদি আপনি আপনার প্রজেক্টের জন্য Python-এর আরও সাম্প্রতিক সংস্করণ নির্বাচন করতে পারেন, তাহলে আপনি সেই অতিরিক্ত সরলতা থেকে সুবিধা নিতে পারবেন।
ডক্সে রয়েছে Python-এর প্রতিটি সংস্করণের সাথে সামঞ্জস্যপূর্ণ উদাহরণগুলি (যখন পার্থক্য আছে)।
উদাহরণস্বরূপ, "**Python 3.6+**" মানে এটি Python 3.6 বা তার উপরে সামঞ্জস্যপূর্ণ (যার মধ্যে 3.7, 3.8, 3.9, 3.10, ইত্যাদি অন্তর্ভুক্ত)। এবং "**Python 3.9+**" মানে এটি Python 3.9 বা তার উপরে সামঞ্জস্যপূর্ণ (যার মধ্যে 3.10, ইত্যাদি অন্তর্ভুক্ত)।
যদি আপনি Python-এর **সর্বশেষ সংস্করণগুলি ব্যবহার করতে পারেন**, তাহলে সর্বশেষ সংস্করণের জন্য উদাহরণগুলি ব্যবহার করুন, সেগুলি আপনাকে **সর্বোত্তম এবং সহজতম সিনট্যাক্স** প্রদান করবে, যেমন, "**Python 3.10+**"।
#### লিস্ট
উদাহরণস্বরূপ, একটি ভেরিয়েবলকে `str`-এর একটি `list` হিসেবে সংজ্ঞায়িত করা যাক।
=== "Python 3.9+"
ভেরিয়েবলটি ঘোষণা করুন, একই কোলন (`:`) সিনট্যাক্স ব্যবহার করে।
টাইপ হিসেবে, `list` ব্যবহার করুন।
যেহেতু লিস্ট এমন একটি টাইপ যা অভ্যন্তরীণ টাইপগুলি ধারণ করে, আপনি তাদের স্কোয়ার ব্রাকেটের ভিতরে ব্যবহার করুন:
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial006_py39.py!}
```
=== "Python 3.8+"
`typing` থেকে `List` (বড় হাতের `L` দিয়ে) ইমপোর্ট করুন:
``` Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial006.py!}
```
ভেরিয়েবলটি ঘোষণা করুন, একই কোলন (`:`) সিনট্যাক্স ব্যবহার করে।
টাইপ হিসেবে, `typing` থেকে আপনার ইম্পোর্ট করা `List` ব্যবহার করুন।
যেহেতু লিস্ট এমন একটি টাইপ যা অভ্যন্তরীণ টাইপগুলি ধারণ করে, আপনি তাদের স্কোয়ার ব্রাকেটের ভিতরে করুন:
```Python hl_lines="4"
{!> ../../../docs_src/python_types/tutorial006.py!}
```
!!! Info
স্কোয়ার ব্রাকেট এর ভিতরে ব্যবহৃত এইসব অভন্তরীন টাইপগুলোকে "ইন্টারনাল টাইপ" বলে।
এই উদাহরণে, এটি হচ্ছে `List`(অথবা পাইথন ৩.৯ বা তার উপরের সংস্করণের ক্ষেত্রে `list`) এ পাস করা টাইপ প্যারামিটার।
এর অর্থ হচ্ছে: "ভেরিয়েবল `items` একটি `list`, এবং এই লিস্টের প্রতিটি আইটেম একটি `str`।"
!!! Tip
যদি আপনি Python 3.9 বা তার উপরে ব্যবহার করেন, আপনার `typing` থেকে `List` আমদানি করতে হবে না, আপনি সাধারণ `list` ওই টাইপের পরিবর্তে ব্যবহার করতে পারেন।
এর মাধ্যমে, আপনার এডিটর লিস্ট থেকে আইটেম প্রসেস করার সময় সাপোর্ট প্রদান করতে পারবে:
<img src="/img/python-types/image05.png">
টাইপগুলি ছাড়া, এটি করা প্রায় অসম্ভব।
লক্ষ্য করুন যে ভেরিয়েবল `item` হল `items` লিস্টের একটি এলিমেন্ট।
তবুও, এডিটর জানে যে এটি একটি `str`, এবং তার জন্য সাপোর্ট প্রদান করে।
#### টাপল এবং সেট
আপনি `tuple` এবং `set` ঘোষণা করার জন্য একই প্রক্রিয়া অনুসরণ করবেন:
=== "Python 3.9+"
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial007_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial007.py!}
```
এর মানে হল:
* ভেরিয়েবল `items_t` হল একটি `tuple` যা ৩টি আইটেম ধারণ করে, একটি `int`, অন্য একটি `int`, এবং একটি `str`।
* ভেরিয়েবল `items_s` হল একটি `set`, এবং এর প্রতিটি আইটেম হল `bytes` টাইপের।
#### ডিক্ট
একটি `dict` সংজ্ঞায়িত করতে, আপনি ২টি টাইপ প্যারামিটার কমা দ্বারা পৃথক করে দেবেন।
প্রথম টাইপ প্যারামিটারটি হল `dict`-এর কীগুলির জন্য।
দ্বিতীয় টাইপ প্যারামিটারটি হল `dict`-এর মানগুলির জন্য:
=== "Python 3.9+"
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial008_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial008.py!}
```
এর মানে হল:
* ভেরিয়েবল `prices` হল একটি `dict`:
* এই `dict`-এর কীগুলি হল `str` টাইপের (ধরা যাক, প্রতিটি আইটেমের নাম)।
* এই `dict`-এর মানগুলি হল `float` টাইপের (ধরা যাক, প্রতিটি আইটেমের দাম)।
#### ইউনিয়ন
আপনি একটি ভেরিয়েবলকে এমনভাবে ঘোষণা করতে পারেন যেন তা **একাধিক টাইপের** হয়, উদাহরণস্বরূপ, একটি `int` অথবা `str`।
Python 3.6 এবং তার উপরের সংস্করণগুলিতে (Python 3.10 অন্তর্ভুক্ত) আপনি `typing` থেকে `Union` টাইপ ব্যবহার করতে পারেন এবং স্কোয়ার ব্র্যাকেটের মধ্যে গ্রহণযোগ্য টাইপগুলি রাখতে পারেন।
Python 3.10-এ একটি **নতুন সিনট্যাক্স** আছে যেখানে আপনি সম্ভাব্য টাইপগুলিকে একটি <abbr title="উল্লম্ব বারালকে 'বিটওয়াইজ বা অপারেটর' বলা হয়, কিন্তু সেই অর্থ এখানে প্রাসঙ্গিক নয়">ভার্টিকাল বার (`|`)</abbr> দ্বারা পৃথক করতে পারেন।
=== "Python 3.10+"
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial008b_py310.py!}
```
=== "Python 3.8+"
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial008b.py!}
```
উভয় ক্ষেত্রেই এর মানে হল যে `item` হতে পারে একটি `int` অথবা `str`।
#### সম্ভবত `None`
আপনি এমনভাবে ঘোষণা করতে পারেন যে একটি মান হতে পারে এক টাইপের, যেমন `str`, আবার এটি `None`-ও হতে পারে।
Python 3.6 এবং তার উপরের সংস্করণগুলিতে (Python 3.10 অনতর্ভুক্ত) আপনি `typing` মডিউল থেকে `Optional` ইমপোর্ট করে এটি ঘোষণা এবং ব্যবহার করতে পারেন।
```Python hl_lines="1 4"
{!../../../docs_src/python_types/tutorial009.py!}
```
`Optional[str]` ব্যবহার করা মানে হল শুধু `str` নয়, এটি হতে পারে `None`-ও, যা আপনার এডিটরকে সেই ত্রুটিগুলি শনাক্ত করতে সাহায্য করবে যেখানে আপনি ধরে নিচ্ছেন যে একটি মান সবসময় `str` হবে, অথচ এটি `None`-ও হতে পারেও।
`Optional[Something]` মূলত `Union[Something, None]`-এর একটি শর্টকাট, এবং তারা সমতুল্য।
এর মানে হল, Python 3.10-এ, আপনি টাইপগুলির ইউনিয়ন ঘোষণা করতে `Something | None` ব্যবহার করতে পারেন:
=== "Python 3.10+"
```Python hl_lines="1"
{!> ../../../docs_src/python_types/tutorial009_py310.py!}
```
=== "Python 3.8+"
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial009.py!}
```
=== "Python 3.8+ বিকল্প"
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial009b.py!}
```
#### `Union` বা `Optional` ব্যবহার
যদি আপনি Python 3.10-এর নীচের সংস্করণ ব্যবহার করেন, তবে এখানে আমার খুবই **ব্যক্তিগত** দৃষ্টিভঙ্গি থেকে একটি টিপস:
* 🚨 `Optional[SomeType]` ব্যবহার এড়িয়ে চলুন।
* এর পরিবর্তে ✨ **`Union[SomeType, None]` ব্যবহার করুন** ✨।
উভয়ই সমতুল্য এবং মূলে একই, কিন্তু আমি `Union`-এর পক্ষে সুপারিশ করব কারণ "**অপশনাল**" শব্দটি মনে হতে পারে যে মানটি ঐচ্ছিক,অথচ এটি আসলে মানে "এটি হতে পারে `None`", এমনকি যদি এটি ঐচ্ছিক না হয়েও আবশ্যিক হয়।
আমি মনে করি `Union[SomeType, None]` এর অর্থ আরও স্পষ্টভাবে প্রকাশ করে।
এটি কেবল শব্দ এবং নামের ব্যাপার। কিন্তু সেই শব্দগুলি আপনি এবং আপনার সহকর্মীরা কোড সম্পর্কে কীভাবে চিন্তা করেন তা প্রভাবিত করতে পারে।
একটি উদাহরণ হিসেবে, এই ফাংশনটি নিন:
```Python hl_lines="1 4"
{!../../../docs_src/python_types/tutorial009c.py!}
```
`name` প্যারামিটারটি `Optional[str]` হিসেবে সংজ্ঞায়িত হয়েছে, কিন্তু এটি **অপশনাল নয়**, আপনি প্যারামিটার ছাড়া ফাংশনটি কল করতে পারবেন না:
```Python
say_hi() # ওহ না, এটি একটি ত্রুটি নিক্ষেপ করবে! 😱
```
`name` প্যারামিটারটি **এখনও আবশ্যিক** (নন-অপশনাল) কারণ এটির কোনো ডিফল্ট মান নেই। তবুও, `name` এর মান হিসেবে `None` গ্রহণযোগ্য:
```Python
say_hi(name=None) # এটি কাজ করে, None বৈধ 🎉
```
সুখবর হল, একবার আপনি Python 3.10 ব্যবহার করা শুরু করলে, আপনাকে এগুলোর ব্যাপারে আর চিন্তা করতে হবে না, যেহুতু আপনি | ব্যবহার করেই ইউনিয়ন ঘোষণা করতে পারবেন:
```Python hl_lines="1 4"
{!../../../docs_src/python_types/tutorial009c_py310.py!}
```
এবং তারপর আপনাকে নামগুলি যেমন `Optional` এবং `Union` নিয়ে আর চিন্তা করতে হবে না। 😎
#### জেনেরিক টাইপস
স্কোয়ার ব্র্যাকেটে টাইপ প্যারামিটার নেওয়া এই টাইপগুলিকে **জেনেরিক টাইপ** বা **জেনেরিকস** বলা হয়, যেমন:
=== "Python 3.10+"
আপনি সেই একই বিল্টইন টাইপ জেনেরিক্স হিসেবে ব্যবহার করতে পারবেন(ভিতরে টাইপ সহ স্কয়ারে ব্রাকেট দিয়ে):
* `list`
* `tuple`
* `set`
* `dict`
এবং Python 3.8 এর মতোই, `typing` মডিউল থেকে:
* `Union`
* `Optional` (Python 3.8 এর মতোই)
* ...এবং অন্যান্য।
Python 3.10-এ, `Union` এবং `Optional` জেনেরিকস ব্যবহার করার বিকল্প হিসেবে, আপনি টাইপগুলির ইউনিয়ন ঘোষণা করতে <abbr title="উল্লম্ব বারালকে 'বিটওয়াইজ বা অপারেটর' বলা হয়, কিন্তু সেই অর্থ এখানে প্রাসঙ্গিক নয়">ভার্টিকাল বার (`|`)</abbr> ব্যবহার করতে পারেন, যা ওদের থেকে অনেক ভালো এবং সহজ।
=== "Python 3.9+"
আপনি সেই একই বিল্টইন টাইপ জেনেরিক্স হিসেবে ব্যবহার করতে পারবেন(ভিতরে টাইপ সহ স্কয়ারে ব্রাকেট দিয়ে):
* `list`
* `tuple`
* `set`
* `dict`
এবং Python 3.8 এর মতোই, `typing` মডিউল থেকে:
* `Union`
* `Optional`
* ...এবং অন্যান্য।
=== "Python 3.8+"
* `List`
* `Tuple`
* `Set`
* `Dict`
* `Union`
* `Optional`
* ...এবং অন্যান্য।
### ক্লাস হিসেবে টাইপস
আপনি একটি ভেরিয়েবলের টাইপ হিসেবে একটি ক্লাস ঘোষণা করতে পারেন।
ধরুন আপনার কাছে `Person` নামে একটি ক্লাস আছে, যার একটি নাম আছে:
```Python hl_lines="1-3"
{!../../../docs_src/python_types/tutorial010.py!}
```
তারপর আপনি একটি ভেরিয়েবলকে `Person` টাইপের হিসেবে ঘোষণা করতে পারেন:
```Python hl_lines="6"
{!../../../docs_src/python_types/tutorial010.py!}
```
এবং তারপর, আবার, আপনি এডিটর সাপোর্ট পেয়ে যাবেন:
<img src="/img/python-types/image06.png">
লক্ষ্য করুন যে এর মানে হল "`one_person` হল ক্লাস `Person`-এর একটি **ইন্সট্যান্স**।"
এর মানে এটি নয় যে "`one_person` হল **ক্লাস** যাকে বলা হয় `Person`।"
## Pydantic মডেল
[Pydantic](https://docs.pydantic.dev/) হল একটি Python লাইব্রেরি যা ডাটা ভ্যালিডেশন সম্পাদন করে।
আপনি ডাটার "আকার" এট্রিবিউট সহ ক্লাস হিসেবে ঘোষণা করেন।
এবং প্রতিটি এট্রিবিউট এর একটি টাইপ থাকে।
তারপর আপনি যদি কিছু মান দিয়ে সেই ক্লাসের একটি ইন্সট্যান্স তৈরি করেন-- এটি মানগুলিকে ভ্যালিডেট করবে, প্রয়োজন অনুযায়ী তাদেরকে উপযুক্ত টাইপে রূপান্তর করবে এবং আপনাকে সমস্ত ডাটা সহ একটি অবজেক্ট প্রদান করবে।
এবং আপনি সেই ফলাফল অবজেক্টের সাথে এডিটর সাপোর্ট পাবেন।
অফিসিয়াল Pydantic ডক্স থেকে একটি উদাহরণ:
=== "Python 3.10+"
```Python
{!> ../../../docs_src/python_types/tutorial011_py310.py!}
```
=== "Python 3.9+"
```Python
{!> ../../../docs_src/python_types/tutorial011_py39.py!}
```
=== "Python 3.8+"
```Python
{!> ../../../docs_src/python_types/tutorial011.py!}
```
!!! Info
[Pydantic সম্পর্কে আরও জানতে, এর ডকুমেন্টেশন দেখুন](https://docs.pydantic.dev/)।
**FastAPI** মূলত Pydantic-এর উপর নির্মিত।
আপনি এই সমস্ত কিছুর অনেক বাস্তবসম্মত উদাহরণ পাবেন [টিউটোরিয়াল - ইউজার গাইডে](https://fastapi.tiangolo.com/tutorial/)।
!!! Tip
যখন আপনি `Optional` বা `Union[Something, None]` ব্যবহার করেন এবং কোনো ডিফল্ট মান না থাকে, Pydantic-এর একটি বিশেষ আচরণ রয়েছে, আপনি Pydantic ডকুমেন্টেশনে [Required Optional fields](https://docs.pydantic.dev/latest/concepts/models/#required-optional-fields) সম্পর্কে আরও পড়তে পারেন।
## মেটাডাটা অ্যানোটেশন সহ টাইপ হিন্টস
Python-এ এমন একটি ফিচার আছে যা `Annotated` ব্যবহার করে এই টাইপ হিন্টগুলিতে **অতিরিক্ত মেটাডাটা** রাখতে দেয়।
=== "Python 3.9+"
Python 3.9-এ, `Annotated` স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত, তাই আপনি এটি `typing` থেকে ইমপোর্ট করতে পারেন।
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial013_py39.py!}
```
=== "Python 3.8+"
Python 3.9-এর নীচের সংস্করণগুলিতে, আপনি `Annotated`-কে `typing_extensions` থেকে ইমপোর্ট করেন।
এটি **FastAPI** এর সাথে ইতিমদ্ধে ইনস্টল হয়ে থাকবে।
```Python hl_lines="1 4"
{!> ../../../docs_src/python_types/tutorial013.py!}
```
Python নিজে এই `Annotated` দিয়ে কিছুই করে না। এবং এডিটর এবং অন্যান্য টুলগুলির জন্য, টাইপটি এখনও `str`।
কিন্তু আপনি এই `Annotated` এর মধ্যকার জায়গাটির মধ্যে **FastAPI**-এ কীভাবে আপনার অ্যাপ্লিকেশন আচরণ করুক তা সম্পর্কে অতিরিক্ত মেটাডাটা প্রদান করার জন্য ব্যবহার করতে পারেন।
মনে রাখার গুরুত্বপূর্ণ বিষয় হল যে **প্রথম *টাইপ প্যারামিটার*** আপনি `Annotated`-এ পাস করেন সেটি হল **আসল টাইপ**। বাকি শুধুমাত্র অন্যান্য টুলগুলির জন্য মেটাডাটা।
এখন আপনার কেবল জানা প্রয়োজন যে `Annotated` বিদ্যমান, এবং এটি স্ট্যান্ডার্ড Python। 😎
পরবর্তীতে আপনি দেখবেন এটি কতটা **শক্তিশালী** হতে পারে।
!!! Tip
এটি **স্ট্যান্ডার্ড Python** হওয়ার মানে হল আপনি আপনার এডিটরে, আপনি যে টুলগুলি কোড বিশ্লেষণ এবং রিফ্যাক্টর করার জন্য ব্যবহার করেন তাতে **সেরা সম্ভাব্য ডেভেলপার এক্সপেরিয়েন্স** পাবেন। ✨
এবং এছাড়াও আপনার কোড অন্যান্য অনেক Python টুল এবং লাইব্রেরিগুলির সাথে খুব সামঞ্জস্যপূর্ণ হবে। 🚀
## **FastAPI**-এ টাইপ হিন্টস
**FastAPI** এই টাইপ হিন্টগুলি ব্যবহার করে বেশ কিছু জিনিস করে।
**FastAPI**-এ আপনি টাইপ হিন্টগুলি সহ প্যারামিটার ঘোষণা করেন এবং আপনি পান:
* **এডিটর সাপোর্ট**।
* **টাইপচেক**।
...এবং **FastAPI** একই ঘোষণাগুলি ব্যবহার করে:
* **রিকুইরেমেন্টস সংজ্ঞায়িত করে**: রিকোয়েস্ট পাথ প্যারামিটার, কুয়েরি প্যারামিটার, হেডার, বডি, ডিপেন্ডেন্সিস, ইত্যাদি থেকে।
* **ডেটা রূপান্তর করে**: রিকোয়েস্ট থেকে প্রয়োজনীয় টাইপে ডেটা।
* **ডেটা যাচাই করে**: প্রতিটি রিকোয়েস্ট থেকে আসা ডেটা:
* যখন ডেটা অবৈধ হয় তখন **স্বয়ংক্রিয় ত্রুটি** গ্রাহকের কাছে ফেরত পাঠানো।
* **API ডকুমেন্টেশন তৈরি করে**: OpenAPI ব্যবহার করে:
* যা স্বয়ংক্রিয় ইন্টার‌্যাক্টিভ ডকুমেন্টেশন ইউজার ইন্টারফেস দ্বারা ব্যবহৃত হয়।
এই সব কিছু আপনার কাছে অস্পষ্ট মনে হতে পারে। চিন্তা করবেন না। আপনি [টিউটোরিয়াল - ইউজার গাইড](https://fastapi.tiangolo.com/tutorial/) এ এই সব কিছু প্র্যাকটিসে দেখতে পাবেন।
গুরুত্বপূর্ণ বিষয় হল, আপনি যদি স্ট্যান্ডার্ড Python টাইপগুলি ব্যবহার করেন, তবে আরও বেশি ক্লাস, ডেকোরেটর ইত্যাদি যোগ না করেই একই স্থানে **FastAPI** আপনার অনেক কাজ করে দিবে।
!!! Info
যদি আপনি টিউটোরিয়ালের সমস্ত বিষয় পড়ে ফেলে থাকেন এবং টাইপ সম্পর্কে আরও জানতে চান, তবে একটি ভালো রিসোর্স হল [mypy এর "cheat sheet"](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html)। এই "cheat sheet" এ আপনি Python টাইপ হিন্ট সম্পর্কে বেসিক থেকে উন্নত লেভেলের ধারণা পেতে পারেন, যা আপনার কোডে টাইপ সেফটি এবং স্পষ্টতা বাড়াতে সাহায্য করবে।

View File

@@ -1 +0,0 @@
INHERIT: ../en/mkdocs.yml

503
docs/de/docs/_llm-test.md Normal file
View File

@@ -0,0 +1,503 @@
# LLM-Testdatei { #llm-test-file }
Dieses Dokument testet, ob das <abbr title="Large Language Model Großes Sprachmodell">LLM</abbr>, das die Dokumentation übersetzt, den <abbr title="General Prompt Allgemeiner Prompt">`general_prompt`</abbr> in `scripts/translate.py` und den sprachspezifischen Prompt in `docs/{language code}/llm-prompt.md` versteht. Der sprachspezifische Prompt wird an `general_prompt` angehängt.
Hier hinzugefügte Tests werden von allen Erstellern sprachspezifischer Prompts gesehen.
So verwenden:
* Einen sprachspezifischen Prompt haben `docs/{language code}/llm-prompt.md`.
* Eine frische Übersetzung dieses Dokuments in die gewünschte Zielsprache durchführen (siehe z. B. das Kommando `translate-page` der `translate.py`). Dadurch wird die Übersetzung unter `docs/{language code}/docs/_llm-test.md` erstellt.
* Prüfen Sie, ob in der Übersetzung alles in Ordnung ist.
* Verbessern Sie bei Bedarf Ihren sprachsspezifischen Prompt, den allgemeinen Prompt oder das englische Dokument.
* Beheben Sie anschließend manuell die verbleibenden Probleme in der Übersetzung, sodass es eine gute Übersetzung ist.
* Übersetzen Sie erneut, nachdem die gute Übersetzung vorliegt. Das ideale Ergebnis wäre, dass das LLM an der Übersetzung keine Änderungen mehr vornimmt. Das bedeutet, dass der allgemeine Prompt und Ihr sprachsspezifischer Prompt so gut sind, wie sie sein können (Es wird manchmal ein paar scheinbar zufällige Änderungen machen, der Grund ist, dass <a href="https://doublespeak.chat/#/handbook#deterministic-output" class="external-link" target="_blank">LLMs keine deterministischen Algorithmen sind</a>).
Die Tests:
## Codeschnipsel { #code-snippets}
//// tab | Test
Dies ist ein Codeschnipsel: `foo`. Und dies ist ein weiteres Codeschnipsel: `bar`. Und noch eins: `baz quux`.
////
//// tab | Info
Der Inhalt von Codeschnipseln sollte unverändert bleiben.
Siehe Abschnitt `### Content of code snippets` im allgemeinen Prompt in `scripts/translate.py`.
////
## Anführungszeichen { #quotes }
//// tab | Test
Gestern schrieb mein Freund: „Wenn man unkorrekt korrekt schreibt, hat man es unkorrekt geschrieben“. Worauf ich antwortete: „Korrekt, aber unkorrekt ist unkorrekterweise nicht „unkorrekt““.
/// note | Hinweis
Das LLM wird dies wahrscheinlich falsch übersetzen. Interessant ist nur, ob es die korrigierte Übersetzung bei einer erneuten Übersetzung beibehält.
///
////
//// tab | Info
Der Promptdesigner kann entscheiden, ob neutrale Anführungszeichen in typografische Anführungszeichen umgewandelt werden sollen. Es ist in Ordnung, sie unverändert zu lassen.
Siehe zum Beispiel den Abschnitt `### Quotes` in `docs/de/llm-prompt.md`.
////
## Anführungszeichen in Codeschnipseln { #quotes-in-code-snippets}
//// tab | Test
`pip install "foo[bar]"`
Beispiele für Stringliterale in Codeschnipseln: `"this"`, `'that'`.
Ein schwieriges Beispiel für Stringliterale in Codeschnipseln: `f"I like {'oranges' if orange else "apples"}"`
Hardcore: `Yesterday, my friend wrote: "If you spell incorrectly correctly, you have spelled it incorrectly". To which I answered: "Correct, but 'incorrectly' is incorrectly not '"incorrectly"'"`
////
//// tab | Info
... Allerdings müssen Anführungszeichen in Codeschnipseln unverändert bleiben.
////
## Codeblöcke { #code-blocks }
//// tab | Test
Ein Bash-Codebeispiel ...
```bash
# Eine Begrüßung an das Universum ausgeben
echo "Hello universe"
```
... und ein Konsolen-Codebeispiel ...
```console
$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid">main.py</u>
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting server
Searching for package file structure
```
... und noch ein Konsolen-Codebeispiel ...
```console
// Ein Verzeichnis „Code“ erstellen
$ mkdir code
// In dieses Verzeichnis wechseln
$ cd code
```
... und ein Python-Codebeispiel ...
```Python
wont_work() # Das wird nicht funktionieren 😱
works(foo="bar") # Das funktioniert 🎉
```
... und das war's.
////
//// tab | Info
Code in Codeblöcken sollte nicht verändert werden, mit Ausnahme von Kommentaren.
Siehe Abschnitt `### Content of code blocks` im allgemeinen Prompt in `scripts/translate.py`.
////
## Tabs und farbige Boxen { #tabs-and-colored-boxes }
//// tab | Test
/// info | Info
Etwas Text
///
/// note | Hinweis
Etwas Text
///
/// note | Technische Details
Etwas Text
///
/// check | Testen
Etwas Text
///
/// tip | Tipp
Etwas Text
///
/// warning | Achtung
Etwas Text
///
/// danger | Gefahr
Etwas Text
///
////
//// tab | Info
Tabs und `Info`/`Note`/`Warning`/usw. Blöcke sollten die Übersetzung ihres Titels nach einem vertikalen Strich (`|`) erhalten.
Siehe die Abschnitte `### Special blocks` und `### Tab blocks` im allgemeinen Prompt in `scripts/translate.py`.
////
## Web- und interne Links { #web-and-internal-links }
//// tab | Test
Der Linktext sollte übersetzt werden, die Linkadresse sollte unverändert bleiben:
* [Link zur Überschrift oben](#code-snippets)
* [Interner Link](index.md#installation){.internal-link target=_blank}
* <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">Externer Link</a>
* <a href="https://fastapi.tiangolo.com/css/styles.css" class="external-link" target="_blank">Link zu einem Stil</a>
* <a href="https://fastapi.tiangolo.com/js/logic.js" class="external-link" target="_blank">Link zu einem Skript</a>
* <a href="https://fastapi.tiangolo.com/img/foo.jpg" class="external-link" target="_blank">Link zu einem Bild</a>
Der Linktext sollte übersetzt werden, die Linkadresse sollte auf die Übersetzung zeigen:
* <a href="https://fastapi.tiangolo.com/de/" class="external-link" target="_blank">FastAPI-Link</a>
////
//// tab | Info
Links sollten übersetzt werden, aber ihre Adresse soll unverändert bleiben. Eine Ausnahme sind absolute Links zu Seiten der FastAPI-Dokumentation. In diesem Fall sollte auf die Übersetzung verlinkt werden.
Siehe Abschnitt `### Links` im allgemeinen Prompt in `scripts/translate.py`.
////
## HTML „abbr“-Elemente { #html-abbr-elements }
//// tab | Test
Hier einige Dinge, die in HTML-„abbr“-Elemente gepackt sind (einige sind erfunden):
### Das abbr gibt eine vollständige Phrase { #the-abbr-gives-a-full-phrase }
* <abbr title="Getting Things Done Dinge erledigt bekommen">GTD</abbr>
* <abbr title="less than kleiner als"><code>lt</code></abbr>
* <abbr title="XML Web Token">XWT</abbr>
* <abbr title="Paralleles Server-Gateway-Interface">PSGI</abbr>
### Das abbr gibt eine Erklärung { #the-abbr-gives-an-explanation }
* <abbr title="Eine Gruppe von Maschinen, die so konfiguriert sind, dass sie verbunden sind und in irgendeiner Weise zusammenarbeiten.">Cluster</abbr>
* <abbr title="Eine Methode des Machine Learning, die künstliche neuronale Netze mit zahlreichen versteckten Schichten zwischen Eingabe- und Ausgabeschicht verwendet und so eine umfassende interne Struktur entwickelt">Deep Learning</abbr>
### Das abbr gibt eine vollständige Phrase und eine Erklärung { #the-abbr-gives-a-full-phrase-and-an-explanation }
* <abbr title="Mozilla Developer Network Mozilla-Entwicklernetzwerk: Dokumentation für Entwickler, geschrieben von den Firefox-Leuten">MDN</abbr>
* <abbr title="Input/Output Eingabe/Ausgabe: Lesen oder Schreiben auf der Festplatte, Netzwerkkommunikation.">I/O</abbr>.
////
//// tab | Info
„title“-Attribute von „abbr“-Elementen werden nach bestimmten Anweisungen übersetzt.
Übersetzungen können eigene „abbr“-Elemente hinzufügen, die das LLM nicht entfernen soll. Z. B. um englische Wörter zu erklären.
Siehe Abschnitt `### HTML abbr elements` im allgemeinen Prompt in `scripts/translate.py`.
////
## Überschriften { #headings }
//// tab | Test
### Eine Webapp entwickeln ein Tutorial { #develop-a-webapp-a-tutorial }
Hallo.
### Typhinweise und -annotationen { #type-hints-and-annotations }
Hallo wieder.
### Super- und Subklassen { #super-and-subclasses }
Hallo wieder.
////
//// tab | Info
Die einzige strenge Regel für Überschriften ist, dass das LLM den Hash-Teil in geschweiften Klammern unverändert lässt, damit Links nicht kaputtgehen.
Siehe Abschnitt `### Headings` im allgemeinen Prompt in `scripts/translate.py`.
Für einige sprachspezifische Anweisungen, siehe z. B. den Abschnitt `### Headings` in `docs/de/llm-prompt.md`.
////
## In der Dokumentation verwendete Begriffe { #terms-used-in-the-docs }
//// tab | Test
* Sie
* Ihr
* z. B.
* usw.
* `foo` vom Typ `int`
* `bar` vom Typ `str`
* `baz` vom Typ `list`
* das Tutorial Benutzerhandbuch
* das Handbuch für fortgeschrittene Benutzer
* die SQLModel-Dokumentation
* die API-Dokumentation
* die automatische Dokumentation
* Data Science
* Deep Learning
* Machine Learning
* Dependency Injection
* HTTP Basic-Authentifizierung
* HTTP Digest
* ISO-Format
* der JSON-Schema-Standard
* das JSON-Schema
* die Schema-Definition
* Password Flow
* Mobile
* deprecatet
* designt
* ungültig
* on the fly
* Standard
* Default
* Groß-/Klein­schrei­bung ist relevant
* Groß-/Klein­schrei­bung ist nicht relevant
* die Anwendung bereitstellen
* die Seite ausliefern
* die App
* die Anwendung
* der Request
* die Response
* die Error-Response
* die Pfadoperation
* der Pfadoperation-Dekorator
* die Pfadoperation-Funktion
* der Body
* der Requestbody
* der Responsebody
* der JSON-Body
* der Formularbody
* der Dateibody
* der Funktionskörper
* der Parameter
* der Body-Parameter
* der Pfad-Parameter
* der Query-Parameter
* der Cookie-Parameter
* der Header-Parameter
* der Formular-Parameter
* der Funktionsparameter
* das Event
* das Startup-Event
* das Hochfahren des Servers
* das Shutdown-Event
* das Lifespan-Event
* der Handler
* der Eventhandler
* der Exceptionhandler
* handhaben
* das Modell
* das Pydantic-Modell
* das Datenmodell
* das Datenbankmodell
* das Formularmodell
* das Modellobjekt
* die Klasse
* die Basisklasse
* die Elternklasse
* die Subklasse
* die Kindklasse
* die Geschwisterklasse
* die Klassenmethode
* der Header
* die Header
* der Autorisierungsheader
* der `Authorization`-Header
* der Forwarded-Header
* das Dependency-Injection-System
* die Dependency
* das Dependable
* der Dependant
* I/O-lastig
* CPU-lastig
* Nebenläufigkeit
* Parallelität
* Multiprocessing
* die Umgebungsvariable
* die Umgebungsvariable
* der `PATH`
* die `PATH`-Umgebungsvariable
* die Authentifizierung
* der Authentifizierungsanbieter
* die Autorisierung
* das Anmeldeformular
* der Autorisierungsanbieter
* der Benutzer authentisiert sich
* das System authentifiziert den Benutzer
* Das CLI
* Das Kommandozeileninterface
* der Server
* der Client
* der Cloudanbieter
* der Clouddienst
* die Entwicklung
* die Entwicklungsphasen
* das Dict
* das Dictionary
* die Enumeration
* das Enum
* das Enum-Member
* der Encoder
* der Decoder
* kodieren
* dekodieren
* die Exception
* werfen
* der Ausdruck
* die Anweisung
* das Frontend
* das Backend
* die GitHub-Diskussion
* das GitHub-Issue
* die Leistung
* die Leistungsoptimierung
* der Rückgabetyp
* der Rückgabewert
* die Sicherheit
* das Sicherheitsschema
* der Task
* der Hintergrundtask
* die Taskfunktion
* das Template
* die Template-Engine
* die Typannotation
* der Typhinweis
* der Serverworker
* der Uvicorn-Worker
* der Gunicorn-Worker
* der Workerprozess
* die Workerklasse
* die Workload
* das Deployment
* deployen
* das SDK
* das Software Development Kit
* der `APIRouter`
* die `requirements.txt`
* das Bearer-Token
* der Breaking Change
* der Bug
* der Button
* das Callable
* der Code
* der Commit
* der Contextmanager
* die Coroutine
* die Datenbanksession
* die Festplatte
* die Domain
* die Engine
* das Fake-X
* die HTTP-GET-Methode
* das Item
* die Bibliothek
* der Lifespan
* der Lock
* die Middleware
* die Mobile-Anwendung
* das Modul
* das Mounten
* das Netzwerk
* das Origin
* Die Überschreibung
* die Payload
* der Prozessor
* die Property
* der Proxy
* der Pull Request
* die Query
* der RAM
* der entfernte Rechner
* der Statuscode
* der String
* der Tag
* das Webframework
* die Wildcard
* zurückgeben
* validieren
////
//// tab | Info
Dies ist eine nicht vollständige und nicht normative Liste von (meist) technischen Begriffen, die in der Dokumentation vorkommen. Sie kann dem Promptdesigner helfen herauszufinden, bei welchen Begriffen das LLM Unterstützung braucht. Zum Beispiel, wenn es eine gute Übersetzung immer wieder auf eine suboptimale Übersetzung zurücksetzt. Oder wenn es Probleme hat, einen Begriff in Ihrer Sprache zu konjugieren/deklinieren.
Siehe z. B. den Abschnitt `### List of English terms and their preferred German translations` in `docs/de/llm-prompt.md`.
////

View File

@@ -1,3 +1,3 @@
# Über
# Über { #about }
Über FastAPI, sein Design, seine Inspiration und mehr. 🤓

View File

@@ -1,21 +1,24 @@
# Zusätzliche Responses in OpenAPI
# Zusätzliche Responses in OpenAPI { #additional-responses-in-openapi }
!!! warning "Achtung"
Dies ist ein eher fortgeschrittenes Thema.
/// warning | Achtung
Wenn Sie mit **FastAPI** beginnen, benötigen Sie dies möglicherweise nicht.
Dies ist ein eher fortgeschrittenes Thema.
Sie können zusätzliche Responses mit zusätzlichen Statuscodes, Medientypen, Beschreibungen, usw. deklarieren.
Wenn Sie mit **FastAPI** beginnen, benötigen Sie dies möglicherweise nicht.
///
Sie können zusätzliche <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Responses</abbr> mit zusätzlichen Statuscodes, Medientypen, Beschreibungen, usw. deklarieren.
Diese zusätzlichen Responses werden in das OpenAPI-Schema aufgenommen, sodass sie auch in der API-Dokumentation erscheinen.
Für diese zusätzlichen Responses müssen Sie jedoch sicherstellen, dass Sie eine `Response`, wie etwa `JSONResponse`, direkt zurückgeben, mit Ihrem Statuscode und Inhalt.
## Zusätzliche Response mit `model`
## Zusätzliche Response mit `model` { #additional-response-with-model }
Sie können Ihren *Pfadoperation-Dekoratoren* einen Parameter `responses` übergeben.
Der nimmt ein `dict` entgegen, die Schlüssel sind Statuscodes für jede Response, wie etwa `200`, und die Werte sind andere `dict`s mit den Informationen für jede Response.
Der nimmt ein <abbr title="Dictionary Zuordnungstabelle: In anderen Sprachen auch Hash, Map, Objekt, Assoziatives Array genannt">`dict`</abbr> entgegen, die Schlüssel sind Statuscodes für jede Response, wie etwa `200`, und die Werte sind andere `dict`s mit den Informationen für jede Response.
Jedes dieser Response-`dict`s kann einen Schlüssel `model` haben, welcher ein Pydantic-Modell enthält, genau wie `response_model`.
@@ -23,24 +26,28 @@ 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"
Beachten Sie, dass Sie die `JSONResponse` direkt zurückgeben müssen.
/// note | Hinweis
!!! info
Der `model`-Schlüssel ist nicht Teil von OpenAPI.
Beachten Sie, dass Sie die `JSONResponse` direkt zurückgeben müssen.
**FastAPI** nimmt das Pydantic-Modell von dort, generiert das JSON-Schema und fügt es an der richtigen Stelle ein.
///
Die richtige Stelle ist:
/// info | Info
* Im Schlüssel `content`, der als Wert ein weiteres JSON-Objekt (`dict`) hat, welches Folgendes enthält:
* Ein Schlüssel mit dem Medientyp, z. B. `application/json`, der als Wert ein weiteres JSON-Objekt hat, welches Folgendes enthält:
* Ein Schlüssel `schema`, der als Wert das JSON-Schema aus dem Modell hat, hier ist die richtige Stelle.
* **FastAPI** fügt hier eine Referenz auf die globalen JSON-Schemas an einer anderen Stelle in Ihrer OpenAPI hinzu, anstatt es direkt einzubinden. Auf diese Weise können andere Anwendungen und Clients diese JSON-Schemas direkt verwenden, bessere Tools zur Codegenerierung bereitstellen, usw.
Der `model`-Schlüssel ist nicht Teil von OpenAPI.
**FastAPI** nimmt das Pydantic-Modell von dort, generiert das JSON-Schema und fügt es an der richtigen Stelle ein.
Die richtige Stelle ist:
* Im Schlüssel `content`, der als Wert ein weiteres JSON-Objekt (`dict`) hat, welches Folgendes enthält:
* Ein Schlüssel mit dem Medientyp, z. B. `application/json`, der als Wert ein weiteres JSON-Objekt hat, welches Folgendes enthält:
* Ein Schlüssel `schema`, der als Wert das JSON-Schema aus dem Modell hat, hier ist die richtige Stelle.
* **FastAPI** fügt hier eine Referenz auf die globalen JSON-Schemas an einer anderen Stelle in Ihrer OpenAPI hinzu, anstatt es direkt einzubinden. Auf diese Weise können andere Anwendungen und Clients diese JSON-Schemas direkt verwenden, bessere Tools zur Codegenerierung bereitstellen, usw.
///
Die generierten Responses in der OpenAPI für diese *Pfadoperation* lauten:
@@ -162,25 +169,29 @@ Die Schemas werden von einer anderen Stelle innerhalb des OpenAPI-Schemas refere
}
```
## Zusätzliche Medientypen für die Haupt-Response
## Zusätzliche Medientypen für die Haupt-Response { #additional-media-types-for-the-main-response }
Sie können denselben `responses`-Parameter verwenden, um verschiedene Medientypen für dieselbe Haupt-Response hinzuzufügen.
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"
Beachten Sie, dass Sie das Bild direkt mit einer `FileResponse` zurückgeben müssen.
/// note | Hinweis
!!! info
Sofern Sie in Ihrem Parameter `responses` nicht explizit einen anderen Medientyp angeben, geht FastAPI davon aus, dass die Response denselben Medientyp wie die Haupt-Response-Klasse hat (Standardmäßig `application/json`).
Beachten Sie, dass Sie das Bild direkt mit einer `FileResponse` zurückgeben müssen.
Wenn Sie jedoch eine benutzerdefinierte Response-Klasse mit `None` als Medientyp angegeben haben, verwendet FastAPI `application/json` für jede zusätzliche Response, die über ein zugehöriges Modell verfügt.
///
## Informationen kombinieren
/// info | Info
Sofern Sie in Ihrem Parameter `responses` nicht explizit einen anderen Medientyp angeben, geht FastAPI davon aus, dass die Response denselben Medientyp wie die Haupt-Response-Klasse hat (Standardmäßig `application/json`).
Wenn Sie jedoch eine benutzerdefinierte Response-Klasse mit `None` als Medientyp angegeben haben, verwendet FastAPI `application/json` für jede zusätzliche Response, die über ein zugehöriges Modell verfügt.
///
## Informationen kombinieren { #combining-information }
Sie können auch Response-Informationen von mehreren Stellen kombinieren, einschließlich der Parameter `response_model`, `status_code` und `responses`.
@@ -192,15 +203,13 @@ 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:
<img src="/img/tutorial/additional-responses/image01.png">
## Vordefinierte und benutzerdefinierte Responses kombinieren
## Vordefinierte und benutzerdefinierte Responses kombinieren { #combine-predefined-responses-and-custom-ones }
Möglicherweise möchten Sie einige vordefinierte Responses haben, die für viele *Pfadoperationen* gelten, Sie möchten diese jedoch mit benutzerdefinierten Responses kombinieren, die für jede *Pfadoperation* erforderlich sind.
@@ -228,13 +237,11 @@ 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
## Weitere Informationen zu OpenAPI-Responses { #more-information-about-openapi-responses }
Um zu sehen, was genau Sie in die Responses aufnehmen können, können Sie die folgenden Abschnitte in der OpenAPI-Spezifikation überprüfen:
* <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responsesObject" class="external-link" target="_blank">OpenAPI Responses Object</a>, enthält das `Response Object`.
* <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responseObject" class="external-link" target="_blank">OpenAPI Response Object</a>, Sie können alles davon direkt in jede Response innerhalb Ihres `responses`-Parameter einfügen. Einschließlich `description`, `headers`, `content` (darin deklarieren Sie verschiedene Medientypen und JSON-Schemas) und `links`.
* <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responses-object" class="external-link" target="_blank">OpenAPI Responses Object</a>, enthält das `Response Object`.
* <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#response-object" class="external-link" target="_blank">OpenAPI Response Object</a>, Sie können alles davon direkt in jede Response innerhalb Ihres `responses`-Parameter einfügen. Einschließlich `description`, `headers`, `content` (darin deklarieren Sie verschiedene Medientypen und JSON-Schemas) und `links`.

View File

@@ -1,68 +1,40 @@
# Zusätzliche Statuscodes
# Zusätzliche Statuscodes { #additional-status-codes }
Standardmäßig liefert **FastAPI** die Rückgabewerte (Responses) als `JSONResponse` zurück und fügt den Inhalt der jeweiligen *Pfadoperation* in das `JSONResponse` Objekt ein.
Standardmäßig liefert **FastAPI** die <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Responses</abbr> als `JSONResponse` zurück und fügt den Inhalt, den Sie aus Ihrer *Pfadoperation* zurückgeben, in diese `JSONResponse` ein.
Es wird der Default-Statuscode oder derjenige verwendet, den Sie in Ihrer *Pfadoperation* festgelegt haben.
## Zusätzliche Statuscodes
## Zusätzliche Statuscodes { #additional-status-codes_1 }
Wenn Sie neben dem Hauptstatuscode weitere Statuscodes zurückgeben möchten, können Sie dies tun, indem Sie direkt eine `Response` zurückgeben, wie etwa eine `JSONResponse`, und den zusätzlichen Statuscode direkt festlegen.
Angenommen, Sie möchten eine *Pfadoperation* haben, die das Aktualisieren von Artikeln ermöglicht und bei Erfolg den HTTP-Statuscode 200 „OK“ zurückgibt.
Sie möchten aber auch, dass sie neue Artikel akzeptiert. Und wenn die Elemente vorher nicht vorhanden waren, werden diese Elemente erstellt und der HTTP-Statuscode 201 „Created“ zurückgegeben.
Sie möchten aber auch, dass sie neue Artikel akzeptiert. Und wenn die Artikel vorher nicht vorhanden waren, werden diese Artikel erstellt und der HTTP-Statuscode 201 „Created“ zurückgegeben.
Um dies zu erreichen, importieren Sie `JSONResponse`, und geben Sie Ihren Inhalt direkt zurück, indem Sie den gewünschten `status_code` setzen:
=== "Python 3.10+"
{* ../../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!}
```
/// warning | Achtung
=== "Python 3.9+"
Wenn Sie eine `Response` direkt zurückgeben, wie im obigen Beispiel, wird sie direkt zurückgegeben.
```Python hl_lines="4 25"
{!> ../../../docs_src/additional_status_codes/tutorial001_an_py39.py!}
```
Sie wird nicht mit einem Modell usw. serialisiert.
=== "Python 3.8+"
Stellen Sie sicher, dass sie die gewünschten Daten enthält und dass die Werte gültiges JSON sind (wenn Sie `JSONResponse` verwenden).
```Python hl_lines="4 26"
{!> ../../../docs_src/additional_status_codes/tutorial001_an.py!}
```
///
=== "Python 3.10+ nicht annotiert"
/// note | Technische Details
!!! tip "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
Sie können auch `from starlette.responses import JSONResponse` verwenden.
```Python hl_lines="2 23"
{!> ../../../docs_src/additional_status_codes/tutorial001_py310.py!}
```
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette. Dasselbe gilt für `status`.
=== "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"
Wenn Sie eine `Response` direkt zurückgeben, wie im obigen Beispiel, wird sie direkt zurückgegeben.
Sie wird nicht mit einem Modell usw. serialisiert.
Stellen Sie sicher, dass sie die gewünschten Daten enthält und dass die Werte gültiges JSON sind (wenn Sie `JSONResponse` verwenden).
!!! note "Technische Details"
Sie können auch `from starlette.responses import JSONResponse` verwenden.
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette. Das Gleiche gilt für `status`.
## OpenAPI- und API-Dokumentation
## OpenAPI- und API-Dokumentation { #openapi-and-api-docs }
Wenn Sie zusätzliche Statuscodes und Responses direkt zurückgeben, werden diese nicht in das OpenAPI-Schema (die API-Dokumentation) aufgenommen, da FastAPI keine Möglichkeit hat, im Voraus zu wissen, was Sie zurückgeben werden.

View File

@@ -1,6 +1,6 @@
# Fortgeschrittene Abhängigkeiten
# Fortgeschrittene Abhängigkeiten { #advanced-dependencies }
## Parametrisierte Abhängigkeiten
## Parametrisierte Abhängigkeiten { #parameterized-dependencies }
Alle Abhängigkeiten, die wir bisher gesehen haben, waren festgelegte Funktionen oder Klassen.
@@ -10,92 +10,35 @@ Stellen wir uns vor, wir möchten eine Abhängigkeit haben, die prüft, ob ein Q
Aber wir wollen diesen vordefinierten Inhalt per Parameter festlegen können.
## Eine „aufrufbare“ Instanz
## Eine „aufrufbare“ Instanz { #a-callable-instance }
In Python gibt es eine Möglichkeit, eine Instanz einer Klasse „aufrufbar“ („callable“) zu machen.
In Python gibt es eine Möglichkeit, eine Instanz einer Klasse <abbr title="Englisch „callable“">„aufrufbar“</abbr> zu machen.
Nicht die Klasse selbst (die bereits aufrufbar ist), sondern eine Instanz dieser Klasse.
Dazu deklarieren wir eine Methode `__call__`:
=== "Python 3.9+"
```Python hl_lines="12"
{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="11"
{!> ../../../docs_src/dependencies/tutorial011_an.py!}
```
=== "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.
## Die Instanz parametrisieren
## Die Instanz parametrisieren { #parameterize-the-instance }
Und jetzt können wir `__init__` verwenden, um die Parameter der Instanz zu deklarieren, die wir zum `Parametrisieren` der Abhängigkeit verwenden können:
Und jetzt können wir `__init__` verwenden, um die Parameter der Instanz zu deklarieren, die wir zum Parametrisieren der Abhängigkeit verwenden können:
=== "Python 3.9+"
```Python hl_lines="9"
{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="8"
{!> ../../../docs_src/dependencies/tutorial011_an.py!}
```
=== "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.
## Eine Instanz erstellen
## Eine Instanz erstellen { #create-an-instance }
Wir könnten eine Instanz dieser Klasse erstellen mit:
=== "Python 3.9+"
```Python hl_lines="18"
{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="17"
{!> ../../../docs_src/dependencies/tutorial011_an.py!}
```
=== "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`.
## Die Instanz als Abhängigkeit verwenden
## Die Instanz als Abhängigkeit verwenden { #use-the-instance-as-a-dependency }
Dann könnten wir diesen `checker` in einem `Depends(checker)` anstelle von `Depends(FixedContentQueryChecker)` verwenden, da die Abhängigkeit die Instanz `checker` und nicht die Klasse selbst ist.
@@ -107,32 +50,114 @@ checker(q="somequery")
... und übergibt, was immer das als Wert dieser Abhängigkeit in unserer *Pfadoperation-Funktion* zurückgibt, als den Parameter `fixed_content_included`:
=== "Python 3.9+"
{* ../../docs_src/dependencies/tutorial011_an_py39.py hl[22] *}
```Python hl_lines="22"
{!> ../../../docs_src/dependencies/tutorial011_an_py39.py!}
```
/// tip | Tipp
=== "Python 3.8+"
Das alles mag gekünstelt wirken. Und es ist möglicherweise noch nicht ganz klar, welchen Nutzen das hat.
```Python hl_lines="21"
{!> ../../../docs_src/dependencies/tutorial011_an.py!}
```
Diese Beispiele sind bewusst einfach gehalten, zeigen aber, wie alles funktioniert.
=== "Python 3.8+ nicht annotiert"
In den Kapiteln zum Thema Sicherheit gibt es Hilfsfunktionen, die auf die gleiche Weise implementiert werden.
!!! tip "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
Wenn Sie das hier alles verstanden haben, wissen Sie bereits, wie diese Sicherheits-Hilfswerkzeuge unter der Haube funktionieren.
```Python hl_lines="20"
{!> ../../../docs_src/dependencies/tutorial011.py!}
```
///
!!! tip "Tipp"
Das alles mag gekünstelt wirken. Und es ist möglicherweise noch nicht ganz klar, welchen Nutzen das hat.
## Abhängigkeiten mit `yield`, `HTTPException`, `except` und Hintergrundtasks { #dependencies-with-yield-httpexception-except-and-background-tasks }
Diese Beispiele sind bewusst einfach gehalten, zeigen aber, wie alles funktioniert.
/// warning | Achtung
In den Kapiteln zum Thema Sicherheit gibt es Hilfsfunktionen, die auf die gleiche Weise implementiert werden.
Sie benötigen diese technischen Details höchstwahrscheinlich nicht.
Wenn Sie das hier alles verstanden haben, wissen Sie bereits, wie diese Sicherheits-Hilfswerkzeuge unter der Haube funktionieren.
Diese Details sind hauptsächlich nützlich, wenn Sie eine FastAPI-Anwendung haben, die älter als 0.121.0 ist, und Sie auf Probleme mit Abhängigkeiten mit `yield` stoßen.
///
Abhängigkeiten mit `yield` haben sich im Laufe der Zeit weiterentwickelt, um verschiedene Anwendungsfälle abzudecken und einige Probleme zu beheben, hier ist eine Zusammenfassung der Änderungen.
### Abhängigkeiten mit `yield` und `scope` { #dependencies-with-yield-and-scope }
In Version 0.121.0 hat FastAPI Unterstützung für `Depends(scope="function")` für Abhängigkeiten mit `yield` hinzugefügt.
Mit `Depends(scope="function")` wird der Exit-Code nach `yield` direkt nach dem Ende der *Pfadoperation-Funktion* ausgeführt, bevor die Response an den Client gesendet wird.
Und bei Verwendung von `Depends(scope="request")` (dem Default) wird der Exit-Code nach `yield` ausgeführt, nachdem die Response gesendet wurde.
Mehr dazu finden Sie in der Dokumentation zu [Abhängigkeiten mit `yield` Frühes Beenden und `scope`](../tutorial/dependencies/dependencies-with-yield.md#early-exit-and-scope).
### Abhängigkeiten mit `yield` und `StreamingResponse`, Technische Details { #dependencies-with-yield-and-streamingresponse-technical-details }
Vor FastAPI 0.118.0 wurde bei Verwendung einer Abhängigkeit mit `yield` der Exit-Code nach der *Pfadoperation-Funktion* ausgeführt, aber unmittelbar bevor die Response gesendet wurde.
Die Absicht war, Ressourcen nicht länger als nötig zu halten, während darauf gewartet wird, dass die Response durchs Netzwerk reist.
Diese Änderung bedeutete auch, dass bei Rückgabe einer `StreamingResponse` der Exit-Code der Abhängigkeit mit `yield` bereits ausgeführt worden wäre.
Wenn Sie beispielsweise eine Datenbanksession in einer Abhängigkeit mit `yield` hatten, konnte die `StreamingResponse` diese Session während des Streamens von Daten nicht verwenden, weil die Session im Exit-Code nach `yield` bereits geschlossen worden wäre.
Dieses Verhalten wurde in 0.118.0 zurückgenommen, sodass der Exit-Code nach `yield` ausgeführt wird, nachdem die Response gesendet wurde.
/// info | Info
Wie Sie unten sehen werden, ähnelt dies sehr dem Verhalten vor Version 0.106.0, jedoch mit mehreren Verbesserungen und Bugfixes für Sonderfälle.
///
#### Anwendungsfälle mit frühem Exit-Code { #use-cases-with-early-exit-code }
Es gibt einige Anwendungsfälle mit spezifischen Bedingungen, die vom alten Verhalten profitieren könnten, den Exit-Code von Abhängigkeiten mit `yield` vor dem Senden der Response auszuführen.
Stellen Sie sich zum Beispiel vor, Sie haben Code, der in einer Abhängigkeit mit `yield` eine Datenbanksession verwendet, nur um einen Benutzer zu verifizieren, die Datenbanksession wird aber in der *Pfadoperation-Funktion* nie wieder verwendet, sondern nur in der Abhängigkeit, und die Response benötigt lange, um gesendet zu werden, wie eine `StreamingResponse`, die Daten langsam sendet, aus irgendeinem Grund aber die Datenbank nicht verwendet.
In diesem Fall würde die Datenbanksession gehalten, bis das Senden der Response abgeschlossen ist, aber wenn Sie sie nicht verwenden, wäre es nicht notwendig, sie zu halten.
So könnte es aussehen:
{* ../../docs_src/dependencies/tutorial013_an_py310.py *}
Der Exit-Code, das automatische Schließen der `Session` in:
{* ../../docs_src/dependencies/tutorial013_an_py310.py ln[19:21] *}
... würde ausgeführt, nachdem die Response das langsame Senden der Daten beendet:
{* ../../docs_src/dependencies/tutorial013_an_py310.py ln[30:38] hl[31:33] *}
Da `generate_stream()` die Datenbanksession jedoch nicht verwendet, ist es nicht wirklich notwendig, die Session während des Sendens der Response offen zu halten.
Wenn Sie diesen spezifischen Anwendungsfall mit SQLModel (oder SQLAlchemy) haben, könnten Sie die Session explizit schließen, nachdem Sie sie nicht mehr benötigen:
{* ../../docs_src/dependencies/tutorial014_an_py310.py ln[24:28] hl[28] *}
Auf diese Weise würde die Session die Datenbankverbindung freigeben, sodass andere Requests sie verwenden könnten.
Wenn Sie einen anderen Anwendungsfall haben, der ein frühes Beenden aus einer Abhängigkeit mit `yield` benötigt, erstellen Sie bitte eine <a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">GitHub-Diskussion-Frage</a> mit Ihrem spezifischen Anwendungsfall und warum Sie von einem frühen Schließen für Abhängigkeiten mit `yield` profitieren würden.
Wenn es überzeugende Anwendungsfälle für ein frühes Schließen bei Abhängigkeiten mit `yield` gibt, würde ich erwägen, eine neue Möglichkeit hinzuzufügen, um ein frühes Schließen optional zu aktivieren.
### Abhängigkeiten mit `yield` und `except`, Technische Details { #dependencies-with-yield-and-except-technical-details }
Vor FastAPI 0.110.0 war es so, dass wenn Sie eine Abhängigkeit mit `yield` verwendet und dann in dieser Abhängigkeit mit `except` eine Exception abgefangen haben und die Exception nicht erneut geworfen haben, die Exception automatisch an beliebige Exceptionhandler oder den Handler für interne Serverfehler weitergereicht/weitergeworfen wurde.
Dies wurde in Version 0.110.0 geändert, um unbehandelten Speicherverbrauch durch weitergeleitete Exceptions ohne Handler (interne Serverfehler) zu beheben und um es mit dem Verhalten von normalem Python-Code konsistent zu machen.
### Hintergrundtasks und Abhängigkeiten mit `yield`, Technische Details { #background-tasks-and-dependencies-with-yield-technical-details }
Vor FastAPI 0.106.0 war das Werfen von Exceptions nach `yield` nicht möglich, der Exit-Code in Abhängigkeiten mit `yield` wurde ausgeführt, nachdem die Response gesendet wurde, sodass [Exceptionhandler](../tutorial/handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank} bereits ausgeführt worden wären.
Dies war so designt, hauptsächlich um die Verwendung derselben von Abhängigkeiten „geyieldeten“ Objekte in Hintergrundtasks zu ermöglichen, da der Exit-Code erst ausgeführt wurde, nachdem die Hintergrundtasks abgeschlossen waren.
Dies wurde in FastAPI 0.106.0 geändert mit der Absicht, keine Ressourcen zu halten, während darauf gewartet wird, dass die Response durchs Netzwerk reist.
/// tip | Tipp
Zusätzlich ist ein Hintergrundtask normalerweise ein unabhängiger Logikblock, der separat gehandhabt werden sollte, mit eigenen Ressourcen (z. B. eigener Datenbankverbindung).
So haben Sie wahrscheinlich saubereren Code.
///
Wenn Sie sich bisher auf dieses Verhalten verlassen haben, sollten Sie jetzt die Ressourcen für Hintergrundtasks innerhalb des Hintergrundtasks selbst erstellen und intern nur Daten verwenden, die nicht von den Ressourcen von Abhängigkeiten mit `yield` abhängen.
Anstatt beispielsweise dieselbe Datenbanksession zu verwenden, würden Sie innerhalb des Hintergrundtasks eine neue Datenbanksession erstellen und die Objekte aus der Datenbank mithilfe dieser neuen Session beziehen. Und anstatt das Objekt aus der Datenbank als Parameter an die Hintergrundtask-Funktion zu übergeben, würden Sie die ID dieses Objekts übergeben und das Objekt dann innerhalb der Hintergrundtask-Funktion erneut beziehen.

View File

@@ -1,24 +1,24 @@
# Asynchrone Tests
# Asynchrone Tests { #async-tests }
Sie haben bereits gesehen, wie Sie Ihre **FastAPI**-Anwendungen mit dem bereitgestellten `TestClient` testen. Bisher haben Sie nur gesehen, wie man synchrone Tests schreibt, ohne `async`hrone Funktionen zu verwenden.
Sie haben bereits gesehen, wie Sie Ihre **FastAPI**-Anwendungen mit dem bereitgestellten `TestClient` testen. Bisher haben Sie nur gesehen, wie man synchrone Tests schreibt, ohne `async`-Funktionen zu verwenden.
Die Möglichkeit, in Ihren Tests asynchrone Funktionen zu verwenden, könnte beispielsweise nützlich sein, wenn Sie Ihre Datenbank asynchron abfragen. Stellen Sie sich vor, Sie möchten das Senden von Requests an Ihre FastAPI-Anwendung testen und dann überprüfen, ob Ihr Backend die richtigen Daten erfolgreich in die Datenbank geschrieben hat, während Sie eine asynchrone Datenbankbibliothek verwenden.
Die Möglichkeit, in Ihren Tests asynchrone Funktionen zu verwenden, könnte beispielsweise nützlich sein, wenn Sie Ihre Datenbank asynchron abfragen. Stellen Sie sich vor, Sie möchten das Senden von <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Requests</abbr> an Ihre FastAPI-Anwendung testen und dann überprüfen, ob Ihr Backend die richtigen Daten erfolgreich in die Datenbank geschrieben hat, während Sie eine asynchrone Datenbankbibliothek verwenden.
Schauen wir uns an, wie wir das machen können.
## pytest.mark.anyio
## pytest.mark.anyio { #pytest-mark-anyio }
Wenn wir in unseren Tests asynchrone Funktionen aufrufen möchten, müssen unsere Testfunktionen asynchron sein. AnyIO stellt hierfür ein nettes Plugin zur Verfügung, mit dem wir festlegen können, dass einige Testfunktionen asynchron aufgerufen werden sollen.
## HTTPX
## HTTPX { #httpx }
Auch wenn Ihre **FastAPI**-Anwendung normale `def`-Funktionen anstelle von `async def` verwendet, handelt es sich darunter immer noch um eine `async`hrone Anwendung.
Auch wenn Ihre **FastAPI**-Anwendung normale `def`-Funktionen anstelle von `async def` verwendet, handelt es sich darunter immer noch um eine `async`-Anwendung.
Der `TestClient` macht unter der Haube magisches, um die asynchrone FastAPI-Anwendung in Ihren normalen `def`-Testfunktionen, mithilfe von Standard-Pytest aufzurufen. Aber diese Magie funktioniert nicht mehr, wenn wir sie in asynchronen Funktionen verwenden. Durch die asynchrone Ausführung unserer Tests können wir den `TestClient` nicht mehr in unseren Testfunktionen verwenden.
Der `TestClient` betreibt unter der Haube etwas Magie, um die asynchrone FastAPI-Anwendung in Ihren normalen `def`-Testfunktionen, mithilfe von Standard-Pytest aufzurufen. Aber diese Magie funktioniert nicht mehr, wenn wir sie in asynchronen Funktionen verwenden. Durch die asynchrone Ausführung unserer Tests können wir den `TestClient` nicht mehr in unseren Testfunktionen verwenden.
Der `TestClient` basiert auf <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a> und glücklicherweise können wir ihn direkt verwenden, um die API zu testen.
Der `TestClient` basiert auf <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a> und glücklicherweise können wir es direkt verwenden, um die API zu testen.
## Beispiel
## Beispiel { #example }
Betrachten wir als einfaches Beispiel eine Dateistruktur ähnlich der in [Größere Anwendungen](../tutorial/bigger-applications.md){.internal-link target=_blank} und [Testen](../tutorial/testing.md){.internal-link target=_blank}:
@@ -32,17 +32,13 @@ 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
## Es ausführen { #run-it }
Sie können Ihre Tests wie gewohnt ausführen mit:
@@ -56,22 +52,21 @@ $ pytest
</div>
## Details
## Im Detail { #in-detail }
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"
Beachten Sie, dass die Testfunktion jetzt `async def` ist und nicht nur `def` wie zuvor, wenn Sie den `TestClient` verwenden.
/// tip | Tipp
Beachten Sie, dass die Testfunktion jetzt `async def` ist und nicht nur `def` wie zuvor, wenn Sie den `TestClient` verwenden.
///
Dann können wir einen `AsyncClient` mit der App erstellen und mit `await` asynchrone Requests an ihn senden.
```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:
@@ -81,15 +76,24 @@ response = client.get('/')
... welches wir verwendet haben, um unsere Requests mit dem `TestClient` zu machen.
!!! tip "Tipp"
Beachten Sie, dass wir async/await mit dem neuen `AsyncClient` verwenden der Request ist asynchron.
/// tip | Tipp
!!! 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>.
Beachten Sie, dass wir async/await mit dem neuen `AsyncClient` verwenden der Request ist asynchron.
## Andere asynchrone Funktionsaufrufe
///
Da die Testfunktion jetzt asynchron ist, können Sie in Ihren Tests neben dem Senden von Requests an Ihre FastAPI-Anwendung jetzt auch andere `async`hrone Funktionen aufrufen (und `await`en), genau so, wie Sie diese an anderer Stelle in Ihrem Code aufrufen würden.
/// warning | Achtung
!!! 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.
Falls Ihre Anwendung auf Lifespan-Events angewiesen ist, der `AsyncClient` löst diese Events nicht aus. Um sicherzustellen, dass sie ausgelöst werden, verwenden Sie `LifespanManager` von <a href="https://github.com/florimondmanca/asgi-lifespan#usage" class="external-link" target="_blank">florimondmanca/asgi-lifespan</a>.
///
## Andere asynchrone Funktionsaufrufe { #other-asynchronous-function-calls }
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`-Funktionen aufrufen (und `await`en), genau so, wie Sie diese an anderer Stelle in Ihrem Code aufrufen würden.
/// tip | Tipp
Wenn Sie einen `RuntimeError: Task attached to a different loop` erhalten, wenn Sie asynchrone Funktionsaufrufe in Ihre Tests integrieren (z. B. bei Verwendung von <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

@@ -1,34 +1,129 @@
# Hinter einem Proxy
# Hinter einem Proxy { #behind-a-proxy }
In manchen Situationen müssen Sie möglicherweise einen **Proxy**-Server wie Traefik oder Nginx verwenden, mit einer Konfiguration, die ein zusätzliches Pfadpräfix hinzufügt, das von Ihrer Anwendung nicht gesehen wird.
In vielen Situationen würden Sie einen **Proxy** wie Traefik oder Nginx vor Ihrer FastAPI-App verwenden.
In diesen Fällen können Sie `root_path` verwenden, um Ihre Anwendung zu konfigurieren.
Diese Proxys könnten HTTPS-Zertifikate und andere Dinge handhaben.
Der `root_path` („Wurzelpfad“) ist ein Mechanismus, der von der ASGI-Spezifikation bereitgestellt wird (auf der FastAPI via Starlette aufbaut).
## Proxy-<abbr title="weitergeleitete Header">Forwarded-Header</abbr> { #proxy-forwarded-headers }
Ein **Proxy** vor Ihrer Anwendung würde normalerweise einige Header on-the-fly setzen, bevor er die Requests an den **Server** sendet, um den Server wissen zu lassen, dass der Request vom Proxy **weitergeleitet** wurde, einschließlich der ursprünglichen (öffentlichen) URL, inklusive der Domain, dass HTTPS verwendet wird, usw.
Das **Server**-Programm (z. B. **Uvicorn** via **FastAPI CLI**) ist in der Lage, diese Header zu interpretieren und diese Information dann an Ihre Anwendung weiterzugeben.
Aber aus Sicherheitsgründen, da der Server nicht weiß, dass er hinter einem vertrauenswürdigen Proxy läuft, wird er diese Header nicht interpretieren.
/// note | Technische Details
Die Proxy-Header sind:
* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For" class="external-link" target="_blank">X-Forwarded-For</a>
* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto" class="external-link" target="_blank">X-Forwarded-Proto</a>
* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host" class="external-link" target="_blank">X-Forwarded-Host</a>
///
### Proxy-Forwarded-Header aktivieren { #enable-proxy-forwarded-headers }
Sie können FastAPI CLI mit der *CLI-Option* `--forwarded-allow-ips` starten und die IP-Adressen übergeben, denen vertraut werden soll, um diese Forwarded-Header zu lesen.
Wenn Sie es auf `--forwarded-allow-ips="*"` setzen, würde es allen eingehenden IPs vertrauen.
Wenn Ihr **Server** hinter einem vertrauenswürdigen **Proxy** sitzt und nur der Proxy mit ihm spricht, würde dies dazu führen, dass er die IP dieses **Proxys** akzeptiert, was auch immer sie ist.
<div class="termy">
```console
$ fastapi run --forwarded-allow-ips="*"
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
### Weiterleitungen mit HTTPS { #redirects-with-https }
Angenommen, Sie definieren eine *Pfadoperation* `/items/`:
{* ../../docs_src/behind_a_proxy/tutorial001_01.py hl[6] *}
Wenn der Client versucht, zu `/items` zu gehen, würde er standardmäßig zu `/items/` umgeleitet.
Aber bevor Sie die *CLI-Option* `--forwarded-allow-ips` setzen, könnte er zu `http://localhost:8000/items/` umleiten.
Aber möglicherweise wird Ihre Anwendung unter `https://mysuperapp.com` gehostet, und die Weiterleitung sollte zu `https://mysuperapp.com/items/` erfolgen.
Durch Setzen von `--proxy-headers` kann FastAPI jetzt an den richtigen Ort umleiten. 😎
```
https://mysuperapp.com/items/
```
/// tip | Tipp
Wenn Sie mehr über HTTPS erfahren möchten, lesen Sie den Leitfaden [Über HTTPS](../deployment/https.md){.internal-link target=_blank}.
///
### Wie Proxy-Forwarded-Header funktionieren { #how-proxy-forwarded-headers-work }
Hier ist eine visuelle Darstellung, wie der **Proxy** weitergeleitete Header zwischen dem Client und dem **Anwendungsserver** hinzufügt:
```mermaid
sequenceDiagram
participant Client
participant Proxy as Proxy/Loadbalancer
participant Server as FastAPI Server
Client->>Proxy: HTTPS-Request<br/>Host: mysuperapp.com<br/>Pfad: /items
Note over Proxy: Proxy fügt Forwarded-Header hinzu
Proxy->>Server: HTTP-Request<br/>X-Forwarded-For: [client IP]<br/>X-Forwarded-Proto: https<br/>X-Forwarded-Host: mysuperapp.com<br/>Pfad: /items
Note over Server: Server interpretiert die Header<br/>(wenn --forwarded-allow-ips gesetzt ist)
Server->>Proxy: HTTP-Response<br/>mit correkten HTTPS-URLs
Proxy->>Client: HTTPS-Response
```
Der **Proxy** fängt den ursprünglichen Client-Request ab und fügt die speziellen *Forwarded*-Header (`X-Forwarded-*`) hinzu, bevor er den Request an den **Anwendungsserver** weitergibt.
Diese Header bewahren Informationen über den ursprünglichen Request, die sonst verloren gingen:
* **X-Forwarded-For**: Die ursprüngliche IP-Adresse des Clients
* **X-Forwarded-Proto**: Das ursprüngliche Protokoll (`https`)
* **X-Forwarded-Host**: Der ursprüngliche Host (`mysuperapp.com`)
Wenn **FastAPI CLI** mit `--forwarded-allow-ips` konfiguriert ist, vertraut es diesen Headern und verwendet sie, z. B. um die korrekten URLs in Weiterleitungen zu erzeugen.
## Proxy mit einem abgetrennten Pfadpräfix { #proxy-with-a-stripped-path-prefix }
Sie könnten einen Proxy haben, der Ihrer Anwendung ein Pfadpräfix hinzufügt.
In diesen Fällen können Sie <abbr title="Wurzelpfad">`root_path`</abbr> verwenden, um Ihre Anwendung zu konfigurieren.
Der `root_path` ist ein Mechanismus, der von der ASGI-Spezifikation bereitgestellt wird (auf der FastAPI via Starlette aufbaut).
Der `root_path` wird verwendet, um diese speziellen Fälle zu handhaben.
Und er wird auch intern beim Mounten von Unteranwendungen verwendet.
## Proxy mit einem abgetrennten Pfadpräfix
Ein Proxy mit einem abgetrennten Pfadpräfix bedeutet in diesem Fall, dass Sie einen Pfad unter `/app` in Ihrem Code deklarieren könnten, dann aber, eine Ebene darüber, den Proxy hinzufügen, der Ihre **FastAPI**-Anwendung unter einem Pfad wie `/api/v1` platziert.
In diesem Fall würde der ursprüngliche Pfad `/app` tatsächlich unter `/api/v1/app` bereitgestellt.
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.
Und der Proxy würde das **Pfadpräfix** on-the-fly **entfernen**, bevor er den <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Request</abbr> an den Anwendungsserver (wahrscheinlich Uvicorn via FastAPI CLI) ü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.
Bis hierher würde alles wie gewohnt funktionieren.
Wenn Sie dann jedoch die Benutzeroberfläche der integrierten Dokumentation (das Frontend) öffnen, wird angenommen, dass sich das OpenAPI-Schema unter `/openapi.json` anstelle von `/api/v1/openapi.json` befindet.
Das Frontend (das im Browser läuft) würde also versuchen, `/openapi.json` zu erreichen und wäre nicht in der Lage, das OpenAPI-Schema abzurufen.
Also würde das Frontend (das im Browser läuft) versuchen, `/openapi.json` zu erreichen und wäre nicht in der Lage, das OpenAPI-Schema abzurufen.
Da wir für unsere Anwendung einen Proxy mit dem Pfadpräfix `/api/v1` haben, muss das Frontend das OpenAPI-Schema unter `/api/v1/openapi.json` abrufen.
@@ -43,8 +138,11 @@ browser --> proxy
proxy --> server
```
!!! tip "Tipp"
Die IP `0.0.0.0` wird üblicherweise verwendet, um anzudeuten, dass das Programm alle auf diesem Computer/Server verfügbaren IPs abhört.
/// tip | Tipp
Die IP `0.0.0.0` wird üblicherweise verwendet, um anzudeuten, dass das Programm alle auf diesem Computer/Server verfügbaren IPs abhört.
///
Die Benutzeroberfläche der Dokumentation würde benötigen, dass das OpenAPI-Schema deklariert, dass sich dieser API-`server` unter `/api/v1` (hinter dem Proxy) befindet. Zum Beispiel:
@@ -63,16 +161,16 @@ Die Benutzeroberfläche der Dokumentation würde benötigen, dass das OpenAPI-Sc
}
```
In diesem Beispiel könnte der „Proxy“ etwa **Traefik** sein. Und der Server wäre so etwas wie **Uvicorn**, auf dem Ihre FastAPI-Anwendung ausgeführt wird.
In diesem Beispiel könnte der „Proxy“ etwa **Traefik** sein. Und der Server wäre etwas wie FastAPI CLI mit **Uvicorn**, auf dem Ihre FastAPI-Anwendung ausgeführt wird.
### Bereitstellung des `root_path`
### Bereitstellung des `root_path` { #providing-the-root-path }
Um dies zu erreichen, können Sie die Kommandozeilenoption `--root-path` wie folgt verwenden:
<div class="termy">
```console
$ uvicorn main:app --root-path /api/v1
$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
@@ -81,34 +179,35 @@ $ uvicorn main:app --root-path /api/v1
Falls Sie Hypercorn verwenden, das hat auch die Option `--root-path`.
!!! note "Technische Details"
Die ASGI-Spezifikation definiert einen `root_path` für diesen Anwendungsfall.
/// note | Technische Details
Und die Kommandozeilenoption `--root-path` stellt diesen `root_path` bereit.
Die ASGI-Spezifikation definiert einen `root_path` für diesen Anwendungsfall.
### Überprüfen des aktuellen `root_path`
Und die Kommandozeilenoption `--root-path` stellt diesen `root_path` bereit.
Sie können den aktuellen `root_path` abrufen, der von Ihrer Anwendung für jede Anfrage verwendet wird. Er ist Teil des `scope`-Dictionarys (das ist Teil der ASGI-Spezifikation).
///
### Testen des aktuellen `root_path` { #checking-the-current-root-path }
Sie können den aktuellen `root_path` abrufen, der von Ihrer Anwendung für jeden Request verwendet wird. Er ist Teil des `scope`-<abbr title="Dictionary Zuordnungstabelle: In anderen Sprachen auch Hash, Map, Objekt, Assoziatives Array genannt">Dictionarys</abbr> (das ist Teil der ASGI-Spezifikation).
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:
<div class="termy">
```console
$ uvicorn main:app --root-path /api/v1
$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
wäre die Response etwa:
wäre die <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr> etwa:
```JSON
{
@@ -117,21 +216,19 @@ wäre die Response etwa:
}
```
### Festlegen des `root_path` in der FastAPI-Anwendung
### Festlegen des `root_path` in der FastAPI-Anwendung { #setting-the-root-path-in-the-fastapi-app }
Falls Sie keine Möglichkeit haben, eine Kommandozeilenoption wie `--root-path` oder ähnlich zu übergeben, können Sie als Alternative beim Erstellen Ihrer FastAPI-Anwendung den Parameter `root_path` setzen:
Falls Sie keine Möglichkeit haben, eine Kommandozeilenoption wie `--root-path` oder ähnlich zu übergeben, können Sie, alternativ dazu, 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.
### Über `root_path`
### Über `root_path` { #about-root-path }
Beachten Sie, dass der Server (Uvicorn) diesen `root_path` für nichts anderes außer die Weitergabe an die Anwendung verwendet.
Beachten Sie, dass der Server (Uvicorn) diesen `root_path` für nichts anderes verwendet als für die Weitergabe an die Anwendung.
Aber wenn Sie mit Ihrem Browser auf <a href="http://127.0.0.1:8000" class="external-link" target="_blank">http://127.0.0.1:8000/app</a> gehen, sehen Sie die normale Antwort:
Aber wenn Sie mit Ihrem Browser auf <a href="http://127.0.0.1:8000/app" class="external-link" target="_blank">http://127.0.0.1:8000/app</a> gehen, sehen Sie die normale Response:
```JSON
{
@@ -144,17 +241,17 @@ Es wird also nicht erwartet, dass unter `http://127.0.0.1:8000/api/v1/app` darau
Uvicorn erwartet, dass der Proxy unter `http://127.0.0.1:8000/app` auf Uvicorn zugreift, und dann liegt es in der Verantwortung des Proxys, das zusätzliche `/api/v1`-Präfix darüber hinzuzufügen.
## Über Proxys mit einem abgetrennten Pfadpräfix
## Über Proxys mit einem abgetrennten Pfadpräfix { #about-proxies-with-a-stripped-path-prefix }
Bedenken Sie, dass ein Proxy mit abgetrennten Pfadpräfix nur eine von vielen Konfigurationsmöglichkeiten ist.
Bedenken Sie, dass ein Proxy mit abgetrenntem Pfadpräfix nur eine von vielen Konfigurationsmöglichkeiten ist.
Wahrscheinlich wird in vielen Fällen die Standardeinstellung sein, dass der Proxy kein abgetrenntes Pfadpräfix hat.
In einem solchen Fall (ohne ein abgetrenntes Pfadpräfix) würde der Proxy auf etwas wie `https://myawesomeapp.com` lauschen, und wenn der Browser dann zu `https://myawesomeapp.com/api/v1/` wechselt, und Ihr Server (z. B. Uvicorn) auf `http://127.0.0.1:8000` lauscht, würde der Proxy (ohne ein abgetrenntes Pfadpräfix) über denselben Pfad auf Uvicorn zugreifen: `http://127.0.0.1:8000/api/v1/app`.
In einem solchen Fall (ohne ein abgetrenntes Pfadpräfix) würde der Proxy auf etwas wie `https://myawesomeapp.com` lauschen, und wenn der Browser dann zu `https://myawesomeapp.com/api/v1/app` wechselt, und Ihr Server (z. B. Uvicorn) auf `http://127.0.0.1:8000` lauscht, würde der Proxy (ohne ein abgetrenntes Pfadpräfix) über denselben Pfad auf Uvicorn zugreifen: `http://127.0.0.1:8000/api/v1/app`.
## Lokal testen mit Traefik
## Lokal testen mit Traefik { #testing-locally-with-traefik }
Sie können das Experiment mit einem abgetrennten Pfadpräfix ganz einfach lokal ausführen, indem Sie <a href="https://docs.traefik.io/" class="external-link" target="_blank">Traefik</a> verwenden.
Sie können das Experiment mit einem abgetrennten Pfadpräfix einfach lokal ausführen, indem Sie <a href="https://docs.traefik.io/" class="external-link" target="_blank">Traefik</a> verwenden.
<a href="https://github.com/containous/traefik/releases" class="external-link" target="_blank">Laden Sie Traefik herunter</a>, es ist eine einzelne Binärdatei, Sie können die komprimierte Datei extrahieren und sie direkt vom Terminal aus ausführen.
@@ -172,8 +269,11 @@ Dann erstellen Sie eine Datei `traefik.toml` mit:
Dadurch wird Traefik angewiesen, Port 9999 abzuhören und eine andere Datei `routes.toml` zu verwenden.
!!! tip "Tipp"
Wir verwenden Port 9999 anstelle des Standard-HTTP-Ports 80, damit Sie ihn nicht mit Administratorrechten (`sudo`) ausführen müssen.
/// tip | Tipp
Wir verwenden Port 9999 anstelle des Standard-HTTP-Ports 80, damit Sie ihn nicht mit Administratorrechten (`sudo`) ausführen müssen.
///
Erstellen Sie nun die andere Datei `routes.toml`:
@@ -202,7 +302,7 @@ Erstellen Sie nun die andere Datei `routes.toml`:
Diese Datei konfiguriert Traefik, das Pfadpräfix `/api/v1` zu verwenden.
Und dann leitet Traefik seine Anfragen an Ihren Uvicorn weiter, der unter `http://127.0.0.1:8000` läuft.
Und dann leitet Traefik seine Requests an Ihren Uvicorn weiter, der unter `http://127.0.0.1:8000` läuft.
Starten Sie nun Traefik:
@@ -221,14 +321,14 @@ Und jetzt starten Sie Ihre Anwendung mit Uvicorn, indem Sie die Option `--root-p
<div class="termy">
```console
$ uvicorn main:app --root-path /api/v1
$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
### Die Responses betrachten
### Die Responses testen { #check-the-responses }
Wenn Sie nun zur URL mit dem Port für Uvicorn gehen: <a href="http://127.0.0.1:8000/app" class="external-link" target="_blank">http://127.0.0.1:8000/app</a>, sehen Sie die normale Response:
@@ -239,8 +339,11 @@ Wenn Sie nun zur URL mit dem Port für Uvicorn gehen: <a href="http://127.0.0.1:
}
```
!!! 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.
/// 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.
///
Öffnen Sie nun die URL mit dem Port für Traefik, einschließlich des Pfadpräfixes: <a href="http://127.0.0.1:9999/api/v1/app" class="external-link" target="_blank">http://127.0.0.1:9999/api/v1/app</a>.
@@ -261,7 +364,7 @@ Und die von Uvicorn direkt bereitgestellte Version ohne Pfadpräfix (`http://127
Dies demonstriert, wie der Proxy (Traefik) das Pfadpräfix verwendet und wie der Server (Uvicorn) den `root_path` aus der Option `--root-path` verwendet.
### Es in der Dokumentationsoberfläche betrachten
### Es in der Dokumentationsoberfläche testen { #check-the-docs-ui }
Jetzt folgt der spaßige Teil. ✨
@@ -281,22 +384,23 @@ Genau so, wie wir es wollten. ✔️
Dies liegt daran, dass FastAPI diesen `root_path` verwendet, um den Default-`server` in OpenAPI mit der von `root_path` bereitgestellten URL zu erstellen.
## Zusätzliche Server
## Zusätzliche Server { #additional-servers }
!!! warning "Achtung"
Dies ist ein fortgeschrittener Anwendungsfall. Überspringen Sie das gerne.
/// warning | Achtung
Dies ist ein fortgeschrittener Anwendungsfall. Überspringen Sie das gerne.
///
Standardmäßig erstellt **FastAPI** einen `server` im OpenAPI-Schema mit der URL für den `root_path`.
Sie können aber auch andere alternative `server` bereitstellen, beispielsweise wenn Sie möchten, dass *dieselbe* Dokumentationsoberfläche mit einer Staging- und Produktionsumgebung interagiert.
Sie können aber auch andere alternative `servers` bereitstellen, beispielsweise wenn Sie möchten, dass *dieselbe* Dokumentationsoberfläche mit einer Staging- und Produktionsumgebung interagiert.
Wenn Sie eine benutzerdefinierte Liste von Servern (`servers`) übergeben und es einen `root_path` gibt (da Ihre API hinter einem Proxy läuft), fügt **FastAPI** einen „Server“ mit diesem `root_path` am Anfang der Liste ein.
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:
@@ -323,27 +427,39 @@ Erzeugt ein OpenAPI-Schema, wie:
}
```
!!! tip "Tipp"
Beachten Sie den automatisch generierten Server mit dem `URL`-Wert `/api/v1`, welcher vom `root_path` stammt.
/// tip | Tipp
Beachten Sie den automatisch generierten Server mit dem `URL`-Wert `/api/v1`, welcher vom `root_path` stammt.
///
In der Dokumentationsoberfläche unter <a href="http://127.0.0.1:9999/api/v1/docs" class="external-link" target="_blank">http://127.0.0.1:9999/api/v1/docs</a> würde es so aussehen:
<img src="/img/tutorial/behind-a-proxy/image03.png">
!!! tip "Tipp"
Die Dokumentationsoberfläche interagiert mit dem von Ihnen ausgewählten Server.
/// tip | Tipp
### Den automatischen Server von `root_path` deaktivieren
Die Dokumentationsoberfläche interagiert mit dem von Ihnen ausgewählten Server.
///
/// note | Technische Details
Die Eigenschaft `servers` in der OpenAPI-Spezifikation ist optional.
Wenn Sie den Parameter `servers` nicht angeben und `root_path` den Wert `/` hat, wird die Eigenschaft `servers` im generierten OpenAPI-Schema standardmäßig vollständig weggelassen, was dem Äquivalent eines einzelnen Servers mit einem `url`-Wert von `/` entspricht.
///
### Den automatischen Server von `root_path` deaktivieren { #disable-automatic-server-from-root-path }
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.
## Mounten einer Unteranwendung
## Mounten einer Unteranwendung { #mounting-a-sub-application }
Wenn Sie gleichzeitig eine Unteranwendung mounten (wie beschrieben in [Unteranwendungen Mounts](sub-applications.md){.internal-link target=_blank}) und einen Proxy mit `root_path` verwenden wollen, können Sie das normal tun, wie Sie es erwarten würden.

View File

@@ -1,93 +1,103 @@
# Benutzerdefinierte Response HTML, Stream, Datei, andere
# Benutzerdefinierte Response HTML, Stream, Datei, andere { #custom-response-html-stream-file-others }
Standardmäßig gibt **FastAPI** die Responses mittels `JSONResponse` zurück.
Standardmäßig gibt **FastAPI** die <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Responses</abbr> mittels `JSONResponse` zurück.
Sie können das überschreiben, indem Sie direkt eine `Response` zurückgeben, wie in [Eine Response direkt zurückgeben](response-directly.md){.internal-link target=_blank} gezeigt.
Sie können dies überschreiben, indem Sie direkt eine `Response` zurückgeben, wie in [Eine Response direkt zurückgeben](response-directly.md){.internal-link target=_blank} gezeigt.
Wenn Sie jedoch direkt eine `Response` zurückgeben, werden die Daten nicht automatisch konvertiert und die Dokumentation wird nicht automatisch generiert (zum Beispiel wird der spezifische „Medientyp“, der im HTTP-Header `Content-Type` angegeben ist, nicht Teil der generierten OpenAPI).
Wenn Sie jedoch direkt eine `Response` (oder eine Unterklasse wie `JSONResponse`) zurückgeben, werden die Daten nicht automatisch konvertiert (selbst wenn Sie ein `response_model` deklariert haben), und die Dokumentation wird nicht automatisch generiert (zum Beispiel wird der spezifische „Medientyp“, der im HTTP-Header `Content-Type` angegeben ist, nicht Teil der generierten OpenAPI).
Sie können aber auch die `Response`, die Sie verwenden möchten, im *Pfadoperation-Dekorator* deklarieren.
Sie können jedoch auch die `Response`, die Sie verwenden möchten (z. B. jede `Response`-Unterklasse), im *Pfadoperation-Dekorator* mit dem `response_class`-Parameter deklarieren.
Der Inhalt, den Sie von Ihrer *Pfadoperation-Funktion* zurückgeben, wird in diese `Response` eingefügt.
Und wenn diese `Response` einen JSON-Medientyp (`application/json`) hat, wie es bei `JSONResponse` und `UJSONResponse` der Fall ist, werden die von Ihnen zurückgegebenen Daten automatisch mit jedem Pydantic `response_model` konvertiert (und gefiltert), das Sie im *Pfadoperation-Dekorator* deklariert haben.
!!! note "Hinweis"
Wenn Sie eine Response-Klasse ohne Medientyp verwenden, erwartet FastAPI, dass Ihre Response keinen Inhalt hat, und dokumentiert daher das Format der Response nicht in deren generierter OpenAPI-Dokumentation.
/// note | Hinweis
## `ORJSONResponse` verwenden
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.
Um beispielsweise noch etwas Leistung herauszuholen, können Sie <a href="https://github.com/ijl/orjson" class="external-link" target="_blank">`orjson`</a> installieren und verwenden, und die Response als `ORJSONResponse` deklarieren.
///
Importieren Sie die `Response`-Klasse (-Unterklasse), die Sie verwenden möchten, und deklarieren Sie sie im *Pfadoperation-Dekorator*.
## `ORJSONResponse` verwenden { #use-orjsonresponse }
Bei umfangreichen Responses ist die direkte Rückgabe einer `Response` viel schneller als ein Dictionary zurückzugeben.
Um beispielsweise noch etwas Leistung herauszuholen, können Sie <a href="https://github.com/ijl/orjson" class="external-link" target="_blank">`orjson`</a> installieren und die Response als `ORJSONResponse` setzen.
Importieren Sie die `Response`-Klasse (Unterklasse), die Sie verwenden möchten, und deklarieren Sie sie im *Pfadoperation-Dekorator*.
Bei umfangreichen Responses ist die direkte Rückgabe einer `Response` wesentlich schneller als ein <abbr title="Dictionary Zuordnungstabelle: In anderen Sprachen auch Hash, Map, Objekt, Assoziatives Array genannt">Dictionary</abbr> zurückzugeben.
Das liegt daran, dass FastAPI standardmäßig jedes enthaltene Element überprüft und sicherstellt, dass es als JSON serialisierbar ist, und zwar unter Verwendung desselben [JSON-kompatiblen Encoders](../tutorial/encoder.md){.internal-link target=_blank}, der im Tutorial erläutert wurde. Dadurch können Sie **beliebige Objekte** zurückgeben, zum Beispiel Datenbankmodelle.
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
Der Parameter `response_class` wird auch verwendet, um den „Medientyp“ der Response zu definieren.
/// info | Info
In diesem Fall wird der HTTP-Header `Content-Type` auf `application/json` gesetzt.
Der Parameter `response_class` wird auch verwendet, um den „Medientyp“ der Response zu definieren.
Und er wird als solcher in OpenAPI dokumentiert.
In diesem Fall wird der HTTP-Header `Content-Type` auf `application/json` gesetzt.
!!! tip "Tipp"
Die `ORJSONResponse` ist derzeit nur in FastAPI verfügbar, nicht in Starlette.
Und er wird als solcher in OpenAPI dokumentiert.
## HTML-Response
///
/// tip | Tipp
Die `ORJSONResponse` ist nur in FastAPI verfügbar, nicht in Starlette.
///
## HTML-Response { #html-response }
Um eine Response mit HTML direkt von **FastAPI** zurückzugeben, verwenden Sie `HTMLResponse`.
* 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
Der Parameter `response_class` wird auch verwendet, um den „Medientyp“ der Response zu definieren.
/// info | Info
In diesem Fall wird der HTTP-Header `Content-Type` auf `text/html` gesetzt.
Der Parameter `response_class` wird auch verwendet, um den „Medientyp“ der Response zu definieren.
Und er wird als solcher in OpenAPI dokumentiert.
In diesem Fall wird der HTTP-Header `Content-Type` auf `text/html` gesetzt.
### Eine `Response` zurückgeben
Und er wird als solcher in OpenAPI dokumentiert.
///
### Eine `Response` zurückgeben { #return-a-response }
Wie in [Eine Response direkt zurückgeben](response-directly.md){.internal-link target=_blank} gezeigt, können Sie die Response auch direkt in Ihrer *Pfadoperation* überschreiben, indem Sie diese zurückgeben.
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"
Eine `Response`, die direkt von Ihrer *Pfadoperation-Funktion* zurückgegeben wird, wird in OpenAPI nicht dokumentiert (zum Beispiel wird der `Content-Type` nicht dokumentiert) und ist in der automatischen interaktiven Dokumentation nicht sichtbar.
/// warning | Achtung
!!! info
Natürlich stammen der eigentliche `Content-Type`-Header, der Statuscode, usw., aus dem `Response`-Objekt, das Sie zurückgegeben haben.
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.
### In OpenAPI dokumentieren und `Response` überschreiben
///
/// info | Info
Natürlich stammen der eigentliche `Content-Type`-Header, der Statuscode, usw., aus dem `Response`-Objekt, das Sie zurückgegeben haben.
///
### In OpenAPI dokumentieren und `Response` überschreiben { #document-in-openapi-and-override-response }
Wenn Sie die Response innerhalb der Funktion überschreiben und gleichzeitig den „Medientyp“ in OpenAPI dokumentieren möchten, können Sie den `response_class`-Parameter verwenden UND ein `Response`-Objekt zurückgeben.
Die `response_class` wird dann nur zur Dokumentation der OpenAPI-Pfadoperation* verwendet, Ihre `Response` wird jedoch unverändert verwendet.
Die `response_class` wird dann nur zur Dokumentation der OpenAPI-*Pfadoperation* verwendet, Ihre `Response` wird jedoch unverändert verwendet.
#### Eine `HTMLResponse` direkt zurückgeben
#### Eine `HTMLResponse` direkt zurückgeben { #return-an-htmlresponse-directly }
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.
@@ -97,18 +107,21 @@ Aber da Sie die `HTMLResponse` auch in der `response_class` übergeben haben, we
<img src="/img/tutorial/custom-response/image01.png">
## Verfügbare Responses
## Verfügbare Responses { #available-responses }
Hier sind einige der verfügbaren Responses.
Bedenken Sie, dass Sie `Response` verwenden können, um alles andere zurückzugeben, oder sogar eine benutzerdefinierte Unterklasse zu erstellen.
!!! note "Technische Details"
Sie können auch `from starlette.responses import HTMLResponse` verwenden.
/// note | Technische Details
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
Sie können auch `from starlette.responses import HTMLResponse` verwenden.
### `Response`
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
///
### `Response` { #response }
Die Hauptklasse `Response`, alle anderen Responses erben von ihr.
@@ -123,64 +136,71 @@ 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`
### `HTMLResponse` { #htmlresponse }
Nimmt Text oder Bytes entgegen und gibt eine HTML-Response zurück, wie Sie oben gelesen haben.
### `PlainTextResponse`
### `PlainTextResponse` { #plaintextresponse }
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`
### `JSONResponse` { #jsonresponse }
Nimmt einige Daten entgegen und gibt eine `application/json`-codierte Response zurück.
Dies ist die Standard-Response, die in **FastAPI** verwendet wird, wie Sie oben gelesen haben.
### `ORJSONResponse`
### `ORJSONResponse` { #orjsonresponse }
Eine schnelle alternative JSON-Response mit <a href="https://github.com/ijl/orjson" class="external-link" target="_blank">`orjson`</a>, wie Sie oben gelesen haben.
### `UJSONResponse`
/// info | Info
Dazu muss `orjson` installiert werden, z. B. mit `pip install orjson`.
///
### `UJSONResponse` { #ujsonresponse }
Eine alternative JSON-Response mit <a href="https://github.com/ultrajson/ultrajson" class="external-link" target="_blank">`ujson`</a>.
!!! warning "Achtung"
`ujson` ist bei der Behandlung einiger Sonderfälle weniger sorgfältig als Pythons eingebaute Implementierung.
/// info | Info
```Python hl_lines="2 7"
{!../../../docs_src/custom_response/tutorial001.py!}
```
Dazu muss `ujson` installiert werden, z. B. mit `pip install ujson`.
!!! tip "Tipp"
Möglicherweise ist `ORJSONResponse` eine schnellere Alternative.
///
### `RedirectResponse`
/// warning | Achtung
`ujson` ist bei der Behandlung einiger Sonderfälle weniger sorgfältig als Pythons eingebaute Implementierung.
///
{* ../../docs_src/custom_response/tutorial001.py hl[2,7] *}
/// tip | Tipp
Möglicherweise ist `ORJSONResponse` eine schnellere Alternative.
///
### `RedirectResponse` { #redirectresponse }
Gibt eine HTTP-Weiterleitung (HTTP-Redirect) zurück. Verwendet standardmäßig den Statuscode 307 Temporäre Weiterleitung (Temporary Redirect).
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.
@@ -190,42 +210,39 @@ 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`
### `StreamingResponse` { #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
#### Verwendung von `StreamingResponse` mit dateiartigen Objekten { #using-streamingresponse-with-file-like-objects }
Wenn Sie ein dateiähnliches (file-like) Objekt haben (z. B. das von `open()` zurückgegebene Objekt), können Sie eine Generatorfunktion erstellen, um über dieses dateiähnliche Objekt zu iterieren.
Wenn Sie ein dateiartiges (<a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">file-like</a>) Objekt haben (z. B. das von `open()` zurückgegebene Objekt), können Sie eine Generatorfunktion erstellen, um über dieses dateiartige Objekt zu iterieren.
Auf diese Weise müssen Sie nicht alles zuerst in den Arbeitsspeicher lesen und können diese Generatorfunktion an `StreamingResponse` übergeben und zurückgeben.
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 hl[2,10:12,14] *}
1. Das ist die Generatorfunktion. Es handelt sich um eine „Generatorfunktion“, da sie `yield`-Anweisungen enthält.
2. Durch die Verwendung eines `with`-Blocks stellen wir sicher, dass das dateiähnliche Objekt geschlossen wird, nachdem die Generatorfunktion fertig ist. Also, nachdem sie mit dem Senden der Response fertig ist.
2. Durch die Verwendung eines `with`-Blocks stellen wir sicher, dass das dateiartige Objekt geschlossen wird, nachdem die Generatorfunktion fertig ist. Also, nachdem sie mit dem Senden der Response fertig ist.
3. Dieses `yield from` weist die Funktion an, über das Ding namens `file_like` zu iterieren. Und dann für jeden iterierten Teil, diesen Teil so zurückzugeben, als wenn er aus dieser Generatorfunktion (`iterfile`) stammen würde.
Es handelt sich also hier um eine Generatorfunktion, die die „generierende“ Arbeit intern auf etwas anderes überträgt.
Auf diese Weise können wir das Ganze in einen `with`-Block einfügen und so sicherstellen, dass das dateiartige Objekt nach Abschluss geschlossen wird.
!!! tip "Tipp"
Beachten Sie, dass wir, da wir Standard-`open()` verwenden, welches `async` und `await` nicht unterstützt, hier die Pfadoperation mit normalen `def` deklarieren.
/// tip | Tipp
### `FileResponse`
Beachten Sie, dass wir, da wir Standard-`open()` verwenden, welches `async` und `await` nicht unterstützt, hier die Pfadoperation mit normalen `def` deklarieren.
///
### `FileResponse` { #fileresponse }
Streamt eine Datei asynchron als Response.
@@ -238,19 +255,15 @@ 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.
## Benutzerdefinierte Response-Klasse
## Benutzerdefinierte Response-Klasse { #custom-response-class }
Sie können Ihre eigene benutzerdefinierte Response-Klasse erstellen, die von `Response` erbt und diese verwendet.
@@ -260,9 +273,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:
@@ -280,7 +291,7 @@ Statt:
Natürlich werden Sie wahrscheinlich viel bessere Möglichkeiten finden, Vorteil daraus zu ziehen, als JSON zu formatieren. 😉
## Standard-Response-Klasse
## Standard-Response-Klasse { #default-response-class }
Beim Erstellen einer **FastAPI**-Klasseninstanz oder eines `APIRouter`s können Sie angeben, welche Response-Klasse standardmäßig verwendet werden soll.
@@ -288,13 +299,14 @@ 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"
Sie können dennoch weiterhin `response_class` in *Pfadoperationen* überschreiben, wie bisher.
/// tip | Tipp
## Zusätzliche Dokumentation
Sie können dennoch weiterhin `response_class` in *Pfadoperationen* überschreiben, wie bisher.
///
## Zusätzliche Dokumentation { #additional-documentation }
Sie können auch den Medientyp und viele andere Details in OpenAPI mit `responses` deklarieren: [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}.

View File

@@ -1,39 +1,38 @@
# Verwendung von Datenklassen
# Verwendung von Datenklassen { #using-dataclasses }
FastAPI basiert auf **Pydantic** und ich habe Ihnen gezeigt, wie Sie Pydantic-Modelle verwenden können, um Requests und Responses zu deklarieren.
FastAPI basiert auf **Pydantic**, und ich habe Ihnen gezeigt, wie Sie Pydantic-Modelle verwenden können, um <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Requests</abbr> und <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Responses</abbr> zu deklarieren.
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>.
Das ist dank **Pydantic** ebenfalls möglich, da es <a href="https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel" class="external-link" target="_blank">`dataclasses` intern unterstützt</a>.
Auch wenn im obige Code Pydantic nicht explizit vorkommt, verwendet FastAPI Pydantic, um diese Standard-Datenklassen in Pydantics eigene Variante von Datenklassen zu konvertieren.
Auch wenn im obigen Code Pydantic nicht explizit vorkommt, verwendet FastAPI Pydantic, um diese Standard-Datenklassen in Pydantics eigene Variante von Datenklassen zu konvertieren.
Und natürlich wird das gleiche unterstützt:
* Validierung der Daten
* Serialisierung der Daten
* Dokumentation der Daten, usw.
* Datenvalidierung
* Datenserialisierung
* Datendokumentation, usw.
Das funktioniert genauso wie mit Pydantic-Modellen. Und tatsächlich wird es unter der Haube mittels Pydantic auf die gleiche Weise bewerkstelligt.
!!! info
Bedenken Sie, dass Datenklassen nicht alles können, was Pydantic-Modelle können.
/// info | Info
Daher müssen Sie möglicherweise weiterhin Pydantic-Modelle verwenden.
Bedenken Sie, dass Datenklassen nicht alles können, was Pydantic-Modelle können.
Wenn Sie jedoch eine Menge Datenklassen herumliegen haben, ist dies ein guter Trick, um sie für eine Web-API mithilfe von FastAPI zu verwenden. 🤓
Daher müssen Sie möglicherweise weiterhin Pydantic-Modelle verwenden.
## Datenklassen als `response_model`
Wenn Sie jedoch eine Menge Datenklassen herumliegen haben, ist dies ein guter Trick, um sie für eine Web-API mithilfe von FastAPI zu verwenden. 🤓
///
## Datenklassen in `response_model` { #dataclasses-in-response-model }
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.
@@ -41,7 +40,7 @@ Auf diese Weise wird deren Schema in der Benutzeroberfläche der API-Dokumentati
<img src="/img/tutorial/dataclasses/image01.png">
## Datenklassen in verschachtelten Datenstrukturen
## Datenklassen in verschachtelten Datenstrukturen { #dataclasses-in-nested-data-structures }
Sie können `dataclasses` auch mit anderen Typannotationen kombinieren, um verschachtelte Datenstrukturen zu erstellen.
@@ -49,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`.
@@ -65,7 +62,7 @@ In diesem Fall können Sie einfach die Standard-`dataclasses` durch `pydantic.da
In diesem Fall handelt es sich um eine Liste von `Item`-Datenklassen.
6. Hier geben wir ein Dictionary zurück, das `items` enthält, welches eine Liste von Datenklassen ist.
6. Hier geben wir ein <abbr title="Dictionary Zuordnungstabelle: In anderen Sprachen auch Hash, Map, Objekt, Assoziatives Array genannt">Dictionary</abbr> zurück, das `items` enthält, welches eine Liste von Datenklassen ist.
FastAPI ist weiterhin in der Lage, die Daten nach JSON zu <abbr title="Konvertieren der Daten in ein übertragbares Format">serialisieren</abbr>.
@@ -77,7 +74,7 @@ In diesem Fall können Sie einfach die Standard-`dataclasses` durch `pydantic.da
Wie immer können Sie in FastAPI `def` und `async def` beliebig kombinieren.
Wenn Sie eine Auffrischung darüber benötigen, wann welche Anwendung sinnvoll ist, lesen Sie den Abschnitt „In Eile?“ in der Dokumentation zu [`async` und `await`](../async.md#in-eile){.internal-link target=_blank}.
Wenn Sie eine Auffrischung darüber benötigen, wann welche Anwendung sinnvoll ist, lesen Sie den Abschnitt „In Eile?“ in der Dokumentation zu [`async` und `await`](../async.md#in-a-hurry){.internal-link target=_blank}.
9. Diese *Pfadoperation-Funktion* gibt keine Datenklassen zurück (obwohl dies möglich wäre), sondern eine Liste von Dictionarys mit internen Daten.
@@ -87,12 +84,12 @@ Sie können `dataclasses` mit anderen Typannotationen auf vielfältige Weise kom
Weitere Einzelheiten finden Sie in den Bemerkungen im Quellcode oben.
## Mehr erfahren
## Mehr erfahren { #learn-more }
Sie können `dataclasses` auch mit anderen Pydantic-Modellen kombinieren, von ihnen erben, sie in Ihre eigenen Modelle einbinden, usw.
Weitere Informationen finden Sie in der <a href="https://pydantic-docs.helpmanual.io/usage/dataclasses/" class="external-link" target="_blank">Pydantic-Dokumentation zu Datenklassen</a>.
Weitere Informationen finden Sie in der <a href="https://docs.pydantic.dev/latest/concepts/dataclasses/" class="external-link" target="_blank">Pydantic-Dokumentation zu Datenklassen</a>.
## Version
## Version { #version }
Dies ist verfügbar seit FastAPI-Version `0.67.0`. 🔖

View File

@@ -1,14 +1,14 @@
# Lifespan-Events
# Lifespan-Events { #lifespan-events }
Sie können Logik (Code) definieren, die ausgeführt werden soll, bevor die Anwendung **hochfährt**. Dies bedeutet, dass dieser Code **einmal** ausgeführt wird, **bevor** die Anwendung **beginnt, Requests entgegenzunehmen**.
Sie können Logik (Code) definieren, die ausgeführt werden soll, bevor die Anwendung **hochfährt**. Dies bedeutet, dass dieser Code **einmal** ausgeführt wird, **bevor** die Anwendung **beginnt, <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Requests</abbr> entgegenzunehmen**.
Auf die gleiche Weise können Sie Logik (Code) definieren, die ausgeführt werden soll, wenn die Anwendung **heruntergefahren** wird. In diesem Fall wird dieser Code **einmal** ausgeführt, **nachdem** möglicherweise **viele Requests** bearbeitet wurden.
Da dieser Code ausgeführt wird, bevor die Anwendung **beginnt**, Requests entgegenzunehmen, und unmittelbar, nachdem sie die Bearbeitung von Requests **abgeschlossen hat**, deckt er die gesamte **Lebensdauer Lifespan** der Anwendung ab (das Wort „Lifespan“ wird gleich wichtig sein 😉).
Da dieser Code ausgeführt wird, bevor die Anwendung **beginnt**, Requests entgegenzunehmen, und unmittelbar, nachdem sie die Bearbeitung von Requests **abgeschlossen hat**, deckt er den gesamten Anwendungs-<abbr title="Lebensdauer">**Lifespan**</abbr> ab (das Wort „Lifespan“ wird gleich wichtig sein 😉).
Dies kann sehr nützlich sein, um **Ressourcen** einzurichten, die Sie in der gesamten Anwendung verwenden wollen und die von Requests **gemeinsam genutzt** werden und/oder die Sie anschließend **aufräumen** müssen. Zum Beispiel ein Pool von Datenbankverbindungen oder das Laden eines gemeinsam genutzten Modells für maschinelles Lernen.
Dies kann sehr nützlich sein, um **Ressourcen** einzurichten, die Sie in der gesamten App verwenden wollen und die von Requests **gemeinsam genutzt** werden und/oder die Sie anschließend **aufräumen** müssen. Zum Beispiel ein Pool von Datenbankverbindungen oder das Laden eines gemeinsam genutzten Modells für maschinelles Lernen.
## Anwendungsfall
## Anwendungsfall { #use-case }
Beginnen wir mit einem Beispiel-**Anwendungsfall** und schauen uns dann an, wie wir ihn mit dieser Methode implementieren können.
@@ -22,48 +22,45 @@ Sie könnten das auf der obersten Ebene des Moduls/der Datei machen, aber das w
Das wollen wir besser machen: Laden wir das Modell, bevor die Requests bearbeitet werden, aber unmittelbar bevor die Anwendung beginnt, Requests zu empfangen, und nicht, während der Code geladen wird.
## Lifespan
## Lifespan { #lifespan }
Sie können diese Logik beim *Hochfahren* und *Herunterfahren* mithilfe des `lifespan`-Parameters der `FastAPI`-App und eines „Kontextmanagers“ definieren (ich zeige Ihnen gleich, was das ist).
Sie können diese Logik beim <abbr title="Hochfahren">*Startup*</abbr> und <abbr title="Herunterfahren">*Shutdown*</abbr> mithilfe des `lifespan`-Parameters der `FastAPI`-App und eines „Kontextmanagers“ definieren (ich zeige Ihnen gleich, was das ist).
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*.
Hier simulieren wir den langsamen *Startup*, das Laden des Modells, indem wir die (Fake-)Modellfunktion vor dem `yield` in das <abbr title="Dictionary Zuordnungstabelle: In anderen Sprachen auch Hash, Map, Objekt, Assoziatives Array genannt">Dictionary</abbr> mit Modellen für maschinelles Lernen einfügen. Dieser Code wird ausgeführt, **bevor** die Anwendung **beginnt, Requests entgegenzunehmen**, während des *Startups*.
Und dann, direkt nach dem `yield`, entladen wir das Modell. Dieser Code wird unmittelbar vor dem *Herunterfahren* ausgeführt, **nachdem** die Anwendung **die Bearbeitung von Requests abgeschlossen hat**. Dadurch könnten beispielsweise Ressourcen wie Arbeitsspeicher oder eine GPU freigegeben werden.
Und dann, direkt nach dem `yield`, entladen wir das Modell. Dieser Code wird ausgeführt, **nachdem** die Anwendung **die Bearbeitung von Requests abgeschlossen hat**, direkt vor dem *Shutdown*. Dadurch könnten beispielsweise Ressourcen wie Arbeitsspeicher oder eine GPU freigegeben werden.
!!! tip "Tipp"
Das *Herunterfahren* würde erfolgen, wenn Sie die Anwendung **stoppen**.
/// tip | Tipp
Möglicherweise müssen Sie eine neue Version starten, oder Sie haben es einfach satt, sie auszuführen. 🤷
Das `shutdown` würde erfolgen, wenn Sie die Anwendung **stoppen**.
### Lifespan-Funktion
Möglicherweise müssen Sie eine neue Version starten, oder Sie haben es einfach satt, sie auszuführen. 🤷
///
### Lifespan-Funktion { #lifespan-function }
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.
Und der Teil nach `yield` wird ausgeführt, **nachdem** die Anwendung beendet ist.
### Asynchroner Kontextmanager
### Asynchroner Kontextmanager { #async-context-manager }
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:
@@ -85,78 +82,84 @@ 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)
## Alternative Events (<abbr title="veraltet, obsolet: Es soll nicht mehr verwendet werden">deprecatet</abbr>) { #alternative-events-deprecated }
!!! warning "Achtung"
Der empfohlene Weg, das *Hochfahren* und *Herunterfahren* zu handhaben, ist die Verwendung des `lifespan`-Parameters der `FastAPI`-App, wie oben beschrieben. Wenn Sie einen `lifespan`-Parameter übergeben, werden die `startup`- und `shutdown`-Eventhandler nicht mehr aufgerufen. Es ist entweder alles `lifespan` oder alles Events, nicht beides.
/// warning | Achtung
Sie können diesen Teil wahrscheinlich überspringen.
Der empfohlene Weg, den *Startup* und *Shutdown* 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.
Es gibt eine alternative Möglichkeit, diese Logik zu definieren, sodass sie beim *Hochfahren* und beim *Herunterfahren* ausgeführt wird.
Sie können diesen Teil wahrscheinlich überspringen.
Sie können <abbr title="Eventhandler Ereignisbehandler: Funktion, die bei jedem Eintreten eines bestimmten Ereignisses ausgeführt wird">Eventhandler</abbr> (Funktionen) definieren, die ausgeführt werden sollen, bevor die Anwendung hochgefahren wird oder wenn die Anwendung heruntergefahren wird.
///
Es gibt eine alternative Möglichkeit, diese Logik zu definieren, sodass sie beim *Startup* und beim *Shutdown* ausgeführt wird.
Sie können <abbr title="Eventhandler Ereignisbehandler: Funktion, die beim Eintreten eines bestimmten Ereignisses ausgeführt wird">Eventhandler</abbr> (Funktionen) definieren, die ausgeführt werden sollen, bevor die Anwendung hochgefahren wird oder wenn die Anwendung heruntergefahren wird.
Diese Funktionen können mit `async def` oder normalem `def` deklariert werden.
### `startup`-Event
### `startup`-Event { #startup-event }
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.
Sie können mehr als eine Eventhandler-Funktion hinzufügen.
Und Ihre Anwendung empfängt erst dann Anfragen, wenn alle `startup`-Eventhandler abgeschlossen sind.
Und Ihre Anwendung empfängt erst dann Requests, wenn alle `startup`-Eventhandler abgeschlossen sind.
### `shutdown`-Event
### `shutdown`-Event { #shutdown-event }
Um eine Funktion hinzuzufügen, die beim Herunterfahren der Anwendung ausgeführt werden soll, deklarieren Sie sie mit dem Event `shutdown`:
Um eine Funktion hinzuzufügen, die beim Shutdown 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`.
!!! info
In der Funktion `open()` bedeutet `mode="a"` „append“ („anhängen“), sodass die Zeile nach dem, was sich in dieser Datei befindet, hinzugefügt wird, ohne den vorherigen Inhalt zu überschreiben.
/// info | Info
!!! tip "Tipp"
Beachten Sie, dass wir in diesem Fall eine Standard-Python-Funktion `open()` verwenden, die mit einer Datei interagiert.
In der Funktion `open()` bedeutet `mode="a"` „append“ („anhängen“), sodass die Zeile nach dem, was sich in dieser Datei befindet, hinzugefügt wird, ohne den vorherigen Inhalt zu überschreiben.
Es handelt sich also um I/O (Input/Output), welches „Warten“ erfordert, bis Dinge auf die Festplatte geschrieben werden.
///
Aber `open()` verwendet nicht `async` und `await`.
/// tip | Tipp
Daher deklarieren wir die Eventhandler-Funktion mit Standard-`def` statt mit `async def`.
Beachten Sie, dass wir in diesem Fall eine Standard-Python-Funktion `open()` verwenden, die mit einer Datei interagiert.
### `startup` und `shutdown` zusammen
Es handelt sich also um I/O (Input/Output), welches „Warten“ erfordert, bis Dinge auf die Festplatte geschrieben werden.
Es besteht eine hohe Wahrscheinlichkeit, dass die Logik für Ihr *Hochfahren* und *Herunterfahren* miteinander verknüpft ist. Vielleicht möchten Sie etwas beginnen und es dann beenden, eine Ressource laden und sie dann freigeben usw.
Aber `open()` verwendet nicht `async` und `await`.
Daher deklarieren wir die Eventhandler-Funktion mit Standard-`def` statt mit `async def`.
///
### `startup` und `shutdown` zusammen { #startup-and-shutdown-together }
Es besteht eine hohe Wahrscheinlichkeit, dass die Logik für Ihr *Startup* und *Shutdown* miteinander verknüpft ist. Vielleicht möchten Sie etwas beginnen und es dann beenden, eine Ressource laden und sie dann freigeben usw.
Bei getrennten Funktionen, die keine gemeinsame Logik oder Variablen haben, ist dies schwieriger, da Sie Werte in globalen Variablen speichern oder ähnliche Tricks verwenden müssen.
Aus diesem Grund wird jetzt empfohlen, stattdessen `lifespan` wie oben erläutert zu verwenden.
## Technische Details
## Technische Details { #technical-details }
Nur ein technisches Detail für die neugierigen Nerds. 🤓
In der technischen ASGI-Spezifikation ist dies Teil des <a href="https://asgi.readthedocs.io/en/latest/specs/lifespan.html" class="external-link" target="_blank">Lifespan Protokolls</a> und definiert Events namens `startup` und `shutdown`.
!!! info
Weitere Informationen zu Starlettes `lifespan`-Handlern finden Sie in <a href="https://www.starlette.io/lifespan/" class="external-link" target="_blank">Starlettes Lifespan-Dokumentation</a>.
/// info | Info
Einschließlich, wie man Lifespan-Zustand handhabt, der in anderen Bereichen Ihres Codes verwendet werden kann.
Weitere Informationen zu Starlettes `lifespan`-Handlern finden Sie in <a href="https://www.starlette.dev/lifespan/" class="external-link" target="_blank">Starlettes Lifespan-Dokumentation</a>.
## Unteranwendungen
Einschließlich, wie man Lifespan-Zustand handhabt, der in anderen Bereichen Ihres Codes verwendet werden kann.
🚨 Beachten Sie, dass diese Lifespan-Events (Hochfahren und Herunterfahren) nur für die Hauptanwendung ausgeführt werden, nicht für [Unteranwendungen Mounts](sub-applications.md){.internal-link target=_blank}.
///
## Unteranwendungen { #sub-applications }
🚨 Beachten Sie, dass diese Lifespan-Events (Startup und Shutdown) nur für die Hauptanwendung ausgeführt werden, nicht für [Unteranwendungen Mounts](sub-applications.md){.internal-link target=_blank}.

View File

@@ -1,130 +1,88 @@
# Clients generieren
# SDKs generieren { #generating-sdks }
Da **FastAPI** auf der OpenAPI-Spezifikation basiert, erhalten Sie automatische Kompatibilität mit vielen Tools, einschließlich der automatischen API-Dokumentation (bereitgestellt von Swagger UI).
Da **FastAPI** auf der **OpenAPI**-Spezifikation basiert, können dessen APIs in einem standardisierten Format beschrieben werden, das viele Tools verstehen.
Ein besonderer Vorteil, der nicht unbedingt offensichtlich ist, besteht darin, dass Sie für Ihre API **Clients generieren** können (manchmal auch <abbr title="Software Development Kits">**SDKs**</abbr> genannt), für viele verschiedene **Programmiersprachen**.
Dies vereinfacht es, aktuelle **Dokumentation** und Client-Bibliotheken (<abbr title="Software Development Kit Software-Entwicklungspaket">**SDKs**</abbr>) in verschiedenen Sprachen zu generieren sowie **Test-** oder **Automatisierungs-Workflows**, die mit Ihrem Code synchron bleiben.
## OpenAPI-Client-Generatoren
In diesem Leitfaden erfahren Sie, wie Sie ein **TypeScript-SDK** für Ihr FastAPI-Backend generieren.
Es gibt viele Tools zum Generieren von Clients aus **OpenAPI**.
## Open Source SDK-Generatoren { #open-source-sdk-generators }
Ein gängiges Tool ist <a href="https://openapi-generator.tech/" class="external-link" target="_blank">OpenAPI Generator</a>.
Eine vielseitige Möglichkeit ist der <a href="https://openapi-generator.tech/" class="external-link" target="_blank">OpenAPI Generator</a>, der **viele Programmiersprachen** unterstützt und SDKs aus Ihrer OpenAPI-Spezifikation generieren kann.
Wenn Sie ein **Frontend** erstellen, ist <a href="https://github.com/hey-api/openapi-ts" class="external-link" target="_blank">openapi-ts</a> eine sehr interessante Alternative.
Für **TypeScript-Clients** ist <a href="https://heyapi.dev/" class="external-link" target="_blank">Hey API</a> eine speziell entwickelte Lösung, die ein optimiertes Erlebnis für das TypeScript-Ökosystem bietet.
## Client- und SDK-Generatoren Sponsor
Weitere SDK-Generatoren finden Sie auf <a href="https://openapi.tools/#sdk" class="external-link" target="_blank">OpenAPI.Tools</a>.
Es gibt auch einige **vom Unternehmen entwickelte** Client- und SDK-Generatoren, die auf OpenAPI (FastAPI) basieren. In einigen Fällen können diese Ihnen **weitere Funktionalität** zusätzlich zu qualitativ hochwertigen generierten SDKs/Clients bieten.
/// tip | Tipp
Einige von diesen ✨ [**sponsern FastAPI**](../help-fastapi.md#den-autor-sponsern){.internal-link target=_blank} ✨, das gewährleistet die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ökosystem**.
FastAPI generiert automatisch **OpenAPI 3.1**-Spezifikationen, daher muss jedes von Ihnen verwendete Tool diese Version unterstützen.
Und es zeigt deren wahres Engagement für FastAPI und seine **Community** (Sie), da diese Ihnen nicht nur einen **guten Service** bieten möchten, sondern auch sicherstellen möchten, dass Sie über ein **gutes und gesundes Framework** verfügen, FastAPI. 🙇
///
Beispielsweise könnten Sie <a href="https://speakeasyapi.dev/?utm_source=fastapi+repo&utm_medium=github+sponsorship" class="external-link" target="_blank">Speakeasy</a> ausprobieren.
## SDK-Generatoren von FastAPI-Sponsoren { #sdk-generators-from-fastapi-sponsors }
Es gibt auch mehrere andere Unternehmen, welche ähnliche Dienste anbieten und die Sie online suchen und finden können. 🤓
Dieser Abschnitt hebt **venture-unterstützte** und **firmengestützte** Lösungen hervor, die von Unternehmen entwickelt werden, welche FastAPI sponsern. Diese Produkte bieten **zusätzliche Funktionen** und **Integrationen** zusätzlich zu hochwertig generierten SDKs.
## Einen TypeScript-Frontend-Client generieren
Durch das ✨ [**Sponsoring von FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨ helfen diese Unternehmen sicherzustellen, dass das Framework und sein **Ökosystem** gesund und **nachhaltig** bleiben.
Ihr Sponsoring zeigt auch ein starkes Engagement für die FastAPI-**Community** (Sie), was bedeutet, dass sie nicht nur einen **großartigen Service** bieten möchten, sondern auch ein **robustes und florierendes Framework**, FastAPI, unterstützen möchten. 🙇
Zum Beispiel könnten Sie ausprobieren:
* <a href="https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship" class="external-link" target="_blank">Speakeasy</a>
* <a href="https://www.stainless.com/?utm_source=fastapi&utm_medium=referral" class="external-link" target="_blank">Stainless</a>
* <a href="https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi" class="external-link" target="_blank">liblab</a>
Einige dieser Lösungen sind möglicherweise auch Open Source oder bieten kostenlose Tarife an, sodass Sie diese ohne finanzielle Verpflichtung ausprobieren können. Andere kommerzielle SDK-Generatoren sind online verfügbar und können dort gefunden werden. 🤓
## Ein TypeScript-SDK erstellen { #create-a-typescript-sdk }
Beginnen wir mit einer einfachen FastAPI-Anwendung:
=== "Python 3.9+"
{* ../../docs_src/generate_clients/tutorial001_py39.py hl[7:9,12:13,16:17,21] *}
```Python hl_lines="7-9 12-13 16-17 21"
{!> ../../../docs_src/generate_clients/tutorial001_py39.py!}
```
Beachten Sie, dass die *Pfadoperationen* die Modelle definieren, die sie für die <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Request</abbr>- und <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>-<abbr title="Die eigentlichen Nutzdaten, abzüglich der Metadaten">Payload</abbr> verwenden, indem sie die Modelle `Item` und `ResponseMessage` verwenden.
=== "Python 3.8+"
### API-Dokumentation { #api-docs }
```Python hl_lines="9-11 14-15 18 19 23"
{!> ../../../docs_src/generate_clients/tutorial001.py!}
```
Beachten Sie, dass die *Pfadoperationen* die Modelle definieren, welche diese für die Request- und Response-<abbr title="Die eigentlichen Nutzdaten, abzüglich der Metadaten">Payload</abbr> verwenden, indem sie die Modelle `Item` und `ResponseMessage` verwenden.
### API-Dokumentation
Wenn Sie zur API-Dokumentation gehen, werden Sie sehen, dass diese die **Schemas** für die Daten enthält, welche in Requests gesendet und in Responses empfangen werden:
Wenn Sie zu `/docs` gehen, sehen Sie, dass es die **Schemas** für die Daten enthält, die in Requests gesendet und in Responses empfangen werden:
<img src="/img/tutorial/generate-clients/image01.png">
Sie können diese Schemas sehen, da sie mit den Modellen in der Anwendung deklariert wurden.
Sie können diese Schemas sehen, da sie mit den Modellen in der App deklariert wurden.
Diese Informationen sind im **OpenAPI-Schema** der Anwendung verfügbar und werden dann in der API-Dokumentation angezeigt (von Swagger UI).
Diese Informationen sind im **OpenAPI-Schema** der Anwendung verfügbar und werden in der API-Dokumentation angezeigt.
Und dieselben Informationen aus den Modellen, die in OpenAPI enthalten sind, können zum **Generieren des Client-Codes** verwendet werden.
Diese Informationen aus den Modellen, die in OpenAPI enthalten sind, können verwendet werden, um **den Client-Code zu generieren**.
### Einen TypeScript-Client generieren
### Hey API { #hey-api }
Nachdem wir nun die Anwendung mit den Modellen haben, können wir den Client-Code für das Frontend generieren.
Sobald wir eine FastAPI-App mit den Modellen haben, können wir Hey API verwenden, um einen TypeScript-Client zu generieren. Der schnellste Weg das zu tun, ist über npx.
#### `openapi-ts` installieren
Sie können `openapi-ts` in Ihrem Frontend-Code installieren mit:
<div class="termy">
```console
$ npm install @hey-api/openapi-ts --save-dev
---> 100%
```sh
npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client
```
</div>
Dies generiert ein TypeScript-SDK in `./src/client`.
#### Client-Code generieren
Sie können lernen, wie man <a href="https://heyapi.dev/openapi-ts/get-started" class="external-link" target="_blank">`@hey-api/openapi-ts` installiert</a> und über die <a href="https://heyapi.dev/openapi-ts/output" class="external-link" target="_blank">erzeugte Ausgabe</a> auf deren Website lesen.
Um den Client-Code zu generieren, können Sie das Kommandozeilentool `openapi-ts` verwenden, das soeben installiert wurde.
### Das SDK verwenden { #using-the-sdk }
Da es im lokalen Projekt installiert ist, könnten Sie diesen Befehl wahrscheinlich nicht direkt aufrufen, sondern würden ihn in Ihre Datei `package.json` einfügen.
Diese könnte so aussehen:
```JSON hl_lines="7"
{
"name": "frontend-app",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"generate-client": "openapi-ts --input http://localhost:8000/openapi.json --output ./src/client --client axios"
},
"author": "",
"license": "",
"devDependencies": {
"@hey-api/openapi-ts": "^0.27.38",
"typescript": "^4.6.2"
}
}
```
Nachdem Sie das NPM-Skript `generate-client` dort stehen haben, können Sie es ausführen mit:
<div class="termy">
```console
$ npm run generate-client
frontend-app@1.0.0 generate-client /home/user/code/frontend-app
> openapi-ts --input http://localhost:8000/openapi.json --output ./src/client --client axios
```
</div>
Dieser Befehl generiert Code in `./src/client` und verwendet intern `axios` (die Frontend-HTTP-Bibliothek).
### Den Client-Code ausprobieren
Jetzt können Sie den Client-Code importieren und verwenden. Er könnte wie folgt aussehen, beachten Sie, dass Sie automatische Codevervollständigung für die Methoden erhalten:
Jetzt können Sie den Client-Code importieren und verwenden. Er könnte wie folgt aussehen, beachten Sie, dass Sie eine automatische Vervollständigung für die Methoden erhalten:
<img src="/img/tutorial/generate-clients/image02.png">
Sie erhalten außerdem automatische Vervollständigung für die zu sendende Payload:
Sie werden auch eine automatische Vervollständigung für die zu sendende Payload erhalten:
<img src="/img/tutorial/generate-clients/image03.png">
!!! tip "Tipp"
Beachten Sie die automatische Vervollständigung für `name` und `price`, welche in der FastAPI-Anwendung im `Item`-Modell definiert wurden.
/// tip | Tipp
Beachten Sie die automatische Vervollständigung für `name` und `price`, die in der FastAPI-Anwendung im `Item`-Modell definiert wurden.
///
Sie erhalten Inline-Fehlerberichte für die von Ihnen gesendeten Daten:
@@ -134,27 +92,17 @@ Das Response-Objekt hat auch automatische Vervollständigung:
<img src="/img/tutorial/generate-clients/image05.png">
## FastAPI-Anwendung mit Tags
## FastAPI-Anwendung mit Tags { #fastapi-app-with-tags }
In vielen Fällen wird Ihre FastAPI-Anwendung größer sein und Sie werden wahrscheinlich Tags verwenden, um verschiedene Gruppen von *Pfadoperationen* zu separieren.
In vielen Fällen wird Ihre FastAPI-App größer sein und Sie werden wahrscheinlich Tags verwenden, um verschiedene Gruppen von *Pfadoperationen* zu separieren.
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:
Zum Beispiel könnten Sie einen Abschnitt für **Items (Artikel)** und einen weiteren Abschnitt für **Users (Benutzer)** haben, und diese könnten durch Tags getrennt sein:
=== "Python 3.9+"
{* ../../docs_src/generate_clients/tutorial002_py39.py hl[21,26,34] *}
```Python hl_lines="21 26 34"
{!> ../../../docs_src/generate_clients/tutorial002_py39.py!}
```
### Einen TypeScript-Client mit Tags generieren { #generate-a-typescript-client-with-tags }
=== "Python 3.8+"
```Python hl_lines="23 28 36"
{!> ../../../docs_src/generate_clients/tutorial002.py!}
```
### Einen TypeScript-Client mit Tags generieren
Wenn Sie unter Verwendung von Tags einen Client für eine FastAPI-Anwendung generieren, wird normalerweise auch der Client-Code anhand der Tags getrennt.
Wenn Sie einen Client für eine FastAPI-App generieren, die Tags verwendet, wird normalerweise der Client-Code auch anhand der Tags getrennt.
Auf diese Weise können Sie die Dinge für den Client-Code richtig ordnen und gruppieren:
@@ -165,7 +113,7 @@ In diesem Fall haben Sie:
* `ItemsService`
* `UsersService`
### Client-Methodennamen
### Client-Methodennamen { #client-method-names }
Im Moment sehen die generierten Methodennamen wie `createItemItemsPost` nicht sehr sauber aus:
@@ -175,41 +123,31 @@ ItemsService.createItemItemsPost({name: "Plumbus", price: 5})
... das liegt daran, dass der Client-Generator für jede *Pfadoperation* die OpenAPI-interne **Operation-ID** verwendet.
OpenAPI erfordert, dass jede Operation-ID innerhalb aller *Pfadoperationen* eindeutig ist. Daher verwendet FastAPI den **Funktionsnamen**, den **Pfad** und die **HTTP-Methode/-Operation**, um diese Operation-ID zu generieren. Denn so kann sichergestellt werden, dass die Operation-IDs eindeutig sind.
OpenAPI erfordert, dass jede Operation-ID innerhalb aller *Pfadoperationen* einzigartig ist. Daher verwendet FastAPI den **Funktionsnamen**, den **Pfad** und die **HTTP-Methode/-Operation**, um diese Operation-ID zu generieren. Denn so kann sichergestellt werden, dass die Operation-IDs einzigartig sind.
Aber ich zeige Ihnen als nächstes, wie Sie das verbessern können. 🤓
Aber ich zeige Ihnen als Nächstes, wie Sie das verbessern können. 🤓
## Benutzerdefinierte Operation-IDs und bessere Methodennamen
## Benutzerdefinierte Operation-IDs und bessere Methodennamen { #custom-operation-ids-and-better-method-names }
Sie können die Art und Weise, wie diese Operation-IDs **generiert** werden, **ändern**, um sie einfacher zu machen und **einfachere Methodennamen** in den Clients zu haben.
In diesem Fall müssen Sie auf andere Weise sicherstellen, dass jede Operation-ID **eindeutig** ist.
In diesem Fall müssen Sie auf andere Weise sicherstellen, dass jede Operation-ID **einzigartig** ist.
Sie könnten beispielsweise sicherstellen, dass jede *Pfadoperation* einen Tag hat, und dann die Operation-ID basierend auf dem **Tag** und dem **Namen** der *Pfadoperation* (dem Funktionsnamen) generieren.
Zum Beispiel könnten Sie sicherstellen, dass jede *Pfadoperation* einen Tag hat, und dann die Operation-ID basierend auf dem **Tag** und dem *Pfadoperation*-**Namen** (dem Funktionsnamen) generieren.
### Funktion zum Generieren einer eindeutigen ID erstellen
### Eine benutzerdefinierte Funktion zur Erzeugung einer eindeutigen ID erstellen { #custom-generate-unique-id-function }
FastAPI verwendet eine **eindeutige ID** für jede *Pfadoperation*, diese wird für die **Operation-ID** und auch für die Namen aller benötigten benutzerdefinierten Modelle für Requests oder Responses verwendet.
FastAPI verwendet eine **eindeutige ID** für jede *Pfadoperation*, die für die **Operation-ID** und auch für die Namen aller benötigten benutzerdefinierten Modelle für Requests oder Responses verwendet wird.
Sie können diese Funktion anpassen. Sie nimmt eine `APIRoute` und gibt einen String zurück.
Sie können diese Funktion anpassen. Sie nimmt ein `APIRoute` und gibt einen String zurück.
Hier verwendet sie beispielsweise den ersten Tag (Sie werden wahrscheinlich nur einen Tag haben) und den Namen der *Pfadoperation* (den Funktionsnamen).
Hier verwendet sie beispielsweise den ersten Tag (Sie werden wahrscheinlich nur einen Tag haben) und den *Pfadoperation*-Namen (den Funktionsnamen).
Anschließend können Sie diese benutzerdefinierte Funktion als Parameter `generate_unique_id_function` an **FastAPI** übergeben:
Anschließend können Sie diese benutzerdefinierte Funktion als `generate_unique_id_function`-Parameter an **FastAPI** übergeben:
=== "Python 3.9+"
{* ../../docs_src/generate_clients/tutorial003_py39.py hl[6:7,10] *}
```Python hl_lines="6-7 10"
{!> ../../../docs_src/generate_clients/tutorial003_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="8-9 12"
{!> ../../../docs_src/generate_clients/tutorial003.py!}
```
### Einen TypeScript-Client mit benutzerdefinierten Operation-IDs generieren
### Einen TypeScript-Client mit benutzerdefinierten Operation-IDs generieren { #generate-a-typescript-client-with-custom-operation-ids }
Wenn Sie nun den Client erneut generieren, werden Sie feststellen, dass er über die verbesserten Methodennamen verfügt:
@@ -217,70 +155,54 @@ Wenn Sie nun den Client erneut generieren, werden Sie feststellen, dass er über
Wie Sie sehen, haben die Methodennamen jetzt den Tag und dann den Funktionsnamen, aber keine Informationen aus dem URL-Pfad und der HTTP-Operation.
### Vorab-Modifikation der OpenAPI-Spezifikation für den Client-Generator
### Die OpenAPI-Spezifikation für den Client-Generator vorab modifizieren { #preprocess-the-openapi-specification-for-the-client-generator }
Der generierte Code enthält immer noch etwas **verdoppelte Information**.
Der generierte Code enthält immer noch einige **verdoppelte Informationen**.
Wir wissen bereits, dass diese Methode mit den **Items** zusammenhängt, da sich dieses Wort in `ItemsService` befindet (vom Tag übernommen), aber wir haben auch immer noch den Tagnamen im Methodennamen vorangestellt. 😕
Wir wissen bereits, dass diese Methode mit den **Items** zusammenhängt, weil dieses Wort in `ItemsService` enthalten ist (vom Tag übernommen), aber wir haben den Tag-Namen dennoch im Methodennamen vorangestellt. 😕
Wir werden das wahrscheinlich weiterhin für OpenAPI im Allgemeinen beibehalten wollen, da dadurch sichergestellt wird, dass die Operation-IDs **eindeutig** sind.
Wir werden das wahrscheinlich weiterhin für OpenAPI allgemein beibehalten wollen, da dadurch sichergestellt wird, dass die Operation-IDs **einzigartig** sind.
Aber für den generierten Client könnten wir die OpenAPI-Operation-IDs direkt vor der Generierung der Clients **modifizieren**, um diese Methodennamen schöner und **sauberer** zu machen.
Wir könnten das OpenAPI-JSON in eine Datei `openapi.json` herunterladen und dann mit einem Skript wie dem folgenden **den vorangestellten Tag entfernen**:
Wir könnten das OpenAPI-JSON in eine Datei `openapi.json` herunterladen und dann mit einem Skript wie dem folgenden **den präfixierten Tag entfernen**:
=== "Python"
{* ../../docs_src/generate_clients/tutorial004.py *}
```Python
{!> ../../../docs_src/generate_clients/tutorial004.py!}
```
//// tab | Node.js
=== "Node.js"
```Javascript
{!> ../../docs_src/generate_clients/tutorial004.js!}
```
```Javascript
{!> ../../../docs_src/generate_clients/tutorial004.js!}
```
////
Damit würden die Operation-IDs von Dingen wie `items-get_items` in `get_items` umbenannt, sodass der Client-Generator einfachere Methodennamen generieren kann.
### Einen TypeScript-Client mit der modifizierten OpenAPI generieren
### Einen TypeScript-Client mit der modifizierten OpenAPI generieren { #generate-a-typescript-client-with-the-preprocessed-openapi }
Da das Endergebnis nun in einer Datei `openapi.json` vorliegt, würden Sie die `package.json` ändern, um diese lokale Datei zu verwenden, zum Beispiel:
Da das Endergebnis nun in einer `openapi.json`-Datei vorliegt, müssen Sie Ihren Eingabeort aktualisieren:
```JSON hl_lines="7"
{
"name": "frontend-app",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"generate-client": "openapi-ts --input ./openapi.json --output ./src/client --client axios"
},
"author": "",
"license": "",
"devDependencies": {
"@hey-api/openapi-ts": "^0.27.38",
"typescript": "^4.6.2"
}
}
```sh
npx @hey-api/openapi-ts -i ./openapi.json -o src/client
```
Nach der Generierung des neuen Clients hätten Sie nun **saubere Methodennamen** mit allen **Autovervollständigungen**, **Inline-Fehlerberichten**, usw.:
Nach der Generierung des neuen Clients haben Sie jetzt **saubere Methodennamen**, mit allen **Autovervollständigungen**, **Inline-Fehlerberichten**, usw.:
<img src="/img/tutorial/generate-clients/image08.png">
## Vorteile
## Vorteile { #benefits }
Wenn Sie die automatisch generierten Clients verwenden, erhalten Sie **automatische Codevervollständigung** für:
Wenn Sie die automatisch generierten Clients verwenden, erhalten Sie **Autovervollständigung** für:
* Methoden.
* Request-Payloads im Body, Query-Parameter, usw.
* Response-Payloads.
Außerdem erhalten Sie für alles **Inline-Fehlerberichte**.
Sie erhalten auch **Inline-Fehlerberichte** für alles.
Und wann immer Sie den Backend-Code aktualisieren und das Frontend **neu generieren**, stehen alle neuen *Pfadoperationen* als Methoden zur Verfügung, die alten werden entfernt und alle anderen Änderungen werden im generierten Code reflektiert. 🤓
Und wann immer Sie den Backend-Code aktualisieren und **das Frontend neu generieren**, stehen alle neuen *Pfadoperationen* als Methoden zur Verfügung, die alten werden entfernt und alle anderen Änderungen werden im generierten Code reflektiert. 🤓
Das bedeutet auch, dass, wenn sich etwas ändert, dies automatisch im Client-Code **reflektiert** wird. Und wenn Sie den Client **erstellen**, kommt es zu einer Fehlermeldung, wenn die verwendeten Daten **nicht übereinstimmen**.
Das bedeutet auch, dass, wenn sich etwas ändert, dies automatisch im Client-Code **reflektiert** wird. Und wenn Sie den Client **erstellen**, wird eine Fehlermeldung ausgegeben, wenn die verwendeten Daten **nicht übereinstimmen**.
Sie würden also sehr früh im Entwicklungszyklus **viele Fehler erkennen**, anstatt darauf warten zu müssen, dass die Fehler Ihren Endbenutzern in der Produktion angezeigt werden, und dann zu versuchen, zu debuggen, wo das Problem liegt. ✨
Sie würden also **viele Fehler sehr früh** im Entwicklungszyklus erkennen, anstatt darauf warten zu müssen, dass die Fehler Ihren Endbenutzern in der Produktion angezeigt werden, und dann zu versuchen, zu debuggen, wo das Problem liegt. ✨

View File

@@ -1,33 +1,21 @@
# Handbuch für fortgeschrittene Benutzer
# Handbuch für fortgeschrittene Benutzer { #advanced-user-guide }
## Zusatzfunktionen
## Zusatzfunktionen { #additional-features }
Das Haupt-[Tutorial Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank} sollte ausreichen, um Ihnen einen Überblick über alle Hauptfunktionen von **FastAPI** zu geben.
In den nächsten Abschnitten sehen Sie weitere Optionen, Konfigurationen und zusätzliche Funktionen.
!!! tip "Tipp"
Die nächsten Abschnitte sind **nicht unbedingt „fortgeschritten“**.
/// tip | Tipp
Und es ist möglich, dass für Ihren Anwendungsfall die Lösung in einem davon liegt.
Die nächsten Abschnitte sind **nicht unbedingt „fortgeschritten“**.
## Lesen Sie zuerst das Tutorial
Und es ist möglich, dass für Ihren Anwendungsfall die Lösung in einem davon liegt.
///
## Das Tutorial zuerst lesen { #read-the-tutorial-first }
Sie können immer noch die meisten Funktionen in **FastAPI** mit den Kenntnissen aus dem Haupt-[Tutorial Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank} nutzen.
Und in den nächsten Abschnitten wird davon ausgegangen, dass Sie es bereits gelesen haben und dass Sie diese Haupt-Ideen kennen.
## Externe Kurse
Obwohl das [Tutorial Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank} und dieses **Handbuch für fortgeschrittene Benutzer** als geführtes Tutorial (wie ein Buch) geschrieben sind und für Sie ausreichen sollten, um **FastAPI zu lernen**, möchten Sie sie vielleicht durch zusätzliche Kurse ergänzen.
Oder Sie belegen einfach lieber andere Kurse, weil diese besser zu Ihrem Lernstil passen.
Einige Kursanbieter ✨ [**sponsern FastAPI**](../help-fastapi.md#den-autor-sponsern){.internal-link target=_blank} ✨, dies gewährleistet die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ökosystem**.
Und es zeigt deren wahres Engagement für FastAPI und seine **Gemeinschaft** (Sie), da diese Ihnen nicht nur eine **gute Lernerfahrung** bieten möchten, sondern auch sicherstellen möchten, dass Sie über ein **gutes und gesundes Framework verfügen **, FastAPI. 🙇
Vielleicht möchten Sie ihre Kurse ausprobieren:
* <a href="https://training.talkpython.fm/fastapi-courses" class="external-link" target="_blank">Talk Python Training</a>
* <a href="https://testdriven.io/courses/tdd-fastapi/" class="external-link" target="_blank">Test-Driven Development</a>
Und die nächsten Abschnitte setzen voraus, dass Sie es bereits gelesen haben und dass Sie diese Hauptideen kennen.

View File

@@ -1,4 +1,4 @@
# Fortgeschrittene Middleware
# Fortgeschrittene Middleware { #advanced-middleware }
Im Haupttutorial haben Sie gelesen, wie Sie Ihrer Anwendung [benutzerdefinierte Middleware](../tutorial/middleware.md){.internal-link target=_blank} hinzufügen können.
@@ -6,15 +6,15 @@ Und dann auch, wie man [CORS mittels der `CORSMiddleware`](../tutorial/cors.md){
In diesem Abschnitt werden wir sehen, wie man andere Middlewares verwendet.
## ASGI-Middleware hinzufügen
## ASGI-Middleware hinzufügen { #adding-asgi-middlewares }
Da **FastAPI** auf Starlette basiert und die <abbr title="Asynchronous Server Gateway Interface">ASGI</abbr>-Spezifikation implementiert, können Sie jede ASGI-Middleware verwenden.
Da **FastAPI** auf Starlette basiert und die <abbr title="Asynchrones Server-Gateway-Interface">ASGI</abbr>-Spezifikation implementiert, können Sie jede ASGI-Middleware verwenden.
Eine Middleware muss nicht speziell für FastAPI oder Starlette gemacht sein, um zu funktionieren, solange sie der ASGI-Spezifikation genügt.
Im Allgemeinen handelt es sich bei ASGI-Middleware um Klassen, die als erstes Argument eine ASGI-Anwendung erwarten.
In der Dokumentation für ASGI-Middlewares von Drittanbietern wird Ihnen wahrscheinlich gesagt, etwa Folgendes zu tun:
In der Dokumentation für ASGI-Middlewares von Drittanbietern wird Ihnen wahrscheinlich gesagt, dass Sie etwa Folgendes tun sollen:
```Python
from unicorn import UnicornMiddleware
@@ -39,61 +39,59 @@ app.add_middleware(UnicornMiddleware, some_config="rainbow")
`app.add_middleware()` empfängt eine Middleware-Klasse als erstes Argument und dann alle weiteren Argumente, die an die Middleware übergeben werden sollen.
## Integrierte Middleware
## Integrierte Middleware { #integrated-middlewares }
**FastAPI** enthält mehrere Middlewares für gängige Anwendungsfälle. Wir werden als Nächstes sehen, wie man sie verwendet.
!!! note "Technische Details"
Für die nächsten Beispiele könnten Sie auch `from starlette.middleware.something import SomethingMiddleware` verwenden.
/// note | Technische Details
**FastAPI** bietet mehrere Middlewares via `fastapi.middleware` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Middlewares kommen aber direkt von Starlette.
Für die nächsten Beispiele könnten Sie auch `from starlette.middleware.something import SomethingMiddleware` verwenden.
## `HTTPSRedirectMiddleware`
**FastAPI** bietet mehrere Middlewares via `fastapi.middleware` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Middlewares kommen aber direkt von Starlette.
Erzwingt, dass alle eingehenden Requests entweder `https` oder `wss` sein müssen.
///
## `HTTPSRedirectMiddleware` { #httpsredirectmiddleware }
Erzwingt, dass alle eingehenden <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Requests</abbr> entweder `https` oder `wss` sein müssen.
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`
## `TrustedHostMiddleware` { #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:
* `allowed_hosts` Eine Liste von Domain-Namen, die als Hostnamen zulässig sein sollten. Wildcard-Domains wie `*.example.com` werden unterstützt, um Subdomains zu matchen. Um jeden Hostnamen zu erlauben, verwenden Sie entweder `allowed_hosts=["*"]` oder lassen Sie diese Middleware weg.
* `www_redirect` Wenn auf True gesetzt, werden Requests an Nicht-www-Versionen der erlaubten Hosts zu deren www-Gegenstücken umgeleitet. Der Defaultwert ist `True`.
Wenn ein eingehender Request nicht korrekt validiert wird, wird eine 400“-Response gesendet.
Wenn ein eingehender Request nicht korrekt validiert wird, wird eine `400`-<abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr> gesendet.
## `GZipMiddleware`
## `GZipMiddleware` { #gzipmiddleware }
Verarbeitet GZip-Responses für alle Requests, die `"gzip"` im `Accept-Encoding`-Header enthalten.
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:
* `minimum_size` Antworten, die kleiner als diese Mindestgröße in Bytes sind, nicht per GZip komprimieren. Der Defaultwert ist `500`.
* `minimum_size` Responses, die kleiner als diese Mindestgröße in Bytes sind, nicht per GZip komprimieren. Der Defaultwert ist `500`.
* `compresslevel` Wird während der GZip-Kompression verwendet. Es ist ein Ganzzahlwert zwischen 1 und 9. Der Defaultwert ist `9`. Ein niedrigerer Wert resultiert in schnellerer Kompression, aber größeren Dateigrößen, während ein höherer Wert langsamere Kompression, aber kleinere Dateigrößen zur Folge hat.
## Andere Middlewares
## Andere Middlewares { #other-middlewares }
Es gibt viele andere ASGI-Middlewares.
Zum Beispiel:
* <a href="https://docs.sentry.io/platforms/python/guides/fastapi/" class="external-link" target="_blank">Sentry</a>
* <a href="https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py" class="external-link" target="_blank">Uvicorns `ProxyHeadersMiddleware`</a>
* <a href="https://github.com/florimondmanca/msgpack-asgi" class="external-link" target="_blank">MessagePack</a>
Um mehr über weitere verfügbare Middlewares herauszufinden, besuchen Sie <a href="https://www.starlette.io/middleware/" class="external-link" target="_blank">Starlettes Middleware-Dokumentation</a> und die <a href="https://github.com/florimondmanca/awesome-asgi" class="external-link" target="_blank">ASGI Awesome List</a>.
Um mehr über weitere verfügbare Middlewares herauszufinden, besuchen Sie <a href="https://www.starlette.dev/middleware/" class="external-link" target="_blank">Starlettes Middleware-Dokumentation</a> und die <a href="https://github.com/florimondmanca/awesome-asgi" class="external-link" target="_blank">ASGI Awesome List</a>.

View File

@@ -1,12 +1,12 @@
# OpenAPI-Callbacks
# OpenAPI-Callbacks { #openapi-callbacks }
Sie könnten eine API mit einer *Pfadoperation* erstellen, die einen Request an eine *externe API* auslösen könnte, welche von jemand anderem erstellt wurde (wahrscheinlich derselbe Entwickler, der Ihre API *verwenden* würde).
Sie könnten eine API mit einer *Pfadoperation* erstellen, die einen <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Request</abbr> an eine *externe API* auslösen könnte, welche von jemand anderem erstellt wurde (wahrscheinlich derselbe Entwickler, der Ihre API *verwenden* würde).
Der Vorgang, der stattfindet, wenn Ihre API-Anwendung die *externe API* aufruft, wird als „Callback“ („Rückruf“) bezeichnet. Denn die Software, die der externe Entwickler geschrieben hat, sendet einen Request an Ihre API und dann *ruft Ihre API zurück* (*calls back*) und sendet einen Request an eine *externe API* (die wahrscheinlich vom selben Entwickler erstellt wurde).
Der Vorgang, der stattfindet, wenn Ihre API-Anwendung die *externe API* aufruft, wird als <abbr title="„Rückruf“">„Callback“</abbr> bezeichnet. Denn die Software, die der externe Entwickler geschrieben hat, sendet einen Request an Ihre API und dann *ruft Ihre API zurück* (*calls back*) und sendet einen Request an eine *externe API* (die wahrscheinlich vom selben Entwickler erstellt wurde).
In diesem Fall möchten Sie möglicherweise dokumentieren, wie diese externe API aussehen *sollte*. Welche *Pfadoperation* sie haben sollte, welchen Body sie erwarten sollte, welche Response sie zurückgeben sollte, usw.
In diesem Fall möchten Sie möglicherweise dokumentieren, wie diese externe API aussehen *sollte*. Welche *Pfadoperation* sie haben sollte, welchen Body sie erwarten sollte, welche <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr> sie zurückgeben sollte, usw.
## Eine Anwendung mit Callbacks
## Eine Anwendung mit Callbacks { #an-app-with-callbacks }
Sehen wir uns das alles anhand eines Beispiels an.
@@ -16,14 +16,14 @@ Diese Rechnungen haben eine `id`, einen optionalen `title`, einen `customer` (Ku
Der Benutzer Ihrer API (ein externer Entwickler) erstellt mit einem POST-Request eine Rechnung in Ihrer API.
Dann wird Ihre API (beispielsweise):
Dann wird Ihre API (stellen wir uns vor):
* die Rechnung an einen Kunden des externen Entwicklers senden.
* das Geld einsammeln.
* eine Benachrichtigung an den API-Benutzer (den externen Entwickler) zurücksenden.
* Dies erfolgt durch Senden eines POST-Requests (von *Ihrer API*) an eine *externe API*, die von diesem externen Entwickler bereitgestellt wird (das ist der „Callback“).
## Die normale **FastAPI**-Anwendung
## Die normale **FastAPI**-Anwendung { #the-normal-fastapi-app }
Sehen wir uns zunächst an, wie die normale API-Anwendung aussehen würde, bevor wir den Callback hinzufügen.
@@ -31,16 +31,17 @@ 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"
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.
/// 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.
///
Das einzig Neue ist `callbacks=invoices_callback_router.routes` als Argument für den *Pfadoperation-Dekorator*. Wir werden als Nächstes sehen, was das ist.
## Dokumentation des Callbacks
## Dokumentation des Callbacks { #documenting-the-callback }
Der tatsächliche Callback-Code hängt stark von Ihrer eigenen API-Anwendung ab.
@@ -61,12 +62,15 @@ Diese Dokumentation wird in der Swagger-Oberfläche unter `/docs` in Ihrer API a
In diesem Beispiel wird nicht der Callback selbst implementiert (das könnte nur eine Codezeile sein), sondern nur der Dokumentationsteil.
!!! tip "Tipp"
Der eigentliche Callback ist nur ein HTTP-Request.
/// tip | Tipp
Wenn Sie den Callback selbst implementieren, können Sie beispielsweise <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a> oder <a href="https://requests.readthedocs.io/" class="external-link" target="_blank">Requests</a> verwenden.
Der eigentliche Callback ist nur ein HTTP-Request.
## Schreiben des Codes, der den Callback dokumentiert
Wenn Sie den Callback selbst implementieren, können Sie beispielsweise <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a> oder <a href="https://requests.readthedocs.io/" class="external-link" target="_blank">Requests</a> verwenden.
///
## Schreiben des Codes, der den Callback dokumentiert { #write-the-callback-documentation-code }
Dieser Code wird nicht in Ihrer Anwendung ausgeführt, wir benötigen ihn nur, um zu *dokumentieren*, wie diese *externe API* aussehen soll.
@@ -74,20 +78,21 @@ Sie wissen jedoch bereits, wie Sie mit **FastAPI** ganz einfach eine automatisch
Daher werden wir dasselbe Wissen nutzen, um zu dokumentieren, wie die *externe API* aussehen sollte ... indem wir die *Pfadoperation(en)* erstellen, welche die externe API implementieren soll (die, welche Ihre API aufruft).
!!! tip "Tipp"
Wenn Sie den Code zum Dokumentieren eines Callbacks schreiben, kann es hilfreich sein, sich vorzustellen, dass Sie dieser *externe Entwickler* sind. Und dass Sie derzeit die *externe API* implementieren, nicht *Ihre API*.
/// tip | Tipp
Wenn Sie diese Sichtweise (des *externen Entwicklers*) vorübergehend übernehmen, wird es offensichtlicher, wo die Parameter, das Pydantic-Modell für den Body, die Response, usw. für diese *externe API* hingehören.
Wenn Sie 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*.
### Einen Callback-`APIRouter` erstellen
Wenn Sie diese Sichtweise (des *externen Entwicklers*) vorübergehend übernehmen, wird es offensichtlicher, wo die Parameter, das Pydantic-Modell für den Body, die Response, usw. für diese *externe API* hingehören.
///
### Einen Callback-`APIRouter` erstellen { #create-a-callback-apirouter }
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
### Die Callback-*Pfadoperation* erstellen { #create-the-callback-path-operation }
Um die Callback-*Pfadoperation* zu erstellen, verwenden Sie denselben `APIRouter`, den Sie oben erstellt haben.
@@ -96,16 +101,14 @@ 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*:
* Es muss kein tatsächlicher Code vorhanden sein, da Ihre Anwendung diesen Code niemals aufruft. Sie wird nur zur Dokumentation der *externen API* verwendet. Die Funktion könnte also einfach `pass` enthalten.
* Der *Pfad* kann einen <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression" class="external-link" target="_blank">OpenAPI-3-Ausdruck</a> enthalten (mehr dazu weiter unten), wo er Variablen mit Parametern und Teilen des ursprünglichen Requests verwenden kann, der an *Ihre API* gesendet wurde.
### Der Callback-Pfadausdruck
### Der Callback-Pfadausdruck { #the-callback-path-expression }
Der Callback-*Pfad* kann einen <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression" class="external-link" target="_blank">OpenAPI-3-Ausdruck</a> enthalten, welcher Teile des ursprünglichen Requests enthalten kann, der an *Ihre API* gesendet wurde.
@@ -154,25 +157,29 @@ und sie würde eine Response von dieser *externen API* mit einem JSON-Body wie d
}
```
!!! tip "Tipp"
Beachten Sie, dass die verwendete Callback-URL die URL enthält, die als Query-Parameter in `callback_url` (`https://www.external.org/events`) empfangen wurde, und auch die Rechnungs-`id` aus dem JSON-Body (`2expen51ve`).
/// tip | Tipp
### Den Callback-Router hinzufügen
Beachten Sie, dass die verwendete Callback-URL die URL enthält, die als Query-Parameter in `callback_url` (`https://www.external.org/events`) empfangen wurde, und auch die Rechnungs-`id` aus dem JSON-Body (`2expen51ve`).
///
### Den Callback-Router hinzufügen { #add-the-callback-router }
An diesem Punkt haben Sie die benötigte(n) *Callback-Pfadoperation(en)* (diejenige(n), die der *externe Entwickler* in der *externen API* implementieren sollte) im Callback-Router, den Sie oben erstellt haben.
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"
Beachten Sie, dass Sie nicht den Router selbst (`invoices_callback_router`) an `callback=` übergeben, sondern das Attribut `.routes`, wie in `invoices_callback_router.routes`.
/// tip | Tipp
### Es in der Dokumentation ansehen
Beachten Sie, dass Sie nicht den Router selbst (`invoices_callback_router`) an `callback=` übergeben, sondern das Attribut `.routes`, wie in `invoices_callback_router.routes`.
Jetzt können Sie Ihre Anwendung mit Uvicorn starten und auf <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> gehen.
///
### Es in der Dokumentation testen { #check-the-docs }
Jetzt können Sie Ihre Anwendung starten und auf <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> gehen.
Sie sehen Ihre Dokumentation, einschließlich eines Abschnitts „Callbacks“ für Ihre *Pfadoperation*, der zeigt, wie die *externe API* aussehen sollte:

View File

@@ -1,50 +1,54 @@
# OpenAPI-Webhooks
# OpenAPI Webhooks { #openapi-webhooks }
Es gibt Fälle, in denen Sie Ihren API-Benutzern mitteilen möchten, dass Ihre Anwendung mit einigen Daten *deren* Anwendung aufrufen (ein Request senden) könnte, normalerweise um über ein bestimmtes **Event** zu **benachrichtigen**.
Es gibt Fälle, in denen Sie Ihren API-**Benutzern** mitteilen möchten, dass Ihre App *deren* App mit einigen Daten aufrufen (einen <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Request</abbr> senden) könnte, normalerweise um über ein bestimmtes **Event** zu **benachrichtigen**.
Das bedeutet, dass anstelle des normalen Prozesses, bei dem Benutzer Requests an Ihre API senden, **Ihre API** (oder Ihre Anwendung) **Requests an deren System** (an deren API, deren Anwendung) senden könnte.
Das bedeutet, dass anstelle des normalen Prozesses, bei dem Ihre Benutzer Requests an Ihre API senden, **Ihre API** (oder Ihre App) **Requests an deren System** (an deren API, deren App) senden könnte.
Das wird normalerweise als **Webhook** bezeichnet.
Das wird normalerweise als **Web<abbr title="Haken, Einhängepunkt">hook</abbr>** bezeichnet.
## Webhooks-Schritte
## Webhooks-Schritte { #webhooks-steps }
Der Prozess besteht normalerweise darin, dass **Sie in Ihrem Code definieren**, welche Nachricht Sie senden möchten, den **Body des Requests**.
Sie definieren auch auf irgendeine Weise, zu welchen **Momenten** Ihre Anwendung diese Requests oder Events sendet.
Sie definieren auch auf irgendeine Weise, in welchen **Momenten** Ihre App diese Requests oder Events senden wird.
Und **Ihre Benutzer** definieren auf irgendeine Weise (zum Beispiel irgendwo in einem Web-Dashboard) die **URL**, an die Ihre Anwendung diese Requests senden soll.
Und **Ihre Benutzer** definieren auf irgendeine Weise (zum Beispiel irgendwo in einem Web-<abbr title="Benutzeroberfläche für das Visualisieren und Managen von Daten">Dashboard</abbr>) die **URL**, an die Ihre App diese Requests senden soll.
Die gesamte **Logik** zur Registrierung der URLs für Webhooks und der Code zum tatsächlichen Senden dieser Requests liegt bei Ihnen. Sie schreiben es so, wie Sie möchten, in **Ihrem eigenen Code**.
## Webhooks mit **FastAPI** und OpenAPI dokumentieren
## Webhooks mit **FastAPI** und OpenAPI dokumentieren { #documenting-webhooks-with-fastapi-and-openapi }
Mit **FastAPI** können Sie mithilfe von OpenAPI die Namen dieser Webhooks, die Arten von HTTP-Operationen, die Ihre Anwendung senden kann (z. B. `POST`, `PUT`, usw.) und die Request**bodys** definieren, die Ihre Anwendung senden würde.
Mit **FastAPI**, mithilfe von OpenAPI, können Sie die Namen dieser Webhooks, die Arten von HTTP-Operationen, die Ihre App senden kann (z. B. `POST`, `PUT`, usw.) und die Request**bodys** definieren, die Ihre App senden würde.
Dies kann es Ihren Benutzern viel einfacher machen, **deren APIs zu implementieren**, um Ihre **Webhook**-Requests zu empfangen. Möglicherweise können diese sogar einen Teil des eigenem API-Codes automatisch generieren.
Dies kann es Ihren Benutzern viel einfacher machen, **deren APIs zu implementieren**, um Ihre **Webhook**-Requests zu empfangen. Möglicherweise können diese sogar einen Teil ihres eigenen API-Codes automatisch generieren.
!!! info
Webhooks sind in OpenAPI 3.1.0 und höher verfügbar und werden von FastAPI `0.99.0` und höher unterstützt.
/// info | Info
## Eine Anwendung mit Webhooks
Webhooks sind in OpenAPI 3.1.0 und höher verfügbar und werden von FastAPI `0.99.0` und höher unterstützt.
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!}
```
## Eine App mit Webhooks { #an-app-with-webhooks }
Wenn Sie eine **FastAPI**-Anwendung erstellen, gibt es ein `webhooks`-Attribut, das Sie verwenden können, um *Webhooks* zu definieren, genauso wie Sie *Pfadoperationen* definieren würden, zum Beispiel mit `@app.webhooks.post()`.
{* ../../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**.
!!! info
Das `app.webhooks`-Objekt ist eigentlich nur ein `APIRouter`, derselbe Typ, den Sie verwenden würden, wenn Sie Ihre Anwendung mit mehreren Dateien strukturieren.
/// info | Info
Beachten Sie, dass Sie bei Webhooks tatsächlich keinen *Pfad* (wie `/items/`) deklarieren, sondern dass der Text, den Sie dort übergeben, lediglich eine **Kennzeichnung** des Webhooks (der Name des Events) ist. Zum Beispiel ist in `@app.webhooks.post("new-subscription")` der Webhook-Name `new-subscription`.
Das `app.webhooks`-Objekt ist eigentlich nur ein `APIRouter`, derselbe Typ, den Sie verwenden würden, wenn Sie Ihre App mit mehreren Dateien strukturieren.
Das liegt daran, dass erwartet wird, dass **Ihre Benutzer** den tatsächlichen **URL-Pfad**, an dem diese den Webhook-Request empfangen möchten, auf andere Weise definieren (z. B. über ein Web-Dashboard).
///
### Es in der Dokumentation ansehen
Beachten Sie, dass Sie bei Webhooks tatsächlich keinen *Pfad* (wie `/items/`) deklarieren, der Text, den Sie dort übergeben, ist lediglich eine **Kennzeichnung** des Webhooks (der Name des Events). Zum Beispiel ist in `@app.webhooks.post("new-subscription")` der Webhook-Name `new-subscription`.
Jetzt können Sie Ihre Anwendung mit Uvicorn starten und auf <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> gehen.
Das liegt daran, dass erwartet wird, dass **Ihre Benutzer** den tatsächlichen **URL-Pfad**, an dem sie den Webhook-Request empfangen möchten, auf andere Weise definieren (z. B. über ein Web-Dashboard).
### Die Dokumentation testen { #check-the-docs }
Jetzt können Sie Ihre App starten und auf <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> gehen.
Sie werden sehen, dass Ihre Dokumentation die normalen *Pfadoperationen* und jetzt auch einige **Webhooks** enthält:

View File

@@ -1,45 +1,48 @@
# Fortgeschrittene Konfiguration der Pfadoperation
# Fortgeschrittene Konfiguration der Pfadoperation { #path-operation-advanced-configuration }
## OpenAPI operationId
## OpenAPI operationId { #openapi-operationid }
!!! warning "Achtung"
Wenn Sie kein „Experte“ für OpenAPI sind, brauchen Sie dies wahrscheinlich nicht.
/// warning | Achtung
Wenn Sie kein „Experte“ für OpenAPI sind, brauchen Sie dies wahrscheinlich nicht.
///
Mit dem Parameter `operation_id` können Sie die OpenAPI `operationId` festlegen, die in Ihrer *Pfadoperation* verwendet werden soll.
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
### Verwendung des Namens der *Pfadoperation-Funktion* als operationId { #using-the-path-operation-function-name-as-the-operationid }
Wenn Sie die Funktionsnamen Ihrer API als `operationId`s verwenden möchten, können Sie über alle iterieren und die `operation_id` jeder *Pfadoperation* mit deren `APIRoute.name` überschreiben.
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"
Wenn Sie `app.openapi()` manuell aufrufen, sollten Sie vorher die `operationId`s aktualisiert haben.
/// tip | Tipp
!!! warning "Achtung"
Wenn Sie dies tun, müssen Sie sicherstellen, dass jede Ihrer *Pfadoperation-Funktionen* einen eindeutigen Namen hat.
Wenn Sie `app.openapi()` manuell aufrufen, sollten Sie vorher die `operationId`s aktualisiert haben.
Auch wenn diese sich in unterschiedlichen Modulen (Python-Dateien) befinden.
///
## Von OpenAPI ausschließen
/// warning | Achtung
Wenn Sie dies tun, müssen Sie sicherstellen, dass jede Ihrer *Pfadoperation-Funktionen* einen eindeutigen Namen hat.
Auch wenn diese sich in unterschiedlichen Modulen (Python-Dateien) befinden.
///
## Von OpenAPI ausschließen { #exclude-from-openapi }
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
## Fortgeschrittene Beschreibung mittels Docstring { #advanced-description-from-docstring }
Sie können die verwendeten Zeilen aus dem Docstring einer *Pfadoperation-Funktion* einschränken, die für OpenAPI verwendet werden.
@@ -47,26 +50,27 @@ 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
## Zusätzliche Responses { #additional-responses }
Sie haben wahrscheinlich gesehen, wie man das `response_model` und den `status_code` für eine *Pfadoperation* deklariert.
Das definiert die Metadaten der Haupt-Response einer *Pfadoperation*.
Das definiert die Metadaten der Haupt-<abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr> einer *Pfadoperation*.
Sie können auch zusätzliche Responses mit deren Modellen, Statuscodes usw. deklarieren.
Es gibt hier in der Dokumentation ein ganzes Kapitel darüber, Sie können es unter [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank} lesen.
## OpenAPI-Extra
## OpenAPI-Extra { #openapi-extra }
Wenn Sie in Ihrer Anwendung eine *Pfadoperation* deklarieren, generiert **FastAPI** automatisch die relevanten Metadaten dieser *Pfadoperation*, die in das OpenAPI-Schema aufgenommen werden sollen.
!!! note "Technische Details"
In der OpenAPI-Spezifikation wird das <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.
/// 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.
///
Es hat alle Informationen zur *Pfadoperation* und wird zur Erstellung der automatischen Dokumentation verwendet.
@@ -74,20 +78,21 @@ Es enthält `tags`, `parameters`, `requestBody`, `responses`, usw.
Dieses *Pfadoperation*-spezifische OpenAPI-Schema wird normalerweise automatisch von **FastAPI** generiert, Sie können es aber auch erweitern.
!!! tip "Tipp"
Dies ist ein Low-Level Erweiterungspunkt.
/// tip | Tipp
Wenn Sie nur zusätzliche Responses deklarieren müssen, können Sie dies bequemer mit [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank} tun.
Dies ist ein Low-Level-Erweiterungspunkt.
Wenn Sie nur zusätzliche Responses deklarieren müssen, können Sie dies bequemer mit [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank} tun.
///
Sie können das OpenAPI-Schema für eine *Pfadoperation* erweitern, indem Sie den Parameter `openapi_extra` verwenden.
### OpenAPI-Erweiterungen
### OpenAPI-Erweiterungen { #openapi-extensions }
Dieses `openapi_extra` kann beispielsweise hilfreich sein, um <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions" class="external-link" target="_blank">OpenAPI-Erweiterungen</a> zu deklarieren:
Dieses `openapi_extra` kann beispielsweise hilfreich sein, um [OpenAPI-Erweiterungen](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions) 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.
@@ -124,46 +129,47 @@ Und wenn Sie die resultierende OpenAPI sehen (unter `/openapi.json` in Ihrer API
}
```
### Benutzerdefiniertes OpenAPI-*Pfadoperation*-Schema
### Benutzerdefiniertes OpenAPI-*Pfadoperation*-Schema { #custom-openapi-path-operation-schema }
Das Dictionary in `openapi_extra` wird mit dem automatisch generierten OpenAPI-Schema für die *Pfadoperation* zusammengeführt (mittels Deep Merge).
Das <abbr title="Dictionary Zuordnungstabelle: In anderen Sprachen auch Hash, Map, Objekt, Assoziatives Array genannt">Dictionary</abbr> in `openapi_extra` wird mit dem automatisch generierten OpenAPI-Schema für die *Pfadoperation* zusammengeführt (mittels Deep Merge).
Sie können dem automatisch generierten Schema also zusätzliche Daten hinzufügen.
Sie könnten sich beispielsweise dafür entscheiden, den Request mit Ihrem eigenen Code zu lesen und zu validieren, ohne die automatischen Funktionen von FastAPI mit Pydantic zu verwenden, aber Sie könnten den Request trotzdem im OpenAPI-Schema definieren wollen.
Sie könnten sich beispielsweise dafür entscheiden, den <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Request</abbr> mit Ihrem eigenen Code zu lesen und zu validieren, ohne die automatischen Funktionen von FastAPI mit Pydantic zu verwenden, aber Sie könnten den Request trotzdem im OpenAPI-Schema definieren wollen.
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[19:36, 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.
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.
Dennoch können wir das zu erwartende Schema für den Requestbody deklarieren.
### Benutzerdefinierter OpenAPI-Content-Type
### Benutzerdefinierter OpenAPI-Content-Type { #custom-openapi-content-type }
Mit demselben Trick könnten Sie ein Pydantic-Modell verwenden, um das JSON-Schema zu definieren, das dann im benutzerdefinierten Abschnitt des OpenAPI-Schemas für die *Pfadoperation* enthalten ist.
Und Sie könnten dies auch tun, wenn der Datentyp in der Anfrage nicht JSON ist.
Und Sie könnten dies auch tun, wenn der Datentyp im Request nicht JSON ist.
In der folgenden Anwendung verwenden wir beispielsweise weder die integrierte Funktionalität von FastAPI zum Extrahieren des JSON-Schemas aus Pydantic-Modellen noch die automatische Validierung für JSON. Tatsächlich deklarieren wir den Request-Content-Type als YAML und nicht als JSON:
=== "Pydantic v2"
//// tab | Pydantic v2
```Python hl_lines="17-22 24"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!}
```
{* ../../docs_src/path_operation_advanced_configuration/tutorial007.py hl[17:22, 24] *}
=== "Pydantic v1"
////
```Python hl_lines="17-22 24"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!}
```
//// tab | Pydantic v1
!!! info
In Pydantic Version 1 hieß die Methode zum Abrufen des JSON-Schemas für ein Modell `Item.schema()`, in Pydantic Version 2 heißt die Methode `Item.model_json_schema()`.
{* ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py hl[17:22, 24] *}
////
/// info | Info
In Pydantic Version 1 hieß die Methode zum Abrufen des JSON-Schemas für ein Modell `Item.schema()`, in Pydantic Version 2 heißt die Methode `Item.model_json_schema()`.
///
Obwohl wir nicht die standardmäßig integrierte Funktionalität verwenden, verwenden wir dennoch ein Pydantic-Modell, um das JSON-Schema für die Daten, die wir in YAML empfangen möchten, manuell zu generieren.
@@ -171,22 +177,28 @@ Dann verwenden wir den Request direkt und extrahieren den Body als `bytes`. Das
Und dann parsen wir in unserem Code diesen YAML-Inhalt direkt und verwenden dann wieder dasselbe Pydantic-Modell, um den YAML-Inhalt zu validieren:
=== "Pydantic v2"
//// tab | Pydantic v2
```Python hl_lines="26-33"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!}
```
{* ../../docs_src/path_operation_advanced_configuration/tutorial007.py hl[26:33] *}
=== "Pydantic v1"
////
```Python hl_lines="26-33"
{!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!}
```
//// tab | Pydantic v1
!!! info
In Pydantic Version 1 war die Methode zum Parsen und Validieren eines Objekts `Item.parse_obj()`, in Pydantic Version 2 heißt die Methode `Item.model_validate()`.
{* ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py hl[26:33] *}
!!! tip "Tipp"
Hier verwenden wir dasselbe Pydantic-Modell wieder.
////
Aber genauso hätten wir es auch auf andere Weise validieren können.
/// info | Info
In Pydantic Version 1 war die Methode zum Parsen und Validieren eines Objekts `Item.parse_obj()`, in Pydantic Version 2 heißt die Methode `Item.model_validate()`.
///
/// tip | Tipp
Hier verwenden wir dasselbe Pydantic-Modell wieder.
Aber genauso hätten wir es auch auf andere Weise validieren können.
///

View File

@@ -1,33 +1,31 @@
# Response Statuscode ändern
# Response Statuscode ändern { #response-change-status-code }
Sie haben wahrscheinlich schon vorher gelesen, dass Sie einen Standard-[Response-Statuscode](../tutorial/response-status-code.md){.internal-link target=_blank} festlegen können.
Sie haben wahrscheinlich schon vorher gelesen, dass Sie einen Default-[Response-Statuscode](../tutorial/response-status-code.md){.internal-link target=_blank} festlegen können.
In manchen Fällen müssen Sie jedoch einen anderen als den Standard-Statuscode zurückgeben.
In manchen Fällen müssen Sie jedoch einen anderen als den Default-Statuscode zurückgeben.
## Anwendungsfall
## Anwendungsfall { #use-case }
Stellen Sie sich zum Beispiel vor, Sie möchten standardmäßig den HTTP-Statuscode „OK“ `200` zurückgeben.
Wenn die Daten jedoch nicht vorhanden waren, möchten Sie diese erstellen und den HTTP-Statuscode „CREATED“ `201` zurückgeben.
Wenn die Daten jedoch nicht vorhanden sind, möchten Sie diese erstellen und den HTTP-Statuscode „CREATED“ `201` zurückgeben.
Sie möchten aber dennoch in der Lage sein, die von Ihnen zurückgegebenen Daten mit einem `response_model` zu filtern und zu konvertieren.
In diesen Fällen können Sie einen `Response`-Parameter verwenden.
## Einen `Response`-Parameter verwenden
## Einen `Response`-Parameter verwenden { #use-a-response-parameter }
Sie können einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion* deklarieren (wie Sie es auch für Cookies und Header tun können).
Anschließend können Sie den `status_code` in diesem *vorübergehenden* Response-Objekt festlegen.
Anschließend können Sie den `status_code` in diesem *vorübergehenden* <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>-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.).
Und dann können Sie jedes benötigte Objekt zurückgeben, wie Sie es normalerweise tun würden (ein `dict`, ein Datenbankmodell usw.).
Und wenn Sie ein `response_model` deklariert haben, wird es weiterhin zum Filtern und Konvertieren des von Ihnen zurückgegebenen Objekts verwendet.
**FastAPI** verwendet diese *vorübergehende* Response, um den Statuscode (auch Cookies und Header) zu extrahieren und fügt diese in die endgültige Response ein, die den von Ihnen zurückgegebenen Wert enthält, gefiltert nach einem beliebigen `response_model`.
Sie können den Parameter `Response` auch in Abhängigkeiten deklarieren und den Statuscode darin festlegen. Bedenken Sie jedoch, dass der gewinnt, welcher zuletzt gesetzt wird.
Sie können den Parameter `Response` auch in Abhängigkeiten deklarieren und den Statuscode darin festlegen. Bedenken Sie jedoch, dass der zuletzt gesetzte gewinnt.

View File

@@ -1,14 +1,12 @@
# Response-Cookies
# Response-Cookies { #response-cookies }
## Einen `Response`-Parameter verwenden
## Einen `Response`-Parameter verwenden { #use-a-response-parameter }
Sie können einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion* deklarieren.
Und dann können Sie Cookies in diesem *vorübergehenden* Response-Objekt setzen.
Und dann können Sie Cookies in diesem *vorübergehenden* <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>-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.).
@@ -18,7 +16,7 @@ Und wenn Sie ein `response_model` deklariert haben, wird es weiterhin zum Filter
Sie können den `Response`-Parameter auch in Abhängigkeiten deklarieren und darin Cookies (und Header) setzen.
## Eine `Response` direkt zurückgeben
## Eine `Response` direkt zurückgeben { #return-a-response-directly }
Sie können Cookies auch erstellen, wenn Sie eine `Response` direkt in Ihrem Code zurückgeben.
@@ -26,24 +24,28 @@ 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"
Beachten Sie, dass, wenn Sie eine Response direkt zurückgeben, anstatt den `Response`-Parameter zu verwenden, FastAPI diese direkt zurückgibt.
/// tip | Tipp
Sie müssen also sicherstellen, dass Ihre Daten vom richtigen Typ sind. Z. B. sollten diese mit JSON kompatibel sein, wenn Sie eine `JSONResponse` zurückgeben.
Beachten Sie, dass, wenn Sie eine Response direkt zurückgeben, anstatt den `Response`-Parameter zu verwenden, FastAPI diese direkt zurückgibt.
Und auch, dass Sie keine Daten senden, die durch ein `response_model` hätten gefiltert werden sollen.
Sie müssen also sicherstellen, dass Ihre Daten vom richtigen Typ sind. Z. B. sollten diese mit JSON kompatibel sein, wenn Sie eine `JSONResponse` zurückgeben.
### Mehr Informationen
Und auch, dass Sie keine Daten senden, die durch ein `response_model` hätten gefiltert werden sollen.
!!! note "Technische Details"
Sie können auch `from starlette.responses import Response` oder `from starlette.responses import JSONResponse` verwenden.
///
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
### Mehr Informationen { #more-info }
Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird, stellt **FastAPI** diese auch unter `fastapi.Response` bereit.
/// note | Technische Details
Um alle verfügbaren Parameter und Optionen anzuzeigen, sehen Sie sich deren <a href="https://www.starlette.io/responses/#set-cookie" class="external-link" target="_blank">Dokumentation in Starlette</a> an.
Sie können auch `from starlette.responses import Response` oder `from starlette.responses import JSONResponse` verwenden.
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird, stellt **FastAPI** diese auch unter `fastapi.Response` bereit.
///
Um alle verfügbaren Parameter und Optionen anzuzeigen, sehen Sie sich deren <a href="https://www.starlette.dev/responses/#set-cookie" class="external-link" target="_blank">Dokumentation in Starlette</a> an.

View File

@@ -1,21 +1,24 @@
# Eine Response direkt zurückgeben
# Eine Response direkt zurückgeben { #return-a-response-directly }
Wenn Sie eine **FastAPI** *Pfadoperation* erstellen, können Sie normalerweise beliebige Daten davon zurückgeben: ein `dict`, eine `list`e, ein Pydantic-Modell, ein Datenbankmodell, usw.
Wenn Sie eine **FastAPI** *Pfadoperation* erstellen, können Sie normalerweise beliebige Daten davon zurückgeben: ein `dict`, eine `list`, ein Pydantic-Modell, ein Datenbankmodell, usw.
Standardmäßig konvertiert **FastAPI** diesen Rückgabewert automatisch nach JSON, mithilfe des `jsonable_encoder`, der in [JSON-kompatibler Encoder](../tutorial/encoder.md){.internal-link target=_blank} erläutert wird.
Dann würde es hinter den Kulissen diese JSON-kompatiblen Daten (z. B. ein `dict`) in eine `JSONResponse` einfügen, die zum Senden der Response an den Client verwendet würde.
Dann würde es hinter den Kulissen diese JSON-kompatiblen Daten (z. B. ein `dict`) in eine `JSONResponse` einfügen, die zum Senden der <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr> an den Client verwendet wird.
Sie können jedoch direkt eine `JSONResponse` von Ihren *Pfadoperationen* zurückgeben.
Das kann beispielsweise nützlich sein, um benutzerdefinierte Header oder Cookies zurückzugeben.
## Eine `Response` zurückgeben
## Eine `Response` zurückgeben { #return-a-response }
Tatsächlich können Sie jede `Response` oder jede Unterklasse davon zurückgeben.
!!! tip "Tipp"
`JSONResponse` selbst ist eine Unterklasse von `Response`.
/// tip | Tipp
`JSONResponse` selbst ist eine Unterklasse von `Response`.
///
Und wenn Sie eine `Response` zurückgeben, wird **FastAPI** diese direkt weiterleiten.
@@ -23,7 +26,7 @@ Es wird keine Datenkonvertierung mit Pydantic-Modellen durchführen, es wird den
Dadurch haben Sie viel Flexibilität. Sie können jeden Datentyp zurückgeben, jede Datendeklaration oder -validierung überschreiben, usw.
## Verwendung des `jsonable_encoder` in einer `Response`
## Verwendung des `jsonable_encoder` in einer `Response` { #using-the-jsonable-encoder-in-a-response }
Da **FastAPI** keine Änderungen an einer von Ihnen zurückgegebenen `Response` vornimmt, müssen Sie sicherstellen, dass deren Inhalt dafür bereit ist.
@@ -31,16 +34,17 @@ Sie können beispielsweise kein Pydantic-Modell in eine `JSONResponse` einfügen
In diesen Fällen können Sie den `jsonable_encoder` verwenden, um Ihre Daten zu konvertieren, bevor Sie sie an eine Response übergeben:
```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"
Sie können auch `from starlette.responses import JSONResponse` verwenden.
/// note | Technische Details
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
Sie könnten auch `from starlette.responses import JSONResponse` verwenden.
## Eine benutzerdefinierte `Response` zurückgeben
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
///
## Eine benutzerdefinierte `Response` zurückgeben { #returning-a-custom-response }
Das obige Beispiel zeigt alle Teile, die Sie benötigen, ist aber noch nicht sehr nützlich, da Sie das `item` einfach direkt hätten zurückgeben können, und **FastAPI** würde es für Sie in eine `JSONResponse` einfügen, es in ein `dict` konvertieren, usw. All das standardmäßig.
@@ -50,11 +54,9 @@ 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
## Anmerkungen { #notes }
Wenn Sie eine `Response` direkt zurücksenden, werden deren Daten weder validiert, konvertiert (serialisiert), noch automatisch dokumentiert.

View File

@@ -1,14 +1,12 @@
# Response-Header
# Response-Header { #response-headers }
## Verwenden Sie einen `Response`-Parameter
## Einen `Response`-Parameter verwenden { #use-a-response-parameter }
Sie können einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion* deklarieren (wie Sie es auch für Cookies tun können).
Und dann können Sie Header in diesem *vorübergehenden* Response-Objekt festlegen.
Und dann können Sie Header in diesem *vorübergehenden* <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>-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.).
@@ -18,25 +16,26 @@ Und wenn Sie ein `response_model` deklariert haben, wird es weiterhin zum Filter
Sie können den Parameter `Response` auch in Abhängigkeiten deklarieren und darin Header (und Cookies) festlegen.
## Eine `Response` direkt zurückgeben
## Eine `Response` direkt zurückgeben { #return-a-response-directly }
Sie können auch Header hinzufügen, wenn Sie eine `Response` direkt zurückgeben.
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"
Sie können auch `from starlette.responses import Response` oder `from starlette.responses import JSONResponse` verwenden.
/// note | Technische Details
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
Sie können auch `from starlette.responses import Response` oder `from starlette.responses import JSONResponse` verwenden.
Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird, stellt **FastAPI** diese auch unter `fastapi.Response` bereit.
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
## Benutzerdefinierte Header
Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird, stellt **FastAPI** diese auch unter `fastapi.Response` bereit.
Beachten Sie, dass benutzerdefinierte proprietäre Header <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">mittels des Präfix 'X-'</a> hinzugefügt werden können.
///
Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen können soll, müssen Sie diese zu Ihren CORS-Konfigurationen hinzufügen (weitere Informationen finden Sie unter [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), unter Verwendung des Parameters `expose_headers`, dokumentiert in <a href="https://www.starlette.io/middleware/#corsmiddleware" class="external-link" target="_blank">Starlettes CORS-Dokumentation</a>.
## Benutzerdefinierte Header { #custom-headers }
Beachten Sie, dass benutzerdefinierte proprietäre Header <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">mittels des Präfix `X-`</a> hinzugefügt werden können.
Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen können soll, müssen Sie diese zu Ihrer CORS-Konfiguration hinzufügen (weitere Informationen finden Sie unter [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), unter Verwendung des Parameters `expose_headers`, dokumentiert in <a href="https://www.starlette.dev/middleware/#corsmiddleware" class="external-link" target="_blank">Starlettes CORS-Dokumentation</a>.

View File

@@ -1,4 +1,4 @@
# HTTP Basic Auth
# HTTP Basic Auth { #http-basic-auth }
Für die einfachsten Fälle können Sie <abbr title="HTTP-Basisauthentifizierung">HTTP Basic Auth</abbr> verwenden.
@@ -6,13 +6,13 @@ Bei HTTP Basic Auth erwartet die Anwendung einen Header, der einen Benutzernamen
Wenn sie diesen nicht empfängt, gibt sie den HTTP-Error 401 „Unauthorized“ zurück.
Und gibt einen Header `WWW-Authenticate` mit dem Wert `Basic` und einem optionalen `realm`-Parameter („Bereich“) zurück.
Und gibt einen Header `WWW-Authenticate` mit dem Wert `Basic` und einem optionalen <abbr title="Bereich">`realm`</abbr>-Parameter zurück.
Dadurch wird der Browser angewiesen, die integrierte Eingabeaufforderung für einen Benutzernamen und ein Passwort anzuzeigen.
Wenn Sie dann den Benutzernamen und das Passwort eingeben, sendet der Browser diese automatisch im Header.
## Einfaches HTTP Basic Auth
## Einfaches HTTP Basic Auth { #simple-http-basic-auth }
* Importieren Sie `HTTPBasic` und `HTTPBasicCredentials`.
* Erstellen Sie mit `HTTPBasic` ein „`security`-Schema“.
@@ -20,32 +20,13 @@ Wenn Sie dann den Benutzernamen und das Passwort eingeben, sendet der Browser di
* Diese gibt ein Objekt vom Typ `HTTPBasicCredentials` zurück:
* Es enthält den gesendeten `username` und das gesendete `password`.
=== "Python 3.9+"
```Python hl_lines="4 8 12"
{!> ../../../docs_src/security/tutorial006_an_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="2 7 11"
{!> ../../../docs_src/security/tutorial006_an.py!}
```
=== "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">
## Den Benutzernamen überprüfen
## Den Benutzernamen überprüfen { #check-the-username }
Hier ist ein vollständigeres Beispiel.
@@ -59,26 +40,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.
=== "Python 3.9+"
```Python hl_lines="1 12-24"
{!> ../../../docs_src/security/tutorial007_an_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="1 12-24"
{!> ../../../docs_src/security/tutorial007_an.py!}
```
=== "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:
@@ -90,13 +52,13 @@ if not (credentials.username == "stanleyjobson") or not (credentials.password ==
Aber durch die Verwendung von `secrets.compare_digest()` ist dieser Code sicher vor einer Art von Angriffen, die „Timing-Angriffe“ genannt werden.
### Timing-Angriffe
### Timing-Angriffe { #timing-attacks }
Aber was ist ein „Timing-Angriff“?
Stellen wir uns vor, dass einige Angreifer versuchen, den Benutzernamen und das Passwort zu erraten.
Und sie senden eine Anfrage mit dem Benutzernamen `johndoe` und dem Passwort `love123`.
Und sie senden einen <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Request</abbr> mit dem Benutzernamen `johndoe` und dem Passwort `love123`.
Dann würde der Python-Code in Ihrer Anwendung etwa so aussehen:
@@ -116,21 +78,21 @@ if "stanleyjobsox" == "stanleyjobson" and "love123" == "swordfish":
...
```
Python muss das gesamte `stanleyjobso` in `stanleyjobsox` und `stanleyjobson` vergleichen, bevor es erkennt, dass beide Zeichenfolgen nicht gleich sind. Daher wird es einige zusätzliche Mikrosekunden dauern, bis die Antwort „Incorrect username or password“ erfolgt.
Python muss das gesamte `stanleyjobso` in `stanleyjobsox` und `stanleyjobson` vergleichen, bevor es erkennt, dass beide Zeichenfolgen nicht gleich sind. Daher wird es einige zusätzliche Mikrosekunden dauern, bis die <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr> „Incorrect username or password“ erfolgt.
#### Die Zeit zum Antworten hilft den Angreifern
#### Die Zeit zum Antworten hilft den Angreifern { #the-time-to-answer-helps-the-attackers }
Wenn die Angreifer zu diesem Zeitpunkt feststellen, dass der Server einige Mikrosekunden länger braucht, um die Antwort „Incorrect username or password“ zu senden, wissen sie, dass sie _etwas_ richtig gemacht haben, einige der Anfangsbuchstaben waren richtig.
Wenn die Angreifer zu diesem Zeitpunkt feststellen, dass der Server einige Mikrosekunden länger braucht, um die Response „Incorrect username or password“ zu senden, wissen sie, dass sie _etwas_ richtig gemacht haben, einige der Anfangsbuchstaben waren richtig.
Und dann können sie es noch einmal versuchen, wohl wissend, dass es wahrscheinlich eher etwas mit `stanleyjobsox` als mit `johndoe` zu tun hat.
#### Ein „professioneller“ Angriff
#### Ein „professioneller“ Angriff { #a-professional-attack }
Natürlich würden die Angreifer das alles nicht von Hand versuchen, sondern ein Programm dafür schreiben, möglicherweise mit Tausenden oder Millionen Tests pro Sekunde. Und würden jeweils nur einen zusätzlichen richtigen Buchstaben erhalten.
Aber so hätten die Angreifer in wenigen Minuten oder Stunden mit der „Hilfe“ unserer Anwendung den richtigen Benutzernamen und das richtige Passwort erraten, indem sie die Zeitspanne zur Hilfe nehmen, die diese zur Beantwortung benötigt.
#### Das Problem beheben mittels `secrets.compare_digest()`
#### Das Problem beheben mittels `secrets.compare_digest()` { #fix-it-with-secrets-compare-digest }
Aber in unserem Code verwenden wir tatsächlich `secrets.compare_digest()`.
@@ -138,27 +100,8 @@ Damit wird, kurz gesagt, der Vergleich von `stanleyjobsox` mit `stanleyjobson` g
So ist Ihr Anwendungscode, dank der Verwendung von `secrets.compare_digest()`, vor dieser ganzen Klasse von Sicherheitsangriffen geschützt.
### Den Error zurückgeben
### Den Error zurückgeben { #return-the-error }
Nachdem Sie festgestellt haben, dass die Anmeldeinformationen falsch sind, geben Sie eine `HTTPException` mit dem Statuscode 401 zurück (derselbe, der auch zurückgegeben wird, wenn keine Anmeldeinformationen angegeben werden) und fügen den Header `WWW-Authenticate` hinzu, damit der Browser die Anmeldeaufforderung erneut anzeigt:
=== "Python 3.9+"
```Python hl_lines="26-30"
{!> ../../../docs_src/security/tutorial007_an_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="26-30"
{!> ../../../docs_src/security/tutorial007_an.py!}
```
=== "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

@@ -1,16 +1,19 @@
# Fortgeschrittene Sicherheit
# Fortgeschrittene Sicherheit { #advanced-security }
## Zusatzfunktionen
## Zusatzfunktionen { #additional-features }
Neben den in [Tutorial Benutzerhandbuch: Sicherheit](../../tutorial/security/index.md){.internal-link target=_blank} behandelten Funktionen gibt es noch einige zusätzliche Funktionen zur Handhabung der Sicherheit.
!!! tip "Tipp"
Die nächsten Abschnitte sind **nicht unbedingt „fortgeschritten“**.
/// tip | Tipp
Und es ist möglich, dass für Ihren Anwendungsfall die Lösung in einem davon liegt.
Die nächsten Abschnitte sind **nicht unbedingt „fortgeschritten“**.
## Lesen Sie zuerst das Tutorial
Und es ist möglich, dass für Ihren Anwendungsfall die Lösung in einem davon liegt.
In den nächsten Abschnitten wird davon ausgegangen, dass Sie das Haupt-[Tutorial Benutzerhandbuch: Sicherheit](../../tutorial/security/index.md){.internal-link target=_blank} bereits gelesen haben.
///
## Das Tutorial zuerst lesen { #read-the-tutorial-first }
Die nächsten Abschnitte setzen voraus, dass Sie das Haupt-[Tutorial Benutzerhandbuch: Sicherheit](../../tutorial/security/index.md){.internal-link target=_blank} bereits gelesen haben.
Sie basieren alle auf den gleichen Konzepten, ermöglichen jedoch einige zusätzliche Funktionalitäten.

View File

@@ -1,29 +1,32 @@
# OAuth2-Scopes
# OAuth2-Scopes { #oauth2-scopes }
Sie können OAuth2-<abbr title="Geltungsbereiche">Scopes</abbr> direkt in **FastAPI** verwenden, sie sind nahtlos integriert.
Das ermöglicht es Ihnen, ein feingranuliertes Berechtigungssystem nach dem OAuth2-Standard in Ihre OpenAPI-Anwendung (und deren API-Dokumentation) zu integrieren.
OAuth2 mit Scopes ist der Mechanismus, der von vielen großen Authentifizierungsanbietern wie Facebook, Google, GitHub, Microsoft, Twitter usw. verwendet wird. Sie verwenden ihn, um Benutzern und Anwendungen spezifische Berechtigungen zu erteilen.
OAuth2 mit Scopes ist der Mechanismus, der von vielen großen Authentifizierungsanbietern wie Facebook, Google, GitHub, Microsoft, X (Twitter) usw. verwendet wird. Sie verwenden ihn, um Benutzern und Anwendungen spezifische Berechtigungen zu erteilen.
Jedes Mal, wenn Sie sich mit Facebook, Google, GitHub, Microsoft oder Twitter anmelden („log in with“), verwendet die entsprechende Anwendung OAuth2 mit Scopes.
Jedes Mal, wenn Sie sich mit Facebook, Google, GitHub, Microsoft oder X (Twitter) anmelden („log in with“), verwendet die entsprechende Anwendung OAuth2 mit Scopes.
In diesem Abschnitt erfahren Sie, wie Sie Authentifizierung und Autorisierung mit demselben OAuth2, mit Scopes in Ihrer **FastAPI**-Anwendung verwalten.
!!! warning "Achtung"
Dies ist ein mehr oder weniger fortgeschrittener Abschnitt. Wenn Sie gerade erst anfangen, können Sie ihn überspringen.
/// warning | Achtung
Sie benötigen nicht unbedingt OAuth2-Scopes, und Sie können die Authentifizierung und Autorisierung handhaben wie Sie möchten.
Dies ist ein mehr oder weniger fortgeschrittener Abschnitt. Wenn Sie gerade erst anfangen, können Sie ihn überspringen.
Aber OAuth2 mit Scopes kann bequem in Ihre API (mit OpenAPI) und deren API-Dokumentation integriert werden.
Sie benötigen nicht unbedingt OAuth2-Scopes, und Sie können die Authentifizierung und Autorisierung handhaben wie Sie möchten.
Dennoch, verwenden Sie solche Scopes oder andere Sicherheits-/Autorisierungsanforderungen in Ihrem Code so wie Sie es möchten.
Aber OAuth2 mit Scopes kann bequem in Ihre API (mit OpenAPI) und deren API-Dokumentation integriert werden.
In vielen Fällen kann OAuth2 mit Scopes ein Overkill sein.
Dennoch, verwenden Sie solche Scopes oder andere Sicherheits-/Autorisierungsanforderungen in Ihrem Code so wie Sie es möchten.
Aber wenn Sie wissen, dass Sie es brauchen oder neugierig sind, lesen Sie weiter.
In vielen Fällen kann OAuth2 mit Scopes ein Overkill sein.
## OAuth2-Scopes und OpenAPI
Aber wenn Sie wissen, dass Sie es brauchen oder neugierig sind, lesen Sie weiter.
///
## OAuth2-Scopes und OpenAPI { #oauth2-scopes-and-openapi }
Die OAuth2-Spezifikation definiert „Scopes“ als eine Liste von durch Leerzeichen getrennten Strings.
@@ -43,117 +46,33 @@ Er wird normalerweise verwendet, um bestimmte Sicherheitsberechtigungen zu dekla
* `instagram_basic` wird von Facebook / Instagram verwendet.
* `https://www.googleapis.com/auth/drive` wird von Google verwendet.
!!! info
In OAuth2 ist ein „Scope“ nur ein String, der eine bestimmte erforderliche Berechtigung deklariert.
/// info | Info
Es spielt keine Rolle, ob er andere Zeichen wie `:` enthält oder ob es eine URL ist.
In OAuth2 ist ein „Scope“ nur ein String, der eine bestimmte erforderliche Berechtigung deklariert.
Diese Details sind implementierungsspezifisch.
Es spielt keine Rolle, ob er andere Zeichen wie `:` enthält oder ob es eine URL ist.
Für OAuth2 sind es einfach nur Strings.
Diese Details sind implementierungsspezifisch.
## Gesamtübersicht
Für OAuth2 sind es einfach nur Strings.
///
## Gesamtübersicht { #global-view }
Sehen wir uns zunächst kurz die Teile an, die sich gegenüber den Beispielen im Haupt-**Tutorial Benutzerhandbuch** für [OAuth2 mit Password (und Hashing), Bearer mit JWT-Tokens](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank} ändern. Diesmal verwenden wir OAuth2-Scopes:
=== "Python 3.10+"
```Python hl_lines="4 8 12 46 64 105 107-115 121-124 128-134 139 155"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
=== "Python 3.9+"
```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="2 4 8 12 47 65 106 108-116 122-125 129-135 140 156"
{!> ../../../docs_src/security/tutorial005_an.py!}
```
=== "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!}
```
=== "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!}
```
=== "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[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *}
Sehen wir uns diese Änderungen nun Schritt für Schritt an.
## OAuth2-Sicherheitsschema
## OAuth2-Sicherheitsschema { #oauth2-security-scheme }
Die erste Änderung ist, dass wir jetzt das OAuth2-Sicherheitsschema mit zwei verfügbaren Scopes deklarieren: `me` und `items`.
Der `scopes`-Parameter erhält ein `dict` mit jedem Scope als Schlüssel und dessen Beschreibung als Wert:
Der `scopes`-Parameter erhält ein <abbr title="Dictionary Zuordnungstabelle: In anderen Sprachen auch Hash, Map, Objekt, Assoziatives Array genannt">`dict`</abbr> mit jedem Scope als Schlüssel und dessen Beschreibung als Wert:
=== "Python 3.10+"
```Python hl_lines="62-65"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
=== "Python 3.9+"
```Python hl_lines="62-65"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="63-66"
{!> ../../../docs_src/security/tutorial005_an.py!}
```
=== "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!}
```
=== "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!}
```
=== "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[63:66] *}
Da wir diese Scopes jetzt deklarieren, werden sie in der API-Dokumentation angezeigt, wenn Sie sich einloggen/autorisieren.
@@ -163,65 +82,25 @@ Das ist derselbe Mechanismus, der verwendet wird, wenn Sie beim Anmelden mit Fac
<img src="/img/tutorial/security/image11.png">
## JWT-Token mit Scopes
## JWT-Token mit Scopes { #jwt-token-with-scopes }
Ändern Sie nun die Token-*Pfadoperation*, um die angeforderten Scopes zurückzugeben.
Wir verwenden immer noch dasselbe `OAuth2PasswordRequestForm`. Es enthält eine Eigenschaft `scopes` mit einer `list`e von `str`s für jeden Scope, den es im Request erhalten hat.
Wir verwenden immer noch dasselbe `OAuth2PasswordRequestForm`. Es enthält eine Eigenschaft `scopes` mit einer `list`e von `str`s für jeden Scope, den es im <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Request</abbr> erhalten hat.
Und wir geben die Scopes als Teil des JWT-Tokens zurück.
!!! danger "Gefahr"
Der Einfachheit halber fügen wir hier die empfangenen Scopes direkt zum Token hinzu.
/// danger | Gefahr
Aus Sicherheitsgründen sollten Sie jedoch sicherstellen, dass Sie in Ihrer Anwendung nur die Scopes hinzufügen, die der Benutzer tatsächlich haben kann, oder die Sie vordefiniert haben.
Der Einfachheit halber fügen wir hier die empfangenen Scopes direkt zum Token hinzu.
=== "Python 3.10+"
Aus Sicherheitsgründen sollten Sie jedoch sicherstellen, dass Sie in Ihrer Anwendung nur die Scopes hinzufügen, die der Benutzer tatsächlich haben kann, oder die Sie vordefiniert haben.
```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
///
=== "Python 3.9+"
{* ../../docs_src/security/tutorial005_an_py310.py hl[157] *}
```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="156"
{!> ../../../docs_src/security/tutorial005_an.py!}
```
=== "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!}
```
=== "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!}
```
=== "Python 3.8+ nicht annotiert"
!!! tip "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005.py!}
```
## Scopes in *Pfadoperationen* und Abhängigkeiten deklarieren
## Scopes in *Pfadoperationen* und Abhängigkeiten deklarieren { #declare-scopes-in-path-operations-and-dependencies }
Jetzt deklarieren wir, dass die *Pfadoperation* für `/users/me/items/` den Scope `items` erfordert.
@@ -237,64 +116,27 @@ Und die Abhängigkeitsfunktion `get_current_active_user` kann auch Unterabhängi
In diesem Fall erfordert sie den Scope `me` (sie könnte mehr als einen Scope erfordern).
!!! note "Hinweis"
Sie müssen nicht unbedingt an verschiedenen Stellen verschiedene Scopes hinzufügen.
/// note | Hinweis
Wir tun dies hier, um zu demonstrieren, wie **FastAPI** auf verschiedenen Ebenen deklarierte Scopes verarbeitet.
Sie müssen nicht unbedingt an verschiedenen Stellen verschiedene Scopes hinzufügen.
=== "Python 3.10+"
Wir tun dies hier, um zu demonstrieren, wie **FastAPI** auf verschiedenen Ebenen deklarierte Scopes verarbeitet.
```Python hl_lines="4 139 170"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
///
=== "Python 3.9+"
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
```Python hl_lines="4 139 170"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
/// info | Technische Details
=== "Python 3.8+"
`Security` ist tatsächlich eine Unterklasse von `Depends` und hat nur noch einen zusätzlichen Parameter, den wir später kennenlernen werden.
```Python hl_lines="4 140 171"
{!> ../../../docs_src/security/tutorial005_an.py!}
```
Durch die Verwendung von `Security` anstelle von `Depends` weiß **FastAPI** jedoch, dass es Sicherheits-Scopes deklarieren, intern verwenden und die API mit OpenAPI dokumentieren kann.
=== "Python 3.10+ nicht annotiert"
Wenn Sie jedoch `Query`, `Path`, `Depends`, `Security` und andere von `fastapi` importieren, handelt es sich tatsächlich um Funktionen, die spezielle Klassen zurückgeben.
!!! tip "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
///
```Python hl_lines="3 138 167"
{!> ../../../docs_src/security/tutorial005_py310.py!}
```
=== "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!}
```
=== "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"
`Security` ist tatsächlich eine Unterklasse von `Depends` und hat nur noch einen zusätzlichen Parameter, den wir später kennenlernen werden.
Durch die Verwendung von `Security` anstelle von `Depends` weiß **FastAPI** jedoch, dass es Sicherheits-Scopes deklarieren, intern verwenden und die API mit OpenAPI dokumentieren kann.
Wenn Sie jedoch `Query`, `Path`, `Depends`, `Security` und andere von `fastapi` importieren, handelt es sich tatsächlich um Funktionen, die spezielle Klassen zurückgeben.
## `SecurityScopes` verwenden
## `SecurityScopes` verwenden { #use-securityscopes }
Aktualisieren Sie nun die Abhängigkeit `get_current_user`.
@@ -308,52 +150,9 @@ Wir deklarieren auch einen speziellen Parameter vom Typ `SecurityScopes`, der au
Diese `SecurityScopes`-Klasse ähnelt `Request` (`Request` wurde verwendet, um das Request-Objekt direkt zu erhalten).
=== "Python 3.10+"
{* ../../docs_src/security/tutorial005_an_py310.py hl[9,106] *}
```Python hl_lines="8 105"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
=== "Python 3.9+"
```Python hl_lines="8 105"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="8 106"
{!> ../../../docs_src/security/tutorial005_an.py!}
```
=== "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!}
```
=== "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!}
```
=== "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!}
```
## Die `scopes` verwenden
## Die `scopes` verwenden { #use-the-scopes }
Der Parameter `security_scopes` wird vom Typ `SecurityScopes` sein.
@@ -365,52 +164,9 @@ Wir erstellen eine `HTTPException`, die wir später an mehreren Stellen wiederve
In diese Exception fügen wir (falls vorhanden) die erforderlichen Scopes als durch Leerzeichen getrennten String ein (unter Verwendung von `scope_str`). Wir fügen diesen String mit den Scopes in den Header `WWW-Authenticate` ein (das ist Teil der Spezifikation).
=== "Python 3.10+"
{* ../../docs_src/security/tutorial005_an_py310.py hl[106,108:116] *}
```Python hl_lines="105 107-115"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
=== "Python 3.9+"
```Python hl_lines="105 107-115"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="106 108-116"
{!> ../../../docs_src/security/tutorial005_an.py!}
```
=== "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!}
```
=== "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!}
```
=== "Python 3.8+ nicht annotiert"
!!! tip "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
```Python hl_lines="105 107-115"
{!> ../../../docs_src/security/tutorial005.py!}
```
## Den `username` und das Format der Daten überprüfen
## Den `username` und das Format der Daten überprüfen { #verify-the-username-and-data-shape }
Wir verifizieren, dass wir einen `username` erhalten, und extrahieren die Scopes.
@@ -424,103 +180,17 @@ Anstelle beispielsweise eines `dict`s oder etwas anderem, was später in der Anw
Wir verifizieren auch, dass wir einen Benutzer mit diesem Benutzernamen haben, und wenn nicht, lösen wir dieselbe Exception aus, die wir zuvor erstellt haben.
=== "Python 3.10+"
{* ../../docs_src/security/tutorial005_an_py310.py hl[47,117:129] *}
```Python hl_lines="46 116-127"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
## Die `scopes` verifizieren { #verify-the-scopes }
=== "Python 3.9+"
```Python hl_lines="46 116-127"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="47 117-128"
{!> ../../../docs_src/security/tutorial005_an.py!}
```
=== "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!}
```
=== "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!}
```
=== "Python 3.8+ nicht annotiert"
!!! tip "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
```Python hl_lines="46 116-127"
{!> ../../../docs_src/security/tutorial005.py!}
```
## Die `scopes` verifizieren
Wir überprüfen nun, ob das empfangenen Token alle Scopes enthält, die von dieser Abhängigkeit und deren Verwendern (einschließlich *Pfadoperationen*) gefordert werden. Andernfalls lösen wir eine `HTTPException` aus.
Wir überprüfen nun, ob das empfangene Token alle Scopes enthält, die von dieser Abhängigkeit und deren Verwendern (einschließlich *Pfadoperationen*) gefordert werden. Andernfalls lösen wir eine `HTTPException` aus.
Hierzu verwenden wir `security_scopes.scopes`, das eine `list`e mit allen diesen Scopes als `str` enthält.
=== "Python 3.10+"
{* ../../docs_src/security/tutorial005_an_py310.py hl[130:136] *}
```Python hl_lines="128-134"
{!> ../../../docs_src/security/tutorial005_an_py310.py!}
```
=== "Python 3.9+"
```Python hl_lines="128-134"
{!> ../../../docs_src/security/tutorial005_an_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="129-135"
{!> ../../../docs_src/security/tutorial005_an.py!}
```
=== "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!}
```
=== "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!}
```
=== "Python 3.8+ nicht annotiert"
!!! tip "Tipp"
Bevorzugen Sie die `Annotated`-Version, falls möglich.
```Python hl_lines="128-134"
{!> ../../../docs_src/security/tutorial005.py!}
```
## Abhängigkeitsbaum und Scopes
## Abhängigkeitsbaum und Scopes { #dependency-tree-and-scopes }
Sehen wir uns diesen Abhängigkeitsbaum und die Scopes noch einmal an.
@@ -545,12 +215,15 @@ So sieht die Hierarchie der Abhängigkeiten und Scopes aus:
* `security_scopes.scopes` enthält `["me"]` für die *Pfadoperation* `read_users_me`, da das in der Abhängigkeit `get_current_active_user` deklariert ist.
* `security_scopes.scopes` wird `[]` (nichts) für die *Pfadoperation* `read_system_status` enthalten, da diese keine `Security` mit `scopes` deklariert hat, und deren Abhängigkeit `get_current_user` ebenfalls keinerlei `scopes` deklariert.
!!! tip "Tipp"
Das Wichtige und „Magische“ hier ist, dass `get_current_user` für jede *Pfadoperation* eine andere Liste von `scopes` hat, die überprüft werden.
/// tip | Tipp
Alles hängt von den „Scopes“ ab, die in jeder *Pfadoperation* und jeder Abhängigkeit im Abhängigkeitsbaum für diese bestimmte *Pfadoperation* deklariert wurden.
Das Wichtige und „Magische“ hier ist, dass `get_current_user` für jede *Pfadoperation* eine andere Liste von `scopes` hat, die überprüft werden.
## Weitere Details zu `SecurityScopes`.
Alles hängt von den „Scopes“ ab, die in jeder *Pfadoperation* und jeder Abhängigkeit im Abhängigkeitsbaum für diese bestimmte *Pfadoperation* deklariert wurden.
///
## Weitere Details zu `SecurityScopes` { #more-details-about-securityscopes }
Sie können `SecurityScopes` an jeder Stelle und an mehreren Stellen verwenden, es muss sich nicht in der „Wurzel“-Abhängigkeit befinden.
@@ -560,7 +233,7 @@ Da die `SecurityScopes` alle von den Verwendern der Abhängigkeiten deklarierten
Diese werden für jede *Pfadoperation* unabhängig überprüft.
## Testen Sie es
## Es testen { #check-it }
Wenn Sie die API-Dokumentation öffnen, können Sie sich authentisieren und angeben, welche Scopes Sie autorisieren möchten.
@@ -572,7 +245,7 @@ Und wenn Sie den Scope `me`, aber nicht den Scope `items` auswählen, können Si
Das würde einer Drittanbieteranwendung passieren, die versucht, auf eine dieser *Pfadoperationen* mit einem Token zuzugreifen, das von einem Benutzer bereitgestellt wurde, abhängig davon, wie viele Berechtigungen der Benutzer dieser Anwendung erteilt hat.
## Über Integrationen von Drittanbietern
## Über Integrationen von Drittanbietern { #about-third-party-integrations }
In diesem Beispiel verwenden wir den OAuth2-Flow „Password“.
@@ -586,13 +259,16 @@ Am häufigsten ist der „Implicit“-Flow.
Am sichersten ist der „Code“-Flow, die Implementierung ist jedoch komplexer, da mehr Schritte erforderlich sind. Da er komplexer ist, schlagen viele Anbieter letztendlich den „Implicit“-Flow vor.
!!! note "Hinweis"
Es ist üblich, dass jeder Authentifizierungsanbieter seine Flows anders benennt, um sie zu einem Teil seiner Marke zu machen.
/// note | Hinweis
Aber am Ende implementieren sie denselben OAuth2-Standard.
Es ist üblich, dass jeder Authentifizierungsanbieter seine Flows anders benennt, um sie zu einem Teil seiner Marke zu machen.
Aber am Ende implementieren sie denselben OAuth2-Standard.
///
**FastAPI** enthält Werkzeuge für alle diese OAuth2-Authentifizierungs-Flows in `fastapi.security.oauth2`.
## `Security` in Dekorator-`dependencies`
## `Security` in Dekorator-`dependencies` { #security-in-decorator-dependencies }
Auf die gleiche Weise können Sie eine `list`e von `Depends` im Parameter `dependencies` des Dekorators definieren (wie in [Abhängigkeiten in Pfadoperation-Dekoratoren](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} erläutert), Sie könnten auch dort `Security` mit `scopes` verwenden.

View File

@@ -1,4 +1,4 @@
# Einstellungen und Umgebungsvariablen
# Einstellungen und Umgebungsvariablen { #settings-and-environment-variables }
In vielen Fällen benötigt Ihre Anwendung möglicherweise einige externe Einstellungen oder Konfigurationen, zum Beispiel geheime Schlüssel, Datenbank-Anmeldeinformationen, Anmeldeinformationen für E-Mail-Dienste, usw.
@@ -6,130 +6,25 @@ Die meisten dieser Einstellungen sind variabel (können sich ändern), wie z. B.
Aus diesem Grund werden diese üblicherweise in Umgebungsvariablen bereitgestellt, die von der Anwendung gelesen werden.
## 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.
Um Umgebungsvariablen zu verstehen, können Sie [Umgebungsvariablen](../environment-variables.md){.internal-link target=_blank} lesen.
Eine <a href="https://de.wikipedia.org/wiki/Umgebungsvariable" class="external-link" target="_blank">Umgebungsvariable</a> (auch bekannt als „env var“) ist eine Variable, die sich außerhalb des Python-Codes im Betriebssystem befindet und von Ihrem Python-Code (oder auch von anderen Programmen) gelesen werden kann.
///
Sie können Umgebungsvariablen in der Shell erstellen und verwenden, ohne Python zu benötigen:
=== "Linux, macOS, Windows Bash"
<div class="termy">
```console
// Sie könnten eine Umgebungsvariable MY_NAME erstellen mittels
$ export MY_NAME="Wade Wilson"
// Dann könnten Sie diese mit anderen Programmen verwenden, etwa
$ echo "Hello $MY_NAME"
Hello Wade Wilson
```
</div>
=== "Windows PowerShell"
<div class="termy">
```console
// Erstelle eine Umgebungsvariable MY_NAME
$ $Env:MY_NAME = "Wade Wilson"
// Verwende sie mit anderen Programmen, etwa
$ echo "Hello $Env:MY_NAME"
Hello Wade Wilson
```
</div>
### Umgebungsvariablen mit Python auslesen
Sie können Umgebungsvariablen auch außerhalb von Python im Terminal (oder mit einer anderen Methode) erstellen und diese dann mit Python auslesen.
Sie könnten zum Beispiel eine Datei `main.py` haben mit:
```Python hl_lines="3"
import os
name = os.getenv("MY_NAME", "World")
print(f"Hello {name} from Python")
```
!!! 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.
Wenn nicht angegeben, ist er standardmäßig `None`. Hier übergeben wir `"World"` als Defaultwert.
Dann könnten Sie dieses Python-Programm aufrufen:
<div class="termy">
```console
// Hier legen wir die Umgebungsvariable noch nicht fest
$ python main.py
// Da wir die Umgebungsvariable nicht festgelegt haben, erhalten wir den Standardwert
Hello World from Python
// Aber wenn wir zuerst eine Umgebungsvariable erstellen
$ export MY_NAME="Wade Wilson"
// Und dann das Programm erneut aufrufen
$ python main.py
// Kann es jetzt die Umgebungsvariable lesen
Hello Wade Wilson from Python
```
</div>
Da Umgebungsvariablen außerhalb des Codes festgelegt, aber vom Code gelesen werden können und nicht zusammen mit den übrigen Dateien gespeichert (an `git` committet) werden müssen, werden sie häufig für Konfigurationen oder Einstellungen verwendet.
Sie können eine Umgebungsvariable auch nur für einen bestimmten Programmaufruf erstellen, die nur für dieses Programm und nur für dessen Dauer verfügbar ist.
Erstellen Sie diese dazu direkt vor dem Programm selbst, in derselben Zeile:
<div class="termy">
```console
// Erstelle eine Umgebungsvariable MY_NAME inline für diesen Programmaufruf
$ MY_NAME="Wade Wilson" python main.py
// main.py kann jetzt diese Umgebungsvariable lesen
Hello Wade Wilson from Python
// Die Umgebungsvariable existiert danach nicht mehr
$ python main.py
Hello World from Python
```
</div>
!!! 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>.
### Typen und Validierung
## Typen und Validierung { #types-and-validation }
Diese Umgebungsvariablen können nur Text-Zeichenketten verarbeiten, da sie außerhalb von Python liegen und mit anderen Programmen und dem Rest des Systems (und sogar mit verschiedenen Betriebssystemen wie Linux, Windows, macOS) kompatibel sein müssen.
Das bedeutet, dass jeder in Python aus einer Umgebungsvariablen gelesene Wert ein `str` ist und jede Konvertierung in einen anderen Typ oder jede Validierung im Code erfolgen muss.
## Pydantic `Settings`
## Pydantic `Settings` { #pydantic-settings }
Glücklicherweise bietet Pydantic ein großartiges Werkzeug zur Verarbeitung dieser Einstellungen, die von Umgebungsvariablen stammen, mit <a href="https://docs.pydantic.dev/latest/concepts/pydantic_settings/" class="external-link" target="_blank">Pydantic: Settings Management</a>.
### `pydantic-settings` installieren
### `pydantic-settings` installieren { #install-pydantic-settings }
Installieren Sie zunächst das Package `pydantic-settings`:
Stellen Sie zunächst sicher, dass Sie Ihre [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellt und aktiviert haben, und installieren Sie dann das Package `pydantic-settings`:
<div class="termy">
@@ -151,10 +46,13 @@ $ pip install "fastapi[all]"
</div>
!!! info
In Pydantic v1 war das im Hauptpackage enthalten. Jetzt wird es als unabhängiges Package verteilt, sodass Sie wählen können, ob Sie es installieren möchten oder nicht, falls Sie die Funktionalität nicht benötigen.
/// info | Info
### Das `Settings`-Objekt erstellen
In Pydantic v1 war es im Hauptpackage enthalten. Jetzt wird es als unabhängiges Package verteilt, sodass Sie wählen können, ob Sie es installieren möchten oder nicht, falls Sie die Funktionalität nicht benötigen.
///
### Das `Settings`-Objekt erstellen { #create-the-settings-object }
Importieren Sie `BaseSettings` aus Pydantic und erstellen Sie eine Unterklasse, ganz ähnlich wie bei einem Pydantic-Modell.
@@ -162,176 +60,149 @@ Auf die gleiche Weise wie bei Pydantic-Modellen deklarieren Sie Klassenattribute
Sie können dieselben Validierungs-Funktionen und -Tools verwenden, die Sie für Pydantic-Modelle verwenden, z. B. verschiedene Datentypen und zusätzliche Validierungen mit `Field()`.
=== "Pydantic v2"
//// 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] *}
=== "Pydantic v1"
////
!!! info
In Pydantic v1 würden Sie `BaseSettings` direkt von `pydantic` statt von `pydantic_settings` importieren.
//// tab | Pydantic v1
```Python hl_lines="2 5-8 11"
{!> ../../../docs_src/settings/tutorial001_pv1.py!}
```
/// info | Info
!!! tip "Tipp"
Für ein schnelles Copy-and-paste verwenden Sie nicht dieses Beispiel, sondern das letzte unten.
In Pydantic v1 würden Sie `BaseSettings` direkt von `pydantic` statt von `pydantic_settings` importieren.
///
{* ../../docs_src/settings/tutorial001_pv1.py hl[2,5:8,11] *}
////
/// tip | Tipp
Für ein schnelles Copy-and-paste verwenden Sie nicht dieses Beispiel, sondern das letzte unten.
///
Wenn Sie dann eine Instanz dieser `Settings`-Klasse erstellen (in diesem Fall als `settings`-Objekt), liest Pydantic die Umgebungsvariablen ohne Berücksichtigung der Groß- und Kleinschreibung. Eine Variable `APP_NAME` in Großbuchstaben wird also als Attribut `app_name` gelesen.
Als Nächstes werden die Daten konvertiert und validiert. Wenn Sie also dieses `settings`-Objekt verwenden, verfügen Sie über Daten mit den von Ihnen deklarierten Typen (z. B. ist `items_per_user` ein `int`).
### `settings` verwenden
### `settings` verwenden { #use-the-settings }
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
### Den Server ausführen { #run-the-server }
Als Nächstes würden Sie den Server ausführen und die Konfigurationen als Umgebungsvariablen übergeben. Sie könnten beispielsweise `ADMIN_EMAIL` und `APP_NAME` festlegen mit:
<div class="termy">
```console
$ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" uvicorn main:app
$ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.py
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
!!! 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.
/// 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.
///
Und dann würde die Einstellung `admin_email` auf `"deadpool@example.com"` gesetzt.
Der `app_name` wäre `"ChimichangApp"`.
Und `items_per_user` würde seinen Standardwert von `50` behalten.
Und `items_per_user` würde seinen Defaultwert von `50` behalten.
## Einstellungen in einem anderen Modul
## Einstellungen in einem anderen Modul { #settings-in-another-module }
Sie könnten diese Einstellungen in eine andere Moduldatei einfügen, wie Sie in [Größere Anwendungen mehrere Dateien](../tutorial/bigger-applications.md){.internal-link target=_blank} gesehen haben.
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"
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.
/// tip | Tipp
## Einstellungen in einer Abhängigkeit
Sie benötigen außerdem eine Datei `__init__.py`, wie in [Größere Anwendungen mehrere Dateien](../tutorial/bigger-applications.md){.internal-link target=_blank} gesehen.
///
## Einstellungen in einer Abhängigkeit { #settings-in-a-dependency }
In manchen Fällen kann es nützlich sein, die Einstellungen mit einer Abhängigkeit bereitzustellen, anstatt ein globales Objekt `settings` zu haben, das überall verwendet wird.
Dies könnte besonders beim Testen nützlich sein, da es sehr einfach ist, eine Abhängigkeit mit Ihren eigenen benutzerdefinierten Einstellungen zu überschreiben.
### Die Konfigurationsdatei
### Die Konfigurationsdatei { #the-config-file }
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.
### Die Haupt-Anwendungsdatei
### Die Haupt-Anwendungsdatei { #the-main-app-file }
Jetzt erstellen wir eine Abhängigkeit, die ein neues `config.Settings()` zurückgibt.
=== "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!}
```
/// tip | Tipp
=== "Python 3.8+"
Wir werden das `@lru_cache` in Kürze besprechen.
```Python hl_lines="6 12-13"
{!> ../../../docs_src/settings/app02_an/main.py!}
```
Im Moment nehmen Sie an, dass `get_settings()` eine normale Funktion ist.
=== "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"
Wir werden das `@lru_cache` in Kürze besprechen.
Im Moment nehmen Sie an, dass `get_settings()` eine normale Funktion ist.
///
Und dann können wir das von der *Pfadoperation-Funktion* als Abhängigkeit einfordern und es überall dort verwenden, wo wir es brauchen.
=== "Python 3.9+"
{* ../../docs_src/settings/app02_an_py39/main.py hl[17,19:21] *}
```Python hl_lines="17 19-21"
{!> ../../../docs_src/settings/app02_an_py39/main.py!}
```
=== "Python 3.8+"
```Python hl_lines="17 19-21"
{!> ../../../docs_src/settings/app02_an/main.py!}
```
=== "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!}
```
### Einstellungen und Tests
### Einstellungen und Tests { #settings-and-testing }
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.
Dann können wir testen, ob das verwendet wird.
## Lesen einer `.env`-Datei
## Lesen einer `.env`-Datei { #reading-a-env-file }
Wenn Sie viele Einstellungen haben, die sich möglicherweise oft ändern, vielleicht in verschiedenen Umgebungen, kann es nützlich sein, diese in eine Datei zu schreiben und sie dann daraus zu lesen, als wären sie Umgebungsvariablen.
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"
Eine Datei, die mit einem Punkt (`.`) beginnt, ist eine versteckte Datei in Unix-ähnlichen Systemen wie Linux und macOS.
/// tip | Tipp
Aber eine dotenv-Datei muss nicht unbedingt genau diesen Dateinamen haben.
Eine Datei, die mit einem Punkt (`.`) beginnt, ist eine versteckte Datei in Unix-ähnlichen Systemen wie Linux und macOS.
Aber eine dotenv-Datei muss nicht unbedingt genau diesen Dateinamen haben.
///
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"
Damit das funktioniert, müssen Sie `pip install python-dotenv` ausführen.
/// tip | Tipp
### Die `.env`-Datei
Damit das funktioniert, müssen Sie `pip install python-dotenv` ausführen.
///
### Die `.env`-Datei { #the-env-file }
Sie könnten eine `.env`-Datei haben, mit:
@@ -340,36 +211,45 @@ ADMIN_EMAIL="deadpool@example.com"
APP_NAME="ChimichangApp"
```
### Einstellungen aus `.env` lesen
### Einstellungen aus `.env` lesen { #read-settings-from-env }
Und dann aktualisieren Sie Ihre `config.py` mit:
=== "Pydantic v2"
//// 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"
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>.
/// tip | Tipp
=== "Pydantic v1"
Das Attribut `model_config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/latest/concepts/config/" class="external-link" target="_blank">Pydantic: Concepts: Configuration</a>.
```Python hl_lines="9-10"
{!> ../../../docs_src/settings/app03_an/config_pv1.py!}
```
///
!!! tip "Tipp"
Die Klasse `Config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/1.10/usage/model_config/" class="external-link" target="_blank">Pydantic Model Config</a>.
////
!!! info
In Pydantic Version 1 erfolgte die Konfiguration in einer internen Klasse `Config`, in Pydantic Version 2 erfolgt sie in einem Attribut `model_config`. Dieses Attribut akzeptiert ein `dict`. Um automatische Codevervollständigung und Inline-Fehlerberichte zu erhalten, können Sie `SettingsConfigDict` importieren und verwenden, um dieses `dict` zu definieren.
//// tab | Pydantic v1
{* ../../docs_src/settings/app03_an/config_pv1.py hl[9:10] *}
/// tip | Tipp
Die Klasse `Config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/1.10/usage/model_config/" class="external-link" target="_blank">Pydantic Model Config</a>.
///
////
/// info | Info
In Pydantic Version 1 erfolgte die Konfiguration in einer internen Klasse `Config`, in Pydantic Version 2 erfolgt sie in einem Attribut `model_config`. Dieses Attribut akzeptiert ein <abbr title="Dictionary Zuordnungstabelle: In anderen Sprachen auch Hash, Map, Objekt, Assoziatives Array genannt">`dict`</abbr>. Um automatische Codevervollständigung und Inline-Fehlerberichte zu erhalten, können Sie `SettingsConfigDict` importieren und verwenden, um dieses `dict` zu definieren.
///
Hier definieren wir die Konfiguration `env_file` innerhalb Ihrer Pydantic-`Settings`-Klasse und setzen den Wert auf den Dateinamen mit der dotenv-Datei, die wir verwenden möchten.
### Die `Settings` nur einmal laden mittels `lru_cache`
### Die `Settings` nur einmal laden mittels `lru_cache` { #creating-the-settings-only-once-with-lru-cache }
Das Lesen einer Datei von der Festplatte ist normalerweise ein kostspieliger (langsamer) Vorgang, daher möchten Sie ihn wahrscheinlich nur einmal ausführen und dann dasselbe Einstellungsobjekt erneut verwenden, anstatt es für jeden Request zu lesen.
Das Lesen einer Datei von der Festplatte ist normalerweise ein kostspieliger (langsamer) Vorgang, daher möchten Sie ihn wahrscheinlich nur einmal ausführen und dann dasselbe Einstellungsobjekt erneut verwenden, anstatt es für jeden <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Request</abbr> zu lesen.
Aber jedes Mal, wenn wir ausführen:
@@ -390,30 +270,11 @@ 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. ✔️
=== "Python 3.9+"
```Python hl_lines="1 11"
{!> ../../../docs_src/settings/app03_an_py39/main.py!}
```
=== "Python 3.8+"
```Python hl_lines="1 11"
{!> ../../../docs_src/settings/app03_an/main.py!}
```
=== "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.
#### Technische Details zu `lru_cache`
#### Technische Details zu `lru_cache` { #lru-cache-technical-details }
`@lru_cache` ändert die Funktion, die es dekoriert, dahingehend, denselben Wert zurückzugeben, der beim ersten Mal zurückgegeben wurde, anstatt ihn erneut zu berechnen und den Code der Funktion jedes Mal auszuführen.
@@ -434,7 +295,7 @@ sequenceDiagram
participant code as Code
participant function as say_hi()
participant execute as Funktion ausgeführt
participant execute as Funktion ausführen
rect rgba(0, 255, 0, .1)
code ->> function: say_hi(name="Camila")
@@ -476,7 +337,7 @@ Auf diese Weise verhält es sich fast so, als wäre es nur eine globale Variable
`@lru_cache` ist Teil von `functools`, welches Teil von Pythons Standardbibliothek ist. Weitere Informationen dazu finden Sie in der <a href="https://docs.python.org/3/library/functools.html#functools.lru_cache" class="external-link" target="_blank">Python Dokumentation für `@lru_cache`</a>.
## Zusammenfassung
## Zusammenfassung { #recap }
Mit Pydantic Settings können Sie die Einstellungen oder Konfigurationen für Ihre Anwendung verwalten und dabei die gesamte Leistungsfähigkeit der Pydantic-Modelle nutzen.

View File

@@ -1,47 +1,41 @@
# Unteranwendungen Mounts
# Unteranwendungen Mounts { #sub-applications-mounts }
Wenn Sie zwei unabhängige FastAPI-Anwendungen mit deren eigenen unabhängigen OpenAPI und deren eigenen Dokumentationsoberflächen benötigen, können Sie eine Hauptanwendung haben und dann eine (oder mehrere) Unteranwendung(en) „mounten“.
## Mounten einer **FastAPI**-Anwendung
## Eine **FastAPI**-Anwendung mounten { #mounting-a-fastapi-application }
„Mounten“ („Einhängen“) bedeutet das Hinzufügen einer völlig „unabhängigen“ Anwendung an einem bestimmten Pfad, die sich dann um die Handhabung aller unter diesem Pfad liegenden _Pfadoperationen_ kümmert, welche in dieser Unteranwendung deklariert sind.
### Hauptanwendung
### Hauptanwendung { #top-level-application }
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
### Unteranwendung { #sub-application }
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
### Die Unteranwendung mounten { #mount-the-sub-application }
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
### Die automatische API-Dokumentation testen { #check-the-automatic-api-docs }
Führen Sie nun `uvicorn` mit der Hauptanwendung aus. Wenn Ihre Datei `main.py` lautet, wäre das:
Führen Sie nun den `fastapi`-Befehl mit Ihrer Datei aus:
<div class="termy">
```console
$ uvicorn main:app --reload
$ fastapi dev main.py
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
@@ -62,7 +56,7 @@ Sie sehen die automatische API-Dokumentation für die Unteranwendung, welche nur
Wenn Sie versuchen, mit einer der beiden Benutzeroberflächen zu interagieren, funktionieren diese ordnungsgemäß, da der Browser mit jeder spezifischen Anwendung oder Unteranwendung kommunizieren kann.
### Technische Details: `root_path`
### Technische Details: `root_path` { #technical-details-root-path }
Wenn Sie eine Unteranwendung wie oben beschrieben mounten, kümmert sich FastAPI darum, den Mount-Pfad für die Unteranwendung zu kommunizieren, mithilfe eines Mechanismus aus der ASGI-Spezifikation namens `root_path`.

View File

@@ -1,4 +1,4 @@
# Templates
# Templates { #templates }
Sie können jede gewünschte Template-Engine mit **FastAPI** verwenden.
@@ -6,9 +6,9 @@ Eine häufige Wahl ist Jinja2, dasselbe, was auch von Flask und anderen Tools ve
Es gibt Werkzeuge zur einfachen Konfiguration, die Sie direkt in Ihrer **FastAPI**-Anwendung verwenden können (bereitgestellt von Starlette).
## Abhängigkeiten installieren
## Abhängigkeiten installieren { #install-dependencies }
Installieren Sie `jinja2`:
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und `jinja2` installieren:
<div class="termy">
@@ -20,39 +20,46 @@ $ pip install jinja2
</div>
## Verwendung von `Jinja2Templates`
## `Jinja2Templates` verwenden { #using-jinja2templates }
* Importieren Sie `Jinja2Templates`.
* Erstellen Sie ein `templates`-Objekt, das Sie später wiederverwenden können.
* 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.
* Deklarieren Sie einen `<abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Request</abbr>`-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“-<abbr title="Dictionary Zuordnungstabelle: In anderen Sprachen auch Hash, Map, Objekt, Assoziatives Array genannt">Dictionary</abbr> 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"
Vor FastAPI 0.108.0 und Starlette 0.29.0 war `name` der erste Parameter.
/// note | Hinweis
Außerdem wurde in früheren Versionen das `request`-Objekt als Teil der Schlüssel-Wert-Paare im Kontext für Jinja2 übergeben.
Vor FastAPI 0.108.0 und Starlette 0.29.0 war `name` der erste Parameter.
!!! tip "Tipp"
Durch die Deklaration von `response_class=HTMLResponse` kann die Dokumentationsoberfläche erkennen, dass die Response HTML sein wird.
Außerdem wurde in früheren Versionen das `request`-Objekt als Teil der Schlüssel-Wert-Paare im Kontext für Jinja2 übergeben.
!!! note "Technische Details"
Sie können auch `from starlette.templating import Jinja2Templates` verwenden.
///
**FastAPI** bietet dasselbe `starlette.templating` auch via `fastapi.templating` an, als Annehmlichkeit für Sie, den Entwickler. Es kommt aber direkt von Starlette. Das Gleiche gilt für `Request` und `StaticFiles`.
/// tip | Tipp
## Templates erstellen
Durch die Deklaration von `response_class=HTMLResponse` kann die Dokumentationsoberfläche erkennen, dass die <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr> HTML sein wird.
///
/// note | Technische Details
Sie können auch `from starlette.templating import Jinja2Templates` verwenden.
**FastAPI** bietet dasselbe `starlette.templating` auch via `fastapi.templating` an, als Annehmlichkeit für Sie, den Entwickler. Aber die meisten der verfügbaren Responses kommen direkt von Starlette. Das Gleiche gilt für `Request` und `StaticFiles`.
///
## Templates erstellen { #writing-templates }
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
### Template-Kontextwerte { #template-context-values }
Im HTML, welches enthält:
@@ -76,7 +83,7 @@ Mit beispielsweise einer ID `42` würde das wie folgt gerendert werden:
Item ID: 42
```
### Template-`url_for`-Argumente
### Template-`url_for`-Argumente { #template-url-for-arguments }
Sie können `url_for()` auch innerhalb des Templates verwenden, es nimmt als Argumente dieselben Argumente, die von Ihrer *Pfadoperation-Funktion* verwendet werden.
@@ -98,22 +105,22 @@ Mit beispielsweise der ID `42` würde dies Folgendes ergeben:
<a href="/items/42">
```
## Templates und statische Dateien
## Templates und statische Dateien { #templates-and-static-files }
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.
Und da Sie `StaticFiles` verwenden, wird diese CSS-Datei automatisch von Ihrer **FastAPI**-Anwendung unter der URL `/static/styles.css` ausgeliefert.
## Mehr Details
## Mehr Details { #more-details }
Weitere Informationen, einschließlich, wie man Templates testet, finden Sie in der <a href="https://www.starlette.io/templates/" class="external-link" target="_blank">Starlette Dokumentation zu Templates</a>.
Weitere Informationen, einschließlich, wie man Templates testet, finden Sie in <a href="https://www.starlette.dev/templates/" class="external-link" target="_blank">Starlettes Dokumentation zu Templates</a>.

View File

@@ -1,6 +1,6 @@
# Testen mit Ersatz für Abhängigkeiten
# Testen mit Überschreibungen für Abhängigkeiten { #testing-dependencies-with-overrides }
## Abhängigkeiten beim Testen überschreiben
## Abhängigkeiten beim Testen überschreiben { #overriding-dependencies-during-testing }
Es gibt einige Szenarien, in denen Sie beim Testen möglicherweise eine Abhängigkeit überschreiben möchten.
@@ -8,68 +8,37 @@ Sie möchten nicht, dass die ursprüngliche Abhängigkeit ausgeführt wird (und
Stattdessen möchten Sie eine andere Abhängigkeit bereitstellen, die nur während Tests (möglicherweise nur bei einigen bestimmten Tests) verwendet wird und einen Wert bereitstellt, der dort verwendet werden kann, wo der Wert der ursprünglichen Abhängigkeit verwendet wurde.
### Anwendungsfälle: Externer Service
### Anwendungsfälle: Externer Service { #use-cases-external-service }
Ein Beispiel könnte sein, dass Sie einen externen Authentifizierungsanbieter haben, mit dem Sie sich verbinden müssen.
Sie senden ihm ein Token und er gibt einen authentifizierten Benutzer zurück.
Dieser Anbieter berechnet Ihnen möglicherweise Gebühren pro Anfrage, und der Aufruf könnte etwas länger dauern, als wenn Sie einen vordefinierten Scheinbenutzer für Tests hätten.
Dieser Anbieter berechnet Ihnen möglicherweise Gebühren pro <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Request</abbr>, und der Aufruf könnte etwas länger dauern, als wenn Sie einen vordefinierten <abbr title="Platzhalter, vorgetäuscht, zum Schein">Mock</abbr>-Benutzer für Tests hätten.
Sie möchten den externen Anbieter wahrscheinlich einmal testen, ihn aber nicht unbedingt bei jedem weiteren ausgeführten Test aufrufen.
In diesem Fall können Sie die Abhängigkeit, die diesen Anbieter aufruft, überschreiben und eine benutzerdefinierte Abhängigkeit verwenden, die einen Scheinbenutzer zurückgibt, nur für Ihre Tests.
In diesem Fall können Sie die Abhängigkeit, die diesen Anbieter aufruft, überschreiben und eine benutzerdefinierte Abhängigkeit verwenden, die einen Mock-Benutzer zurückgibt, nur für Ihre Tests.
### Verwenden Sie das Attribut `app.dependency_overrides`.
### Das Attribut `app.dependency_overrides` verwenden { #use-the-app-dependency-overrides-attribute }
Für diese Fälle verfügt Ihre **FastAPI**-Anwendung über das Attribut `app.dependency_overrides`, bei diesem handelt sich um ein einfaches `dict`.
Für diese Fälle verfügt Ihre **FastAPI**-Anwendung über das Attribut `app.dependency_overrides`, bei diesem handelt sich um ein einfaches <abbr title="Dictionary Zuordnungstabelle: In anderen Sprachen auch Hash, Map, Objekt, Assoziatives Array genannt">`dict`</abbr>.
Um eine Abhängigkeit für das Testen zu überschreiben, geben Sie als Schlüssel die ursprüngliche Abhängigkeit (eine Funktion) und als Wert Ihre Überschreibung der Abhängigkeit (eine andere Funktion) ein.
Und dann ruft **FastAPI** diese Überschreibung anstelle der ursprünglichen Abhängigkeit auf.
=== "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!}
```
/// tip | Tipp
=== "Python 3.9+"
Sie können eine Überschreibung für eine Abhängigkeit festlegen, die an einer beliebigen Stelle in Ihrer **FastAPI**-Anwendung verwendet wird.
```Python hl_lines="28-29 32"
{!> ../../../docs_src/dependency_testing/tutorial001_an_py39.py!}
```
Die ursprüngliche Abhängigkeit könnte in einer *Pfadoperation-Funktion*, einem *Pfadoperation-Dekorator* (wenn Sie den Rückgabewert nicht verwenden), einem `.include_router()`-Aufruf, usw. verwendet werden.
=== "Python 3.8+"
FastAPI kann sie in jedem Fall überschreiben.
```Python hl_lines="29-30 33"
{!> ../../../docs_src/dependency_testing/tutorial001_an.py!}
```
=== "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!}
```
=== "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"
Sie können eine Überschreibung für eine Abhängigkeit festlegen, die an einer beliebigen Stelle in Ihrer **FastAPI**-Anwendung verwendet wird.
Die ursprüngliche Abhängigkeit könnte in einer *Pfadoperation-Funktion*, einem *Pfadoperation-Dekorator* (wenn Sie den Rückgabewert nicht verwenden), einem `.include_router()`-Aufruf, usw. verwendet werden.
FastAPI kann sie in jedem Fall überschreiben.
///
Anschließend können Sie Ihre Überschreibungen zurücksetzen (entfernen), indem Sie `app.dependency_overrides` auf ein leeres `dict` setzen:
@@ -77,5 +46,9 @@ Anschließend können Sie Ihre Überschreibungen zurücksetzen (entfernen), inde
app.dependency_overrides = {}
```
!!! 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.
/// 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

@@ -1,7 +1,12 @@
# Events testen: Hochfahren Herunterfahren
# Events testen: Lifespan und Startup Shutdown { #testing-events-lifespan-and-startup-shutdown }
Wenn Sie in Ihren Tests Ihre Event-Handler (`startup` und `shutdown`) ausführen wollen, können Sie den `TestClient` mit einer `with`-Anweisung verwenden:
Wenn Sie `lifespan` in Ihren Tests ausführen müssen, 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/tutorial004.py hl[9:15,18,27:28,30:32,41:43] *}
Sie können mehr Details unter [„Lifespan in Tests ausführen in der offiziellen Starlette-Dokumentation.“](https://www.starlette.dev/lifespan/#running-lifespan-in-tests) nachlesen.
Für die deprecateten Events <abbr title="Hochfahren">`startup`</abbr> und <abbr title="Herunterfahren">`shutdown`</abbr> können Sie den `TestClient` wie folgt verwenden:
{* ../../docs_src/app_testing/tutorial003.py hl[9:12,20:24] *}

View File

@@ -1,12 +1,13 @@
# WebSockets testen
# WebSockets testen { #testing-websockets }
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"
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>.
/// note | Hinweis
Weitere Informationen finden Sie in Starlettes Dokumentation zum <a href="https://www.starlette.dev/testclient/#testing-websocket-sessions" class="external-link" target="_blank">Testen von WebSockets</a>.
///

View File

@@ -1,6 +1,6 @@
# Den Request direkt verwenden
# Den Request direkt verwenden { #using-the-request-directly }
Bisher haben Sie die Teile des Requests, die Sie benötigen, mithilfe von deren Typen deklariert.
Bisher haben Sie die Teile des <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Requests</abbr>, die Sie benötigen, mithilfe von deren Typen deklariert.
Daten nehmend von:
@@ -13,9 +13,9 @@ Und indem Sie das tun, validiert **FastAPI** diese Daten, konvertiert sie und ge
Es gibt jedoch Situationen, in denen Sie möglicherweise direkt auf das `Request`-Objekt zugreifen müssen.
## Details zum `Request`-Objekt
## Details zum `Request`-Objekt { #details-about-the-request-object }
Da **FastAPI** unter der Haube eigentlich **Starlette** ist, mit einer Ebene von mehreren Tools darüber, können Sie Starlette's <a href="https://www.starlette.io/requests/" class="external-link" target="_blank">`Request`</a>-Objekt direkt verwenden, wenn Sie es benötigen.
Da **FastAPI** unter der Haube eigentlich **Starlette** ist, mit einer Ebene von mehreren Tools darüber, können Sie Starlettes <a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">`Request`</a>-Objekt direkt verwenden, wenn Sie es benötigen.
Das bedeutet allerdings auch, dass, wenn Sie Daten direkt vom `Request`-Objekt nehmen (z. B. dessen Body lesen), diese von FastAPI nicht validiert, konvertiert oder dokumentiert werden (mit OpenAPI, für die automatische API-Benutzeroberfläche).
@@ -23,30 +23,34 @@ Obwohl jeder andere normal deklarierte Parameter (z. B. der Body, mit einem Pyda
Es gibt jedoch bestimmte Fälle, in denen es nützlich ist, auf das `Request`-Objekt zuzugreifen.
## Das `Request`-Objekt direkt verwenden
## Das `Request`-Objekt direkt verwenden { #use-the-request-object-directly }
Angenommen, Sie möchten auf die IP-Adresse/den Host des Clients in Ihrer *Pfadoperation-Funktion* zugreifen.
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"
Beachten Sie, dass wir in diesem Fall einen Pfad-Parameter zusätzlich zum Request-Parameter deklarieren.
/// tip | Tipp
Der Pfad-Parameter wird also extrahiert, validiert, in den spezifizierten Typ konvertiert und mit OpenAPI annotiert.
Beachten Sie, dass wir in diesem Fall einen Pfad-Parameter zusätzlich zum Request-Parameter deklarieren.
Auf die gleiche Weise können Sie wie gewohnt jeden anderen Parameter deklarieren und zusätzlich auch den `Request` erhalten.
Der Pfad-Parameter wird also extrahiert, validiert, in den spezifizierten Typ konvertiert und mit OpenAPI annotiert.
## `Request`-Dokumentation
Auf die gleiche Weise können Sie wie gewohnt jeden anderen Parameter deklarieren und zusätzlich auch den `Request` erhalten.
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"
Sie können auch `from starlette.requests import Request` verwenden.
## `Request`-Dokumentation { #request-documentation }
**FastAPI** stellt es direkt zur Verfügung, als Komfort für Sie, den Entwickler. Es kommt aber direkt von Starlette.
Weitere Details zum <a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">`Request`-Objekt finden Sie in der offiziellen Starlette-Dokumentation</a>.
/// note | Technische Details
Sie können auch `from starlette.requests import Request` verwenden.
**FastAPI** stellt es direkt zur Verfügung, als Komfort für Sie, den Entwickler. Es kommt aber direkt von Starlette.
///

View File

@@ -1,10 +1,10 @@
# WebSockets
# WebSockets { #websockets }
Sie können <a href="https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API" class="external-link" target="_blank">WebSockets</a> mit **FastAPI** verwenden.
## `WebSockets` installieren
## `websockets` installieren { #install-websockets }
Zuerst müssen Sie `WebSockets` installieren:
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und `websockets` installieren (eine Python-Bibliothek, die die Verwendung des „WebSocket“-Protokolls erleichtert):
<div class="termy">
@@ -16,9 +16,9 @@ $ pip install websockets
</div>
## WebSockets-Client
## WebSockets-Client { #websockets-client }
### In Produktion
### In Produktion { #in-production }
In Ihrem Produktionssystem haben Sie wahrscheinlich ein Frontend, das mit einem modernen Framework wie React, Vue.js oder Angular erstellt wurde.
@@ -36,43 +36,40 @@ Das ist natürlich nicht optimal und man würde das nicht in der Produktion mach
In der Produktion hätten Sie eine der oben genannten Optionen.
Aber es ist die einfachste Möglichkeit, sich auf die Serverseite von WebSockets zu konzentrieren und ein funktionierendes Beispiel zu haben:
Aber es ist der einfachste Weg, 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
## Einen `websocket` erstellen { #create-a-websocket }
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"
Sie können auch `from starlette.websockets import WebSocket` verwenden.
/// note | Technische Details
**FastAPI** stellt den gleichen `WebSocket` direkt zur Verfügung, als Annehmlichkeit für Sie, den Entwickler. Er kommt aber direkt von Starlette.
Sie könnten auch `from starlette.websockets import WebSocket` verwenden.
## Nachrichten erwarten und Nachrichten senden
**FastAPI** stellt den gleichen `WebSocket` direkt zur Verfügung, als Annehmlichkeit für Sie, den Entwickler. Er kommt aber direkt von Starlette.
///
## Nachrichten erwarten und Nachrichten senden { #await-for-messages-and-send-messages }
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.
## Es ausprobieren
## Es ausprobieren { #try-it }
Wenn Ihre Datei `main.py` heißt, führen Sie Ihre Anwendung so aus:
<div class="termy">
```console
$ uvicorn main:app --reload
$ fastapi dev main.py
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
@@ -99,7 +96,7 @@ Sie können viele Nachrichten senden (und empfangen):
Und alle verwenden dieselbe WebSocket-Verbindung.
## Verwendung von `Depends` und anderen
## Verwendung von `Depends` und anderen { #using-depends-and-others }
In WebSocket-Endpunkten können Sie Folgendes aus `fastapi` importieren und verwenden:
@@ -112,55 +109,24 @@ 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*:
=== "Python 3.10+"
{* ../../docs_src/websockets/tutorial002_an_py310.py hl[68:69,82] *}
```Python hl_lines="68-69 82"
{!> ../../../docs_src/websockets/tutorial002_an_py310.py!}
```
/// info | Info
=== "Python 3.9+"
Da es sich um einen WebSocket handelt, macht es keinen Sinn, eine `HTTPException` auszulösen, stattdessen lösen wir eine `WebSocketException` aus.
```Python hl_lines="68-69 82"
{!> ../../../docs_src/websockets/tutorial002_an_py39.py!}
```
Sie können einen „Closing“-Code verwenden, aus den <a href="https://tools.ietf.org/html/rfc6455#section-7.4.1" class="external-link" target="_blank">gültigen Codes, die in der Spezifikation definiert sind</a>.
=== "Python 3.8+"
///
```Python hl_lines="69-70 83"
{!> ../../../docs_src/websockets/tutorial002_an.py!}
```
=== "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!}
```
=== "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!}
```
!!! info
Da es sich um einen WebSocket handelt, macht es keinen Sinn, eine `HTTPException` auszulösen, stattdessen lösen wir eine `WebSocketException` aus.
Sie können einen „Closing“-Code verwenden, aus den <a href="https://tools.ietf.org/html/rfc6455#section-7.4.1" class="external-link" target="_blank">gültigen Codes, die in der Spezifikation definiert sind</a>.
### WebSockets mit Abhängigkeiten ausprobieren
### WebSockets mit Abhängigkeiten ausprobieren { #try-the-websockets-with-dependencies }
Wenn Ihre Datei `main.py` heißt, führen Sie Ihre Anwendung mit Folgendem aus:
<div class="termy">
```console
$ uvicorn main:app --reload
$ fastapi dev main.py
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
@@ -174,28 +140,21 @@ Dort können Sie einstellen:
* Die „Item ID“, die im Pfad verwendet wird.
* Das „Token“, das als Query-Parameter verwendet wird.
!!! tip "Tipp"
Beachten Sie, dass der Query-„Token“ von einer Abhängigkeit verarbeitet wird.
/// tip | Tipp
Beachten Sie, dass die Query `token` von einer Abhängigkeit verarbeitet wird.
///
Damit können Sie den WebSocket verbinden und dann Nachrichten senden und empfangen:
<img src="/img/tutorial/websockets/image05.png">
## Verbindungsabbrüche und mehreren Clients handhaben
## Verbindungsabbrüche und mehrere Clients handhaben { #handling-disconnections-and-multiple-clients }
Wenn eine WebSocket-Verbindung geschlossen wird, löst `await websocket.receive_text()` eine `WebSocketDisconnect`-Exception aus, die Sie dann wie in folgendem Beispiel abfangen und behandeln können.
=== "Python 3.9+"
```Python hl_lines="79-81"
{!> ../../../docs_src/websockets/tutorial003_py39.py!}
```
=== "Python 3.8+"
```Python hl_lines="81-83"
{!> ../../../docs_src/websockets/tutorial003.py!}
```
{* ../../docs_src/websockets/tutorial003_py39.py hl[79:81] *}
Zum Ausprobieren:
@@ -209,16 +168,19 @@ Das wird die Ausnahme `WebSocketDisconnect` auslösen und alle anderen Clients e
Client #1596980209979 left the chat
```
!!! tip "Tipp"
Die obige Anwendung ist ein minimales und einfaches Beispiel, das zeigt, wie Nachrichten verarbeitet und an mehrere WebSocket-Verbindungen gesendet werden.
/// tip | Tipp
Beachten Sie jedoch, dass, da alles nur im Speicher in einer einzigen Liste verwaltet wird, es nur funktioniert, während der Prozess ausgeführt wird, und nur mit einem einzelnen Prozess.
Die obige Anwendung ist ein minimales und einfaches Beispiel, das zeigt, wie Nachrichten verarbeitet und an mehrere WebSocket-Verbindungen gesendet werden.
Wenn Sie etwas benötigen, das sich leicht in FastAPI integrieren lässt, aber robuster ist und von Redis, PostgreSQL und anderen unterstützt wird, sehen Sie sich <a href="https://github.com/encode/broadcaster" class="external-link" target="_blank">encode/broadcaster</a> an.
Beachten Sie jedoch, dass, da alles nur im Speicher in einer einzigen Liste verwaltet wird, es nur funktioniert, während der Prozess ausgeführt wird, und nur mit einem einzelnen Prozess.
## Mehr Informationen
Wenn Sie etwas benötigen, das sich leicht in FastAPI integrieren lässt, aber robuster ist und von Redis, PostgreSQL und anderen unterstützt wird, sehen Sie sich <a href="https://github.com/encode/broadcaster" class="external-link" target="_blank">encode/broadcaster</a> an.
///
## Mehr Informationen { #more-info }
Weitere Informationen zu Optionen finden Sie in der Dokumentation von Starlette:
* <a href="https://www.starlette.io/websockets/" class="external-link" target="_blank">Die `WebSocket`-Klasse</a>.
* <a href="https://www.starlette.io/endpoints/#websocketendpoint" class="external-link" target="_blank">Klassen-basierte Handhabung von WebSockets</a>.
* <a href="https://www.starlette.dev/websockets/" class="external-link" target="_blank">Die `WebSocket`-Klasse</a>.
* <a href="https://www.starlette.dev/endpoints/#websocketendpoint" class="external-link" target="_blank">Klassen-basierte Handhabung von WebSockets</a>.

View File

@@ -1,10 +1,10 @@
# WSGI inkludieren Flask, Django und andere
# WSGI inkludieren Flask, Django und andere { #including-wsgi-flask-django-others }
Sie können WSGI-Anwendungen mounten, wie Sie es in [Unteranwendungen Mounts](sub-applications.md){.internal-link target=_blank}, [Hinter einem Proxy](behind-a-proxy.md){.internal-link target=_blank} gesehen haben.
Dazu können Sie die `WSGIMiddleware` verwenden und damit Ihre WSGI-Anwendung wrappen, zum Beispiel Flask, Django usw.
## `WSGIMiddleware` verwenden
## `WSGIMiddleware` verwenden { #using-wsgimiddleware }
Sie müssen `WSGIMiddleware` importieren.
@@ -12,17 +12,15 @@ 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,3] *}
## Es ansehen
## Es testen { #check-it }
Jetzt wird jede Anfrage unter dem Pfad `/v1/` von der Flask-Anwendung verarbeitet.
Jetzt wird jeder <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Request</abbr> unter dem Pfad `/v1/` von der Flask-Anwendung verarbeitet.
Und der Rest wird von **FastAPI** gehandhabt.
Wenn Sie das mit Uvicorn ausführen und auf <a href="http://localhost:8000/v1/" class="external-link" target="_blank">http://localhost:8000/v1/</a> gehen, sehen Sie die Response von Flask:
Wenn Sie das ausführen und auf <a href="http://localhost:8000/v1/" class="external-link" target="_blank">http://localhost:8000/v1/</a> gehen, sehen Sie die <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr> von Flask:
```txt
Hello, World from Flask!

View File

@@ -1,8 +1,8 @@
# Alternativen, Inspiration und Vergleiche
# Alternativen, Inspiration und Vergleiche { #alternatives-inspiration-and-comparisons }
Was hat **FastAPI** inspiriert, ein Vergleich zu Alternativen, und was FastAPI von diesen gelernt hat.
Was hat **FastAPI** inspiriert, wie es sich im Vergleich zu Alternativen verhält und was es von ihnen gelernt hat.
## Einführung
## Einführung { #intro }
**FastAPI** würde ohne die frühere Arbeit anderer nicht existieren.
@@ -12,17 +12,17 @@ Ich habe die Schaffung eines neuen Frameworks viele Jahre lang vermieden. Zuerst
Aber irgendwann gab es keine andere Möglichkeit, als etwas zu schaffen, das all diese Funktionen bereitstellte, die besten Ideen früherer Tools aufnahm und diese auf die bestmögliche Weise kombinierte, wobei Sprachfunktionen verwendet wurden, die vorher noch nicht einmal verfügbar waren (Python 3.6+ Typhinweise).
## Vorherige Tools
## Vorherige Tools { #previous-tools }
### <a href="https://www.djangoproject.com/" class="external-link" target="_blank">Django</a>
### <a href="https://www.djangoproject.com/" class="external-link" target="_blank">Django</a> { #django }
Es ist das beliebteste Python-Framework und genießt großes Vertrauen. Es wird zum Aufbau von Systemen wie Instagram verwendet.
Ist relativ eng mit relationalen Datenbanken (wie MySQL oder PostgreSQL) gekoppelt, daher ist es nicht sehr einfach, eine NoSQL-Datenbank (wie Couchbase, MongoDB, Cassandra, usw.) als Hauptspeicherengine zu verwenden.
Es ist relativ eng mit relationalen Datenbanken (wie MySQL oder PostgreSQL) gekoppelt, daher ist es nicht sehr einfach, eine NoSQL-Datenbank (wie Couchbase, MongoDB, Cassandra, usw.) als Hauptspeicherengine zu verwenden.
Es wurde erstellt, um den HTML-Code im Backend zu generieren, nicht um APIs zu erstellen, die von einem modernen Frontend (wie React, Vue.js und Angular) oder von anderen Systemen (wie <abbr title="Internet of Things">IoT</abbr>-Geräten) verwendet werden, um mit ihm zu kommunizieren.
Es wurde erstellt, um den HTML-Code im Backend zu generieren, nicht um APIs zu erstellen, die von einem modernen Frontend (wie React, Vue.js und Angular) oder von anderen Systemen (wie <abbr title="Internet of Things Internet der Dinge">IoT</abbr>-Geräten) verwendet werden, um mit ihm zu kommunizieren.
### <a href="https://www.django-rest-framework.org/" class="external-link" target="_blank">Django REST Framework</a>
### <a href="https://www.django-rest-framework.org/" class="external-link" target="_blank">Django REST Framework</a> { #django-rest-framework }
Das Django REST Framework wurde als flexibles Toolkit zum Erstellen von Web-APIs unter Verwendung von Django entwickelt, um dessen API-Möglichkeiten zu verbessern.
@@ -30,14 +30,19 @@ 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"
Das Django REST Framework wurde von Tom Christie erstellt. Derselbe Schöpfer von Starlette und Uvicorn, auf denen **FastAPI** basiert.
/// 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**"
Eine automatische API-Dokumentationsoberfläche zu haben.
///
### <a href="https://flask.palletsprojects.com" class="external-link" target="_blank">Flask</a>
/// check | Inspirierte **FastAPI**
Eine automatische API-Dokumentationsoberfläche zu haben.
///
### <a href="https://flask.palletsprojects.com" class="external-link" target="_blank">Flask</a> { #flask }
Flask ist ein „Mikroframework“, es enthält weder Datenbankintegration noch viele der Dinge, die standardmäßig in Django enthalten sind.
@@ -51,13 +56,15 @@ 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**"
Ein Mikroframework zu sein. Es einfach zu machen, die benötigten Tools und Teile zu kombinieren.
/// check | Inspirierte **FastAPI**
Über ein einfaches und benutzerfreundliches Routingsystem zu verfügen.
Ein Mikroframework zu sein. Es einfach zu machen, die benötigten Tools und Teile zu kombinieren.
Über ein einfaches und benutzerfreundliches Routingsystem zu verfügen.
### <a href="https://requests.readthedocs.io" class="external-link" target="_blank">Requests</a>
///
### <a href="https://requests.readthedocs.io" class="external-link" target="_blank">Requests</a> { #requests }
**FastAPI** ist eigentlich keine Alternative zu **Requests**. Der Umfang der beiden ist sehr unterschiedlich.
@@ -75,7 +82,7 @@ Aus diesem Grund heißt es auf der offiziellen Website:
> Requests ist eines der am häufigsten heruntergeladenen Python-Packages aller Zeiten
Die Art und Weise, wie Sie es verwenden, ist sehr einfach. Um beispielsweise einen `GET`-Request zu machen, würden Sie schreiben:
Die Art und Weise, wie Sie es verwenden, ist sehr einfach. Um beispielsweise einen `GET`-<abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Request</abbr> zu machen, würden Sie schreiben:
```Python
response = requests.get("http://example.com/some/url")
@@ -91,13 +98,15 @@ def read_url():
Sehen Sie sich die Ähnlichkeiten in `requests.get(...)` und `@app.get(...)` an.
!!! check "Inspirierte **FastAPI**"
* Über eine einfache und intuitive API zu verfügen.
* HTTP-Methodennamen (Operationen) direkt, auf einfache und intuitive Weise zu verwenden.
* Vernünftige Standardeinstellungen zu haben, aber auch mächtige Einstellungsmöglichkeiten.
/// check | Inspirierte **FastAPI**
* Über eine einfache und intuitive API zu verfügen.
* HTTP-Methodennamen (Operationen) direkt, auf einfache und intuitive Weise zu verwenden.
* Vernünftige Standardeinstellungen zu haben, aber auch mächtige Einstellungsmöglichkeiten.
### <a href="https://swagger.io/" class="external-link" target="_blank">Swagger</a> / <a href="https://github.com/OAI/OpenAPI-Specification/" class="external-link" target="_blank">OpenAPI</a>
///
### <a href="https://swagger.io/" class="external-link" target="_blank">Swagger</a> / <a href="https://github.com/OAI/OpenAPI-Specification/" class="external-link" target="_blank">OpenAPI</a> { #swagger-openapi }
Die Hauptfunktion, die ich vom Django REST Framework haben wollte, war die automatische API-Dokumentation.
@@ -109,23 +118,26 @@ 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**"
Einen offenen Standard für API-Spezifikationen zu übernehmen und zu verwenden, anstelle eines benutzerdefinierten Schemas.
/// check | Inspirierte **FastAPI**
Und Standard-basierte Tools für die Oberfläche zu integrieren:
Einen offenen Standard für API-Spezifikationen zu übernehmen und zu verwenden, anstelle eines benutzerdefinierten Schemas.
* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>
* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>
Und Standard-basierte Tools für die Oberfläche zu integrieren:
Diese beiden wurden ausgewählt, weil sie ziemlich beliebt und stabil sind, aber bei einer schnellen Suche könnten Sie Dutzende alternativer Benutzeroberflächen für OpenAPI finden (welche Sie mit **FastAPI** verwenden können).
* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>
* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>
### Flask REST Frameworks
Diese beiden wurden ausgewählt, weil sie ziemlich beliebt und stabil sind, aber bei einer schnellen Suche könnten Sie Dutzende alternativer Benutzeroberflächen für OpenAPI finden (welche Sie mit **FastAPI** verwenden können).
///
### Flask REST Frameworks { #flask-rest-frameworks }
Es gibt mehrere Flask REST Frameworks, aber nachdem ich die Zeit und Arbeit investiert habe, sie zu untersuchen, habe ich festgestellt, dass viele nicht mehr unterstützt werden oder abgebrochen wurden und dass mehrere fortbestehende Probleme sie unpassend machten.
### <a href="https://marshmallow.readthedocs.io/en/stable/" class="external-link" target="_blank">Marshmallow</a>
### <a href="https://marshmallow.readthedocs.io/en/stable/" class="external-link" target="_blank">Marshmallow</a> { #marshmallow }
Eine der von API-Systemen benötigen Hauptfunktionen ist die Daten-<abbr title="Auch „Marshalling“, „Konvertierung“ genannt">Serialisierung</abbr>, welche Daten aus dem Code (Python) entnimmt und in etwas umwandelt, was durch das Netzwerk gesendet werden kann. Beispielsweise das Konvertieren eines Objekts, welches Daten aus einer Datenbank enthält, in ein JSON-Objekt. Konvertieren von `datetime`-Objekten in Strings, usw.
Eine der von API-Systemen benötigten Hauptfunktionen ist die Daten-<abbr title="Auch „Marshalling“, „Konvertierung“ genannt">Serialisierung</abbr>, welche Daten aus dem Code (Python) entnimmt und in etwas umwandelt, was durch das Netzwerk gesendet werden kann. Beispielsweise das Konvertieren eines Objekts, welches Daten aus einer Datenbank enthält, in ein JSON-Objekt. Konvertieren von `datetime`-Objekten in Strings, usw.
Eine weitere wichtige Funktion, benötigt von APIs, ist die Datenvalidierung, welche sicherstellt, dass die Daten unter gegebenen Umständen gültig sind. Zum Beispiel, dass ein Feld ein `int` ist und kein zufälliger String. Das ist besonders nützlich für hereinkommende Daten.
@@ -133,12 +145,15 @@ Ohne ein Datenvalidierungssystem müssten Sie alle Prüfungen manuell im Code du
Für diese Funktionen wurde Marshmallow entwickelt. Es ist eine großartige Bibliothek und ich habe sie schon oft genutzt.
Aber sie wurde erstellt, bevor Typhinweise in Python existierten. Um also ein <abbr title="die Definition, wie Daten geformt sein werden sollen">Schema</abbr> zu definieren, müssen Sie bestimmte Werkzeuge und Klassen verwenden, die von Marshmallow bereitgestellt werden.
Aber sie wurde erstellt, bevor Typhinweise in Python existierten. Um also ein <abbr title="die Definition, wie Daten geformt sein sollen">Schema</abbr> zu definieren, müssen Sie bestimmte Werkzeuge und Klassen verwenden, die von Marshmallow bereitgestellt werden.
!!! check "Inspirierte **FastAPI**"
Code zu verwenden, um „Schemas“ zu definieren, welche Datentypen und Validierung automatisch bereitstellen.
/// check | Inspirierte **FastAPI**
### <a href="https://webargs.readthedocs.io/en/latest/" class="external-link" target="_blank">Webargs</a>
Code zu verwenden, um „Schemas“ zu definieren, welche Datentypen und Validierung automatisch bereitstellen.
///
### <a href="https://webargs.readthedocs.io/en/latest/" class="external-link" target="_blank">Webargs</a> { #webargs }
Eine weitere wichtige Funktion, die von APIs benötigt wird, ist das <abbr title="Lesen und Konvertieren nach Python-Daten">Parsen</abbr> von Daten aus eingehenden Requests.
@@ -148,13 +163,19 @@ Es verwendet unter der Haube Marshmallow, um die Datenvalidierung durchzuführen
Es ist ein großartiges Tool und ich habe es auch oft verwendet, bevor ich **FastAPI** hatte.
!!! info
Webargs wurde von denselben Marshmallow-Entwicklern erstellt.
/// info | Info
!!! check "Inspirierte **FastAPI**"
Eingehende Requestdaten automatisch zu validieren.
Webargs wurde von denselben Marshmallow-Entwicklern erstellt.
### <a href="https://apispec.readthedocs.io/en/stable/" class="external-link" target="_blank">APISpec</a>
///
/// check | Inspirierte **FastAPI**
Eingehende Requestdaten automatisch zu validieren.
///
### <a href="https://apispec.readthedocs.io/en/stable/" class="external-link" target="_blank">APISpec</a> { #apispec }
Marshmallow und Webargs bieten Validierung, Parsen und Serialisierung als Plugins.
@@ -172,14 +193,19 @@ Aber dann haben wir wieder das Problem einer Mikrosyntax innerhalb eines Python-
Der Texteditor kann dabei nicht viel helfen. Und wenn wir Parameter oder Marshmallow-Schemas ändern und vergessen, auch den YAML-Docstring zu ändern, wäre das generierte Schema veraltet.
!!! info
APISpec wurde von denselben Marshmallow-Entwicklern erstellt.
/// info | Info
APISpec wurde von denselben Marshmallow-Entwicklern erstellt.
!!! check "Inspirierte **FastAPI**"
Den offenen Standard für APIs, OpenAPI, zu unterstützen.
///
### <a href="https://flask-apispec.readthedocs.io/en/latest/" class="external-link" target="_blank">Flask-apispec</a>
/// check | Inspirierte **FastAPI**
Den offenen Standard für APIs, OpenAPI, zu unterstützen.
///
### <a href="https://flask-apispec.readthedocs.io/en/latest/" class="external-link" target="_blank">Flask-apispec</a> { #flask-apispec }
Hierbei handelt es sich um ein Flask-Plugin, welches Webargs, Marshmallow und APISpec miteinander verbindet.
@@ -199,13 +225,19 @@ Die Verwendung führte zur Entwicklung mehrerer Flask-Full-Stack-Generatoren. Di
Und dieselben Full-Stack-Generatoren bildeten die Basis der [**FastAPI**-Projektgeneratoren](project-generation.md){.internal-link target=_blank}.
!!! info
Flask-apispec wurde von denselben Marshmallow-Entwicklern erstellt.
/// info | Info
!!! check "Inspirierte **FastAPI**"
Das OpenAPI-Schema automatisch zu generieren, aus demselben Code, welcher die Serialisierung und Validierung definiert.
Flask-apispec wurde von denselben Marshmallow-Entwicklern erstellt.
### <a href="https://nestjs.com/" class="external-link" target="_blank">NestJS</a> (und <a href="https://angular.io/" class="external-link" target="_blank">Angular</a>)
///
/// check | Inspirierte **FastAPI**
Das OpenAPI-Schema automatisch zu generieren, aus demselben Code, welcher die Serialisierung und Validierung definiert.
///
### <a href="https://nestjs.com/" class="external-link" target="_blank">NestJS</a> (und <a href="https://angular.io/" class="external-link" target="_blank">Angular</a>) { #nestjs-and-angular }
Dies ist nicht einmal Python, NestJS ist ein von Angular inspiriertes JavaScript (TypeScript) NodeJS Framework.
@@ -217,43 +249,55 @@ Da die Parameter mit TypeScript-Typen beschrieben werden (ähnlich den Python-Ty
Da TypeScript-Daten jedoch nach der Kompilierung nach JavaScript nicht erhalten bleiben, können die Typen nicht gleichzeitig die Validierung, Serialisierung und Dokumentation definieren. Aus diesem Grund und aufgrund einiger Designentscheidungen ist es für die Validierung, Serialisierung und automatische Schemagenerierung erforderlich, an vielen Stellen Dekoratoren hinzuzufügen. Es wird also ziemlich ausführlich.
Es kann nicht sehr gut mit verschachtelten Modellen umgehen. Wenn es sich beim JSON-Body in der Anfrage also um ein JSON-Objekt mit inneren Feldern handelt, die wiederum verschachtelte JSON-Objekte sind, kann er nicht richtig dokumentiert und validiert werden.
Es kann nicht sehr gut mit verschachtelten Modellen umgehen. Wenn es sich beim JSON-Body im Request 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**"
Python-Typen zu verwenden, um eine hervorragende Editorunterstützung zu erhalten.
/// check | Inspirierte **FastAPI**
Über ein leistungsstarkes Dependency Injection System zu verfügen. Eine Möglichkeit zu finden, Codeverdoppelung zu minimieren.
Python-Typen zu verwenden, um eine hervorragende Editorunterstützung zu erhalten.
### <a href="https://sanic.readthedocs.io/en/latest/" class="external-link" target="_blank">Sanic</a>
Über ein leistungsstarkes Dependency Injection System zu verfügen. Eine Möglichkeit zu finden, Codeverdoppelung zu minimieren.
///
### <a href="https://sanic.readthedocs.io/en/latest/" class="external-link" target="_blank">Sanic</a> { #sanic }
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"
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.
/// note | Technische Details
Hat eindeutig Uvicorn und Starlette inspiriert, welche derzeit in offenen Benchmarks schneller als Sanic sind.
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.
!!! check "Inspirierte **FastAPI**"
Einen Weg zu finden, eine hervorragende Performanz zu haben.
Hat eindeutig Uvicorn und Starlette inspiriert, welche derzeit in offenen Benchmarks schneller als Sanic sind.
Aus diesem Grund basiert **FastAPI** auf Starlette, da dieses das schnellste verfügbare Framework ist (getestet in Benchmarks von Dritten).
///
### <a href="https://falconframework.org/" class="external-link" target="_blank">Falcon</a>
/// check | Inspirierte **FastAPI**
Einen Weg zu finden, eine hervorragende Performanz zu haben.
Aus diesem Grund basiert **FastAPI** auf Starlette, da dieses das schnellste verfügbare Framework ist (getestet in Benchmarks von Dritten).
///
### <a href="https://falconframework.org/" class="external-link" target="_blank">Falcon</a> { #falcon }
Falcon ist ein weiteres leistungsstarkes Python-Framework. Es ist minimalistisch konzipiert und dient als Grundlage für andere Frameworks wie Hug.
Es ist so konzipiert, dass es über Funktionen verfügt, welche zwei Parameter empfangen, einen „Request“ und eine „Response“. Dann „lesen“ Sie Teile des Requests und „schreiben“ Teile der Response. Aufgrund dieses Designs ist es nicht möglich, Request-Parameter und -Bodys mit Standard-Python-Typhinweisen als Funktionsparameter zu deklarieren.
Es ist so konzipiert, dass es über Funktionen verfügt, welche zwei Parameter empfangen, einen <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">„Request“</abbr> und eine <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">„Response“</abbr>. Dann „lesen“ Sie Teile des Requests und „schreiben“ Teile der Response. Aufgrund dieses Designs ist es nicht möglich, Request-Parameter und -Bodys mit Standard-Python-Typhinweisen als Funktionsparameter zu deklarieren.
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**"
Wege zu finden, eine großartige Performanz zu erzielen.
/// check | Inspirierte **FastAPI**
Zusammen mit Hug (da Hug auf Falcon basiert), einen `response`-Parameter in Funktionen zu deklarieren.
Wege zu finden, eine großartige Performanz zu erzielen.
Obwohl er in FastAPI optional ist und hauptsächlich zum Festlegen von Headern, Cookies und alternativen Statuscodes verwendet wird.
Zusammen mit Hug (da Hug auf Falcon basiert), einen `response`-Parameter in Funktionen zu deklarieren.
### <a href="https://moltenframework.com/" class="external-link" target="_blank">Molten</a>
Obwohl er in FastAPI optional ist und hauptsächlich zum Festlegen von Headern, Cookies und alternativen Statuscodes verwendet wird.
///
### <a href="https://moltenframework.com/" class="external-link" target="_blank">Molten</a> { #molten }
Ich habe Molten in den ersten Phasen der Entwicklung von **FastAPI** entdeckt. Und es hat ganz ähnliche Ideen:
@@ -269,12 +313,15 @@ 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**"
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.
/// check | Inspirierte **FastAPI**
Das hat tatsächlich dazu geführt, dass Teile von Pydantic aktualisiert wurden, um denselben Validierungsdeklarationsstil zu unterstützen (diese gesamte Funktionalität ist jetzt bereits in Pydantic verfügbar).
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.
### <a href="https://www.hug.rest/" class="external-link" target="_blank">Hug</a>
Das hat tatsächlich dazu geführt, dass Teile von Pydantic aktualisiert wurden, um denselben Validierungsdeklarationsstil zu unterstützen (diese gesamte Funktionalität ist jetzt bereits in Pydantic verfügbar).
///
### <a href="https://github.com/hugapi/hug" class="external-link" target="_blank">Hug</a> { #hug }
Hug war eines der ersten Frameworks, welches die Deklaration von API-Parametertypen mithilfe von Python-Typhinweisen implementierte. Das war eine großartige Idee, die andere Tools dazu inspirierte, dasselbe zu tun.
@@ -288,17 +335,23 @@ Es verfügt über eine interessante, ungewöhnliche Funktion: Mit demselben Fram
Da es auf dem bisherigen Standard für synchrone Python-Webframeworks (WSGI) basiert, kann es nicht mit Websockets und anderen Dingen umgehen, verfügt aber dennoch über eine hohe Performanz.
!!! info
Hug wurde von Timothy Crosley erstellt, dem gleichen Schöpfer von <a href="https://github.com/timothycrosley/isort" class="external-link" target="_blank">`isort`</a>, einem großartigen Tool zum automatischen Sortieren von Importen in Python-Dateien.
/// info | Info
!!! check "Ideen, die **FastAPI** inspiriert haben"
Hug inspirierte Teile von APIStar und war eines der Tools, die ich am vielversprechendsten fand, neben APIStar.
Hug wurde von Timothy Crosley erstellt, demselben Schöpfer von <a href="https://github.com/timothycrosley/isort" class="external-link" target="_blank">`isort`</a>, einem großartigen Tool zum automatischen Sortieren von Importen in Python-Dateien.
Hug hat dazu beigetragen, **FastAPI** dazu zu inspirieren, Python-Typhinweise zum Deklarieren von Parametern zu verwenden und ein Schema zu generieren, das die API automatisch definiert.
///
Hug inspirierte **FastAPI** dazu, einen `response`-Parameter in Funktionen zu deklarieren, um Header und Cookies zu setzen.
/// check | Ideen, die **FastAPI** inspiriert haben
### <a href="https://github.com/encode/apistar" class="external-link" target="_blank">APIStar</a> (≦ 0.5)
Hug inspirierte Teile von APIStar und war eines der Tools, die ich am vielversprechendsten fand, neben APIStar.
Hug hat dazu beigetragen, **FastAPI** dazu zu inspirieren, Python-Typhinweise zum Deklarieren von Parametern zu verwenden und ein Schema zu generieren, das die API automatisch definiert.
Hug inspirierte **FastAPI** dazu, einen `response`-Parameter in Funktionen zu deklarieren, um Header und Cookies zu setzen.
///
### <a href="https://github.com/encode/apistar" class="external-link" target="_blank">APIStar</a> (≦ 0.5) { #apistar-0-5 }
Kurz bevor ich mich entschied, **FastAPI** zu erstellen, fand ich den **APIStar**-Server. Er hatte fast alles, was ich suchte, und ein tolles Design.
@@ -322,27 +375,33 @@ Es handelte sich nicht länger um ein API-Webframework, da sich der Entwickler a
Jetzt handelt es sich bei APIStar um eine Reihe von Tools zur Validierung von OpenAPI-Spezifikationen, nicht um ein Webframework.
!!! info
APIStar wurde von Tom Christie erstellt. Derselbe, welcher Folgendes erstellt hat:
/// info | Info
* Django REST Framework
* Starlette (auf welchem **FastAPI** basiert)
* Uvicorn (verwendet von Starlette und **FastAPI**)
APIStar wurde von Tom Christie erstellt. Derselbe, welcher Folgendes erstellt hat:
!!! check "Inspirierte **FastAPI**"
Zu existieren.
* Django REST Framework
* Starlette (auf welchem **FastAPI** basiert)
* Uvicorn (verwendet von Starlette und **FastAPI**)
Die Idee, mehrere Dinge (Datenvalidierung, Serialisierung und Dokumentation) mit denselben Python-Typen zu deklarieren, welche gleichzeitig eine hervorragende Editorunterstützung bieten, hielt ich für eine brillante Idee.
///
Und nach einer langen Suche nach einem ähnlichen Framework und dem Testen vieler verschiedener Alternativen, war APIStar die beste verfügbare Option.
/// check | Inspirierte **FastAPI**
Dann hörte APIStar auf, als Server zu existieren, und Starlette wurde geschaffen, welches eine neue, bessere Grundlage für ein solches System bildete. Das war die finale Inspiration für die Entwicklung von **FastAPI**.
Zu existieren.
Ich betrachte **FastAPI** als einen „spirituellen Nachfolger“ von APIStar, welcher die Funktionen, das Typsystem und andere Teile verbessert und erweitert, basierend auf den Erkenntnissen aus all diesen früheren Tools.
Die Idee, mehrere Dinge (Datenvalidierung, Serialisierung und Dokumentation) mit denselben Python-Typen zu deklarieren, welche gleichzeitig eine hervorragende Editorunterstützung bieten, hielt ich für eine brillante Idee.
## Verwendet von **FastAPI**
Und nach einer langen Suche nach einem ähnlichen Framework und dem Testen vieler verschiedener Alternativen, war APIStar die beste verfügbare Option.
### <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">Pydantic</a>
Dann hörte APIStar auf, als Server zu existieren, und Starlette wurde geschaffen, welches eine neue, bessere Grundlage für ein solches System bildete. Das war die finale Inspiration für die Entwicklung von **FastAPI**.
Ich betrachte **FastAPI** als einen „spirituellen Nachfolger“ von APIStar, welcher die Funktionen, das Typsystem und andere Teile verbessert und erweitert, basierend auf den Erkenntnissen aus all diesen früheren Tools.
///
## Verwendet von **FastAPI** { #used-by-fastapi }
### <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> { #pydantic }
Pydantic ist eine Bibliothek zum Definieren von Datenvalidierung, Serialisierung und Dokumentation (unter Verwendung von JSON Schema) basierend auf Python-Typhinweisen.
@@ -350,12 +409,15 @@ 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"
Die gesamte Datenvalidierung, Datenserialisierung und automatische Modelldokumentation (basierend auf JSON Schema) zu erledigen.
/// check | **FastAPI** verwendet es, um
**FastAPI** nimmt dann, abgesehen von all den anderen Dingen, die es tut, dieses JSON-Schema und fügt es in OpenAPI ein.
Die gesamte Datenvalidierung, Datenserialisierung und automatische Modelldokumentation (basierend auf JSON Schema) zu erledigen.
### <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a>
**FastAPI** nimmt dann, abgesehen von all den anderen Dingen, die es tut, dieses JSON-Schema und fügt es in OpenAPI ein.
///
### <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a> { #starlette }
Starlette ist ein leichtgewichtiges <abbr title="Der neue Standard für die Erstellung asynchroner Python-Webanwendungen">ASGI</abbr>-Framework/Toolkit, welches sich ideal für die Erstellung hochperformanter asynchroner Dienste eignet.
@@ -366,9 +428,9 @@ Es bietet:
* Eine sehr beeindruckende Leistung.
* WebSocket-Unterstützung.
* Hintergrundtasks im selben Prozess.
* Events für das Hoch- und Herunterfahren.
* Startup- und Shutdown-Events.
* Testclient basierend auf HTTPX.
* CORS, GZip, statische Dateien, Streamende Responses.
* CORS, GZip, statische Dateien, Responses streamen.
* Session- und Cookie-Unterstützung.
* 100 % Testabdeckung.
* 100 % Typannotierte Codebasis.
@@ -382,19 +444,25 @@ 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"
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.
/// note | Technische Details
Dennoch wird es bereits von mehreren Tools als „Standard“ verwendet. Das verbessert die Interoperabilität erheblich, da Sie Uvicorn mit jeden anderen ASGI-Server (wie Daphne oder Hypercorn) tauschen oder ASGI-kompatible Tools wie `python-socketio` hinzufügen können.
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.
!!! check "**FastAPI** verwendet es, um"
Alle Kern-Webaspekte zu handhaben. Und fügt Funktionen obenauf.
Dennoch wird es bereits von mehreren Tools als „Standard“ verwendet. Das verbessert die Interoperabilität erheblich, da Sie Uvicorn mit jeden anderen ASGI-Server (wie Daphne oder Hypercorn) tauschen oder ASGI-kompatible Tools wie `python-socketio` hinzufügen können.
Die Klasse `FastAPI` selbst erbt direkt von der Klasse `Starlette`.
///
Alles, was Sie also mit Starlette machen können, können Sie direkt mit **FastAPI** machen, da es sich im Grunde um Starlette auf Steroiden handelt.
/// check | **FastAPI** verwendet es, um
### <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>
Alle Kern-Webaspekte zu handhaben. Und fügt Funktionen obenauf.
Die Klasse `FastAPI` selbst erbt direkt von der Klasse `Starlette`.
Alles, was Sie also mit Starlette machen können, können Sie direkt mit **FastAPI** machen, da es sich im Grunde um Starlette auf Steroiden handelt.
///
### <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a> { #uvicorn }
Uvicorn ist ein blitzschneller ASGI-Server, der auf uvloop und httptools basiert.
@@ -402,13 +470,16 @@ Es handelt sich nicht um ein Webframework, sondern um einen Server. Beispielswei
Es ist der empfohlene Server für Starlette und **FastAPI**.
!!! check "**FastAPI** empfiehlt es als"
Hauptwebserver zum Ausführen von **FastAPI**-Anwendungen.
/// check | **FastAPI** empfiehlt es als
Sie können ihn mit Gunicorn kombinieren, um einen asynchronen Multiprozess-Server zu erhalten.
Hauptwebserver zum Ausführen von **FastAPI**-Anwendungen.
Weitere Details finden Sie im Abschnitt [Deployment](deployment/index.md){.internal-link target=_blank}.
Sie können auch die Kommandozeilenoption `--workers` verwenden, um einen asynchronen Multiprozess-Server zu erhalten.
## Benchmarks und Geschwindigkeit
Weitere Details finden Sie im Abschnitt [Deployment](deployment/index.md){.internal-link target=_blank}.
///
## Benchmarks und Geschwindigkeit { #benchmarks-and-speed }
Um den Unterschied zwischen Uvicorn, Starlette und FastAPI zu verstehen, zu vergleichen und zu sehen, lesen Sie den Abschnitt über [Benchmarks](benchmarks.md){.internal-link target=_blank}.

View File

@@ -1,8 +1,8 @@
# Nebenläufigkeit und async / await
# Nebenläufigkeit und async / await { #concurrency-and-async-await }
Details zur `async def`-Syntax für *Pfadoperation-Funktionen* und Hintergrundinformationen zu asynchronem Code, Nebenläufigkeit und Parallelität.
## In Eile?
## In Eile? { #in-a-hurry }
<abbr title="too long; didn't read Zu lang; nicht gelesen"><strong>TL;DR:</strong></abbr>
@@ -12,7 +12,7 @@ Wenn Sie Bibliotheken von Dritten verwenden, die mit `await` aufgerufen werden m
results = await some_library()
```
Dann deklarieren Sie Ihre *Pfadoperation-Funktionen* mit `async def` wie in:
Dann deklarieren Sie Ihre *Pfadoperation-Funktionen* mit `async def`, wie in:
```Python hl_lines="2"
@app.get('/')
@@ -21,12 +21,15 @@ async def read_results():
return results
```
!!! note
Sie können `await` nur innerhalb von Funktionen verwenden, die mit `async def` erstellt wurden.
/// note | Hinweis
Sie können `await` nur innerhalb von Funktionen verwenden, die mit `async def` erstellt wurden.
///
---
Wenn Sie eine Bibliothek eines Dritten verwenden, die mit etwas kommuniziert (einer Datenbank, einer API, dem Dateisystem, usw.) und welche die Verwendung von `await` nicht unterstützt (dies ist derzeit bei den meisten Datenbankbibliotheken der Fall), dann deklarieren Sie Ihre *Pfadoperation-Funktionen* ganz normal nur mit `def`, etwa:
Wenn Sie eine Bibliothek eines Dritten verwenden, die mit etwas kommuniziert (einer Datenbank, einer API, dem Dateisystem, usw.) und welche die Verwendung von `await` nicht unterstützt (dies ist derzeit bei den meisten Datenbankbibliotheken der Fall), dann deklarieren Sie Ihre *Pfadoperation-Funktionen* ganz normal nur mit `def`, wie in:
```Python hl_lines="2"
@app.get('/')
@@ -37,7 +40,7 @@ def results():
---
Wenn Ihre Anwendung (irgendwie) mit nichts anderem kommunizieren und auf dessen Antwort warten muss, verwenden Sie `async def`.
Wenn Ihre Anwendung (irgendwie) nicht mit etwas anderem kommunizieren und auf dessen Antwort warten muss, verwenden Sie `async def`, auch wenn Sie `await` im Inneren nicht verwenden müssen.
---
@@ -49,11 +52,11 @@ Wenn Sie sich unsicher sind, verwenden Sie einfach `def`.
Wie dem auch sei, in jedem der oben genannten Fälle wird FastAPI immer noch asynchron arbeiten und extrem schnell sein.
Wenn Sie jedoch den oben genannten Schritten folgen, können einige Performance-Optimierungen vorgenommen werden.
Wenn Sie jedoch den oben genannten Schritten folgen, können einige Performanz-Optimierungen vorgenommen werden.
## Technische Details
## Technische Details { #technical-details }
Moderne Versionen von Python unterstützen **„asynchronen Code“** unter Verwendung sogenannter **„Coroutinen“** mithilfe der Syntax **`async`** und **`await`**.
Moderne Versionen von Python unterstützen **„asynchronen Code“** unter Verwendung sogenannter **„Coroutinen“** mithilfe der Syntax **`async` und `await`**.
Nehmen wir obigen Satz in den folgenden Abschnitten Schritt für Schritt unter die Lupe:
@@ -61,13 +64,13 @@ Nehmen wir obigen Satz in den folgenden Abschnitten Schritt für Schritt unter d
* **`async` und `await`**
* **Coroutinen**
## Asynchroner Code
## Asynchroner Code { #asynchronous-code }
Asynchroner Code bedeutet lediglich, dass die Sprache 💬 eine Möglichkeit hat, dem Computersystem / Programm 🤖 mitzuteilen, dass es 🤖 an einem bestimmten Punkt im Code darauf warten muss, dass *etwas anderes* irgendwo anders fertig wird. Nehmen wir an, *etwas anderes* ist hier „Langsam-Datei“ 📝.
Asynchroner Code bedeutet lediglich, dass die Sprache 💬 eine Möglichkeit hat, dem Computer / Programm 🤖 mitzuteilen, dass es 🤖 an einem bestimmten Punkt im Code darauf warten muss, dass *etwas anderes* irgendwo anders fertig wird. Nehmen wir an, *etwas anderes* ist hier „Langsam-Datei“ 📝.
Während der Zeit, die „Langsam-Datei“ 📝 benötigt, kann das System also andere Aufgaben erledigen.
Dann kommt das System / Programm 🤖 bei jeder Gelegenheit zurück, wenn es entweder wieder wartet, oder wann immer es 🤖 die ganze Arbeit erledigt hat, die zu diesem Zeitpunkt zu tun war. Und es 🤖 wird nachschauen, ob eine der Aufgaben, auf die es gewartet hat, fertig damit ist, zu tun, was sie tun sollte.
Dann kommt der Computer / das Programm 🤖 bei jeder Gelegenheit zurück, weil es entweder wieder wartet oder wann immer es 🤖 die ganze Arbeit erledigt hat, die zu diesem Zeitpunkt zu tun war. Und es 🤖 wird nachschauen, ob eine der Aufgaben, auf die es gewartet hat, fertig ist.
Dann nimmt es 🤖 die erste erledigte Aufgabe (sagen wir, unsere „Langsam-Datei“ 📝) und bearbeitet sie weiter.
@@ -84,13 +87,13 @@ Das „Warten auf etwas anderes“ bezieht sich normalerweise auf <abbr title="I
Da die Ausführungszeit hier hauptsächlich durch das Warten auf <abbr title="Input and Output Eingabe und Ausgabe">I/O</abbr>-Operationen verbraucht wird, nennt man dies auch „I/O-lastige“ („I/O bound“) Operationen.
„Asynchron“, sagt man, weil das Computersystem / Programm nicht mit einer langsamen Aufgabe „synchronisiert“ werden muss und nicht auf den genauen Moment warten muss, in dem die Aufgabe beendet ist, ohne dabei etwas zu tun, um schließlich das Ergebnis der Aufgabe zu übernehmen und die Arbeit fortsetzen zu können.
„Asynchron“, sagt man, weil der Computer / das Programm nicht mit einer langsamen Aufgabe „synchronisiert“ werden muss und nicht auf den genauen Moment warten muss, in dem die Aufgabe beendet ist, ohne dabei etwas zu tun, um schließlich das Ergebnis der Aufgabe zu übernehmen und die Arbeit fortsetzen zu können.
Da es sich stattdessen um ein „asynchrones“ System handelt, kann die Aufgabe nach Abschluss ein wenig (einige Mikrosekunden) in der Schlange warten, bis das System / Programm seine anderen Dinge erledigt hat und zurückkommt, um die Ergebnisse entgegenzunehmen und mit ihnen weiterzuarbeiten.
Da es sich stattdessen um ein „asynchrones“ System handelt, kann die Aufgabe nach Abschluss ein wenig (einige Mikrosekunden) in der Schlange warten, bis der Computer / das Programm seine anderen Dinge erledigt hat und zurückkommt, um die Ergebnisse entgegenzunehmen und mit ihnen weiterzuarbeiten.
Für „synchron“ (im Gegensatz zu „asynchron“) wird auch oft der Begriff „sequentiell“ verwendet, da das System / Programm alle Schritte in einer Sequenz („der Reihe nach“) ausführt, bevor es zu einer anderen Aufgabe wechselt, auch wenn diese Schritte mit Warten verbunden sind.
Für „synchron“ (im Gegensatz zu „asynchron“) wird auch oft der Begriff „sequentiell“ verwendet, da der Computer / das Programm alle Schritte in einer Sequenz („der Reihe nach“) ausführt, bevor es zu einer anderen Aufgabe wechselt, auch wenn diese Schritte mit Warten verbunden sind.
### Nebenläufigkeit und Hamburger
### Nebenläufigkeit und Hamburger { #concurrency-and-burgers }
Diese oben beschriebene Idee von **asynchronem** Code wird manchmal auch **„Nebenläufigkeit“** genannt. Sie unterscheidet sich von **„Parallelität“**.
@@ -100,7 +103,7 @@ Aber die Details zwischen *Nebenläufigkeit* und *Parallelität* sind ziemlich u
Um den Unterschied zu erkennen, stellen Sie sich die folgende Geschichte über Hamburger vor:
### Nebenläufige Hamburger
### Nebenläufige Hamburger { #concurrent-burgers }
Sie gehen mit Ihrem Schwarm Fastfood holen, stehen in der Schlange, während der Kassierer die Bestellungen der Leute vor Ihnen entgegennimmt. 😍
@@ -136,12 +139,15 @@ Sie und Ihr Schwarm essen die Burger und haben eine schöne Zeit. ✨
<img src="/img/async/concurrent-burgers/concurrent-burgers-07.png" class="illustration">
!!! info
Die wunderschönen Illustrationen stammen von <a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a>. 🎨
/// info | Info
Die wunderschönen Illustrationen stammen von <a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a>. 🎨
///
---
Stellen Sie sich vor, Sie wären das Computersystem / Programm 🤖 in dieser Geschichte.
Stellen Sie sich vor, Sie wären der Computer / das Programm 🤖 in dieser Geschichte.
Während Sie an der Schlange stehen, sind Sie einfach untätig 😴, warten darauf, dass Sie an die Reihe kommen, und tun nichts sehr „Produktives“. Aber die Schlange ist schnell abgearbeitet, weil der Kassierer nur die Bestellungen entgegennimmt (und nicht zubereitet), also ist das vertretbar.
@@ -157,7 +163,7 @@ Also warten Sie darauf, dass Ihr Schwarm ihre Geschichte zu Ende erzählt (die a
Dann gehen Sie zur Theke 🔀, zur ursprünglichen Aufgabe, die nun erledigt ist ⏯, nehmen die Burger auf, sagen Danke, und bringen sie zum Tisch. Damit ist dieser Schritt / diese Aufgabe der Interaktion mit der Theke abgeschlossen ⏹. Das wiederum schafft eine neue Aufgabe, „Burger essen“ 🔀 ⏯, aber die vorherige Aufgabe „Burger holen“ ist erledigt ⏹.
### Parallele Hamburger
### Parallele Hamburger { #parallel-burgers }
Stellen wir uns jetzt vor, dass es sich hierbei nicht um „nebenläufige Hamburger“, sondern um „parallele Hamburger“ handelt.
@@ -199,8 +205,11 @@ Sie essen sie und sind fertig. ⏹
Es wurde nicht viel geredet oder geflirtet, da die meiste Zeit mit Warten 🕙 vor der Theke verbracht wurde. 😞
!!! info
Die wunderschönen Illustrationen stammen von <a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a>. 🎨
/// info | Info
Die wunderschönen Illustrationen stammen von <a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a>. 🎨
///
---
@@ -224,15 +233,15 @@ Und man muss lange in der Schlange warten 🕙 sonst kommt man nicht an die Reih
Sie würden Ihren Schwarm 😍 wahrscheinlich nicht mitnehmen wollen, um Besorgungen bei der Bank zu erledigen 🏦.
### Hamburger Schlussfolgerung
### Hamburger Schlussfolgerung { #burger-conclusion }
In diesem Szenario „Fast Food Burger mit Ihrem Schwarm“ ist es viel sinnvoller, ein nebenläufiges System zu haben ⏸🔀⏯, da viel gewartet wird 🕙.
In diesem Szenario „Fastfood-Burger mit Ihrem Schwarm“ ist es viel sinnvoller, ein nebenläufiges System zu haben ⏸🔀⏯, da viel gewartet wird 🕙.
Das ist auch bei den meisten Webanwendungen der Fall.
Viele, viele Benutzer, aber Ihr Server wartet 🕙 darauf, dass deren nicht so gute Internetverbindungen die Requests übermitteln.
Viele, viele Benutzer, aber Ihr Server wartet 🕙 darauf, dass deren nicht so gute Internetverbindungen die <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Requests</abbr> übermitteln.
Und dann warten 🕙, bis die Responses zurückkommen.
Und dann wieder warten 🕙, bis die <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Responses</abbr> zurückkommen.
Dieses „Warten“ 🕙 wird in Mikrosekunden gemessen, aber zusammenfassend lässt sich sagen, dass am Ende eine Menge gewartet wird.
@@ -244,7 +253,7 @@ Und das ist das gleiche Leistungsniveau, das Sie mit **FastAPI** erhalten.
Und da Sie Parallelität und Asynchronität gleichzeitig haben können, erzielen Sie eine höhere Performanz als die meisten getesteten NodeJS-Frameworks und sind mit Go auf Augenhöhe, einer kompilierten Sprache, die näher an C liegt <a href="https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1" class="external-link" target="_blank">(alles dank Starlette)</a>.
### Ist Nebenläufigkeit besser als Parallelität?
### Ist Nebenläufigkeit besser als Parallelität? { #is-concurrency-better-than-parallelism }
Nein! Das ist nicht die Moral der Geschichte.
@@ -281,17 +290,17 @@ Zum Beispiel:
* **Maschinelles Lernen**: Normalerweise sind viele „Matrix“- und „Vektor“-Multiplikationen erforderlich. Stellen Sie sich eine riesige Tabelle mit Zahlen vor, in der Sie alle Zahlen gleichzeitig multiplizieren.
* **Deep Learning**: Dies ist ein Teilgebiet des maschinellen Lernens, daher gilt das Gleiche. Es ist nur so, dass es nicht eine einzige Tabelle mit Zahlen zum Multiplizieren gibt, sondern eine riesige Menge davon, und in vielen Fällen verwendet man einen speziellen Prozessor, um diese Modelle zu erstellen und / oder zu verwenden.
### Nebenläufigkeit + Parallelität: Web + maschinelles Lernen
### Nebenläufigkeit + Parallelität: Web + maschinelles Lernen { #concurrency-parallelism-web-machine-learning }
Mit **FastAPI** können Sie die Vorteile der Nebenläufigkeit nutzen, die in der Webentwicklung weit verbreitet ist (derselbe Hauptvorteil von NodeJS).
Sie können aber auch die Vorteile von Parallelität und Multiprocessing (Mehrere Prozesse werden parallel ausgeführt) für **CPU-lastige** Workloads wie in Systemen für maschinelles Lernen nutzen.
Sie können aber auch die Vorteile von Parallelität und Multiprocessing (mehrere Prozesse werden parallel ausgeführt) für **CPU-lastige** Workloads wie in Systemen für maschinelles Lernen nutzen.
Dies und die einfache Tatsache, dass Python die Hauptsprache für **Data Science**, maschinelles Lernen und insbesondere Deep Learning ist, machen FastAPI zu einem sehr passenden Werkzeug für Web-APIs und Anwendungen für Data Science / maschinelles Lernen (neben vielen anderen).
Wie Sie diese Parallelität in der Produktion erreichen, erfahren Sie im Abschnitt über [Deployment](deployment/index.md){.internal-link target=_blank}.
## `async` und `await`.
## `async` und `await` { #async-and-await }
Moderne Versionen von Python verfügen über eine sehr intuitive Möglichkeit, asynchronen Code zu schreiben. Dadurch sieht es wie normaler „sequentieller“ Code aus und übernimmt im richtigen Moment das „Warten“ für Sie.
@@ -307,16 +316,16 @@ Damit `await` funktioniert, muss es sich in einer Funktion befinden, die diese A
```Python hl_lines="1"
async def get_burgers(number: int):
# Mach Sie hier etwas Asynchrones, um die Burger zu erstellen
# Mache hier etwas Asynchrones, um die Burger zu erstellen
return burgers
```
... statt mit `def`:
```Python hl_lines="2"
# Die ist nicht asynchron
# Dies ist nicht asynchron
def get_sequential_burgers(number: int):
# Mach Sie hier etwas Sequentielles, um die Burger zu erstellen
# Mache hier etwas Sequentielles, um die Burger zu erstellen
return burgers
```
@@ -340,7 +349,7 @@ async def read_burgers():
return burgers
```
### Weitere technische Details
### Weitere technische Details { #more-technical-details }
Ihnen ist wahrscheinlich aufgefallen, dass `await` nur innerhalb von Funktionen verwendet werden kann, die mit `async def` definiert sind.
@@ -352,15 +361,17 @@ Wenn Sie mit **FastAPI** arbeiten, müssen Sie sich darüber keine Sorgen machen
Wenn Sie jedoch `async` / `await` ohne FastAPI verwenden möchten, können Sie dies auch tun.
### Schreiben Sie Ihren eigenen asynchronen Code
### Schreiben Sie Ihren eigenen asynchronen Code { #write-your-own-async-code }
Starlette (und **FastAPI**) basiert auf <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>, was bedeutet, es ist sowohl kompatibel mit der Python-Standardbibliothek <a href="https://docs.python.org/3/library/asyncio-task.html" class="external-link" target="_blank">asyncio</a>, als auch mit <a href="https://trio.readthedocs.io/en/stable/" class="external-link" target="_blank">Trio</a>.
Starlette (und **FastAPI**) basieren auf <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>, was bedeutet, dass es sowohl kompatibel mit der Python-Standardbibliothek <a href="https://docs.python.org/3/library/asyncio-task.html" class="external-link" target="_blank">asyncio</a> als auch mit <a href="https://trio.readthedocs.io/en/stable/" class="external-link" target="_blank">Trio</a> ist.
Insbesondere können Sie <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a> direkt verwenden für Ihre fortgeschritten nebenläufigen und parallelen Anwendungsfälle, die fortgeschrittenere Muster in Ihrem eigenen Code erfordern.
Insbesondere können Sie <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a> direkt verwenden für Ihre fortgeschrittenen nebenläufigen Anwendungsfälle, die fortgeschrittenere Muster in Ihrem eigenen Code erfordern.
Und selbst wenn Sie FastAPI nicht verwenden würden, könnten Sie auch Ihre eigenen asynchronen Anwendungen mit <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a> so schreiben, dass sie hoch kompatibel sind und Sie dessen Vorteile nutzen können (z. B. *strukturierte Nebenläufigkeit*).
Und auch wenn Sie FastAPI nicht verwenden würden, könnten Sie Ihre eigenen asynchronen Anwendungen mit <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a> schreiben, um hochkompatibel zu sein und dessen Vorteile zu nutzen (z. B. *strukturierte Nebenläufigkeit*).
### Andere Formen von asynchronem Code
Ich habe eine weitere Bibliothek auf Basis von AnyIO erstellt, als dünne Schicht obendrauf, um die Typannotationen etwas zu verbessern und bessere **Autovervollständigung**, **Inline-Fehler** usw. zu erhalten. Sie hat auch eine freundliche Einführung und ein Tutorial, um Ihnen zu helfen, **Ihren eigenen asynchronen Code zu verstehen** und zu schreiben: <a href="https://asyncer.tiangolo.com/" class="external-link" target="_blank">Asyncer</a>. Sie ist insbesondere nützlich, wenn Sie **asynchronen Code mit regulärem** (blockierendem/synchronem) Code kombinieren müssen.
### Andere Formen von asynchronem Code { #other-forms-of-asynchronous-code }
Diese Art der Verwendung von `async` und `await` ist in der Sprache relativ neu.
@@ -372,50 +383,53 @@ Davor war der Umgang mit asynchronem Code jedoch deutlich komplexer und schwieri
In früheren Versionen von Python hätten Sie Threads oder <a href="https://www.gevent.org/" class="external-link" target="_blank">Gevent</a> verwenden können. Der Code ist jedoch viel komplexer zu verstehen, zu debuggen und nachzuvollziehen.
In früheren Versionen von NodeJS / Browser JavaScript hätten Sie „Callbacks“ verwendet. Was zur <a href="http://callbackhell.com/" class="external-link" target="_blank">Callback-Hölle</a> führt.
In früheren Versionen von NodeJS / Browser JavaScript hätten Sie „Callbacks“ verwendet. Was zur Callback-Hölle führt.
## Coroutinen
## Coroutinen { #coroutines }
**Coroutine** ist nur ein schicker Begriff für dasjenige, was von einer `async def`-Funktion zurückgegeben wird. Python weiß, dass es so etwas wie eine Funktion ist, die es starten kann und die irgendwann endet, aber auch dass sie pausiert ⏸ werden kann, wann immer darin ein `await` steht.
Aber all diese Funktionalität der Verwendung von asynchronem Code mit `async` und `await` wird oft als Verwendung von „Coroutinen“ zusammengefasst. Es ist vergleichbar mit dem Hauptmerkmal von Go, den „Goroutinen“.
## Fazit
## Fazit { #conclusion }
Sehen wir uns den gleichen Satz von oben noch mal an:
> Moderne Versionen von Python unterstützen **„asynchronen Code“** unter Verwendung sogenannter **„Coroutinen“** mithilfe der Syntax **`async`** und **`await`**.
> Moderne Versionen von Python unterstützen **„asynchronen Code“** unter Verwendung sogenannter **„Coroutinen“** mithilfe der Syntax **`async` und `await`**.
Das sollte jetzt mehr Sinn ergeben. ✨
All das ist es, was FastAPI (via Starlette) befeuert und es eine so beeindruckende Performanz haben lässt.
## Sehr technische Details
## Sehr technische Details { #very-technical-details }
!!! warning "Achtung"
Das folgende können Sie wahrscheinlich überspringen.
/// warning | Achtung
Dies sind sehr technische Details darüber, wie **FastAPI** unter der Haube funktioniert.
Das folgende können Sie wahrscheinlich überspringen.
Wenn Sie über gute technische Kenntnisse verfügen (Coroutinen, Threads, Blocking, usw.) und neugierig sind, wie FastAPI mit `async def`s im Vergleich zu normalen `def`s umgeht, fahren Sie fort.
Dies sind sehr technische Details darüber, wie **FastAPI** unter der Haube funktioniert.
### Pfadoperation-Funktionen
Wenn Sie über gute technische Kenntnisse verfügen (Coroutinen, Threads, Blocking, usw.) und neugierig sind, wie FastAPI mit `async def`s im Vergleich zu normalen `def`s umgeht, fahren Sie fort.
///
### Pfadoperation-Funktionen { #path-operation-functions }
Wenn Sie eine *Pfadoperation-Funktion* mit normalem `def` anstelle von `async def` deklarieren, wird sie in einem externen Threadpool ausgeführt, der dann `await`et wird, anstatt direkt aufgerufen zu werden (da dies den Server blockieren würde).
Wenn Sie von einem anderen asynchronen Framework kommen, das nicht auf die oben beschriebene Weise funktioniert, und Sie es gewohnt sind, triviale, nur-berechnende *Pfadoperation-Funktionen* mit einfachem `def` zu definieren, um einen geringfügigen Geschwindigkeitsgewinn (etwa 100 Nanosekunden) zu erzielen, beachten Sie bitte, dass der Effekt in **FastAPI** genau gegenteilig wäre. In solchen Fällen ist es besser, `async def` zu verwenden, es sei denn, Ihre *Pfadoperation-Funktionen* verwenden Code, der blockierende <abbr title="Input/Output Eingabe/Ausgabe: Lesen oder Schreiben von/auf Festplatte, Netzwerkkommunikation.">I/O</abbr>-Operationen durchführt.
Dennoch besteht in beiden Fällen eine gute Chance, dass **FastAPI** [immer noch schneller](index.md#performanz){.internal-link target=_blank} als Ihr bisheriges Framework (oder zumindest damit vergleichbar) ist.
Dennoch besteht in beiden Fällen eine gute Chance, dass **FastAPI** [immer noch schneller](index.md#performance){.internal-link target=_blank} als Ihr bisheriges Framework (oder zumindest damit vergleichbar) ist.
### Abhängigkeiten
### Abhängigkeiten { #dependencies }
Das Gleiche gilt für [Abhängigkeiten](tutorial/dependencies/index.md){.internal-link target=_blank}. Wenn eine Abhängigkeit eine normale `def`-Funktion ist, anstelle einer `async def`-Funktion, dann wird sie im externen Threadpool ausgeführt.
Das Gleiche gilt für [Abhängigkeiten](tutorial/dependencies/index.md){.internal-link target=_blank}. Wenn eine Abhängigkeit eine normale `def`-Funktion anstelle einer `async def` ist, wird sie im externen Threadpool ausgeführt.
### Unterabhängigkeiten
### Unterabhängigkeiten { #sub-dependencies }
Sie können mehrere Abhängigkeiten und [Unterabhängigkeiten](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} haben, die einander bedingen (als Parameter der Funktionsdefinitionen), einige davon könnten erstellt werden mit `async def` und einige mit normalem `def`. Es würde immer noch funktionieren und diejenigen, die mit normalem `def` erstellt wurden, würden in einem externen Thread (vom Threadpool stammend) aufgerufen werden, anstatt `await`et zu werden.
Sie können mehrere Abhängigkeiten und [Unterabhängigkeiten](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} haben, die einander bedingen (als Parameter der Funktionsdefinitionen), einige davon könnten erstellt werden mit `async def` und einige mit normalem `def`. Es würde immer noch funktionieren, und diejenigen, die mit normalem `def` erstellt wurden, würden in einem externen Thread (vom Threadpool stammend) aufgerufen werden, anstatt `await`et zu werden.
### Andere Hilfsfunktionen
### Andere Hilfsfunktionen { #other-utility-functions }
Jede andere Hilfsfunktion, die Sie direkt aufrufen, kann mit normalem `def` oder `async def` erstellt werden, und FastAPI beeinflusst nicht die Art und Weise, wie Sie sie aufrufen.
@@ -427,4 +441,4 @@ Wenn Ihre Hilfsfunktion eine normale Funktion mit `def` ist, wird sie direkt auf
Nochmal, es handelt sich hier um sehr technische Details, die Ihnen helfen, falls Sie danach gesucht haben.
Andernfalls liegen Sie richtig, wenn Sie sich an die Richtlinien aus dem obigen Abschnitt halten: <a href="#in-eile">In Eile?</a>.
Andernfalls liegen Sie richtig, wenn Sie sich an die Richtlinien aus dem obigen Abschnitt halten: <a href="#in-a-hurry">In Eile?</a>.

View File

@@ -1,16 +1,16 @@
# Benchmarks
# Benchmarks { #benchmarks }
Unabhängige TechEmpower-Benchmarks zeigen, **FastAPI**-Anwendungen, die unter Uvicorn ausgeführt werden, gehören zu <a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">den schnellsten existierenden Python-Frameworks</a>, nur Starlette und Uvicorn selbst (intern von FastAPI verwendet) sind schneller.
Unabhängige TechEmpower-Benchmarks zeigen **FastAPI**-Anwendungen, die unter Uvicorn ausgeführt werden, als <a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">eines der schnellsten verfügbaren Python-Frameworks</a>, nur unterhalb von Starlette und Uvicorn selbst (die intern von FastAPI verwendet werden).
Beim Ansehen von Benchmarks und Vergleichen sollten Sie jedoch Folgende Punkte beachten.
Aber bei der Betrachtung von Benchmarks und Vergleichen sollten Sie Folgendes beachten.
## Benchmarks und Geschwindigkeit
## Benchmarks und Geschwindigkeit { #benchmarks-and-speed }
Wenn Sie sich die Benchmarks ansehen, werden häufig mehrere Tools mit unterschiedlichen Eigenschaften als gleichwertig verglichen.
Wenn Sie die Benchmarks ansehen, ist es üblich, dass mehrere Tools unterschiedlichen Typs als gleichwertig verglichen werden.
Konkret geht es darum, Uvicorn, Starlette und FastAPI miteinander zu vergleichen (neben vielen anderen Tools).
Insbesondere dass Uvicorn, Starlette und FastAPI zusammen verglichen werden (neben vielen anderen Tools).
Je einfacher das Problem, welches durch das Tool gelöst wird, desto besser ist die Performanz. Und die meisten Benchmarks testen nicht die zusätzlichen Funktionen, welche das Tool bietet.
Je einfacher das Problem, das durch das Tool gelöst wird, desto besser wird die Performanz sein. Und die meisten Benchmarks testen nicht die zusätzlichen Funktionen, die das Tool bietet.
Die Hierarchie ist wie folgt:
@@ -19,16 +19,16 @@ Die Hierarchie ist wie folgt:
* **FastAPI**: (verwendet Starlette) ein API-Mikroframework mit mehreren zusätzlichen Funktionen zum Erstellen von APIs, mit Datenvalidierung, usw.
* **Uvicorn**:
* Bietet die beste Leistung, da außer dem Server selbst nicht viel zusätzlicher Code vorhanden ist.
* Sie würden eine Anwendung nicht direkt in Uvicorn schreiben. Das würde bedeuten, dass Ihr Code zumindest mehr oder weniger den gesamten von Starlette (oder **FastAPI**) bereitgestellten Code enthalten müsste. Und wenn Sie das täten, hätte Ihre endgültige Anwendung den gleichen Overhead wie die Verwendung eines Frameworks nebst Minimierung Ihres Anwendungscodes und der Fehler.
* Wird die beste Performanz haben, da außer dem Server selbst nicht viel zusätzlicher Code vorhanden ist.
* Sie würden eine Anwendung nicht direkt in Uvicorn schreiben. Das würde bedeuten, dass Ihr Code zumindest mehr oder weniger den gesamten von Starlette (oder **FastAPI**) bereitgestellten Code enthalten müsste. Und wenn Sie das täten, hätte Ihre endgültige Anwendung den gleichen Overhead wie bei der Verwendung eines Frameworks und der Minimierung Ihres Anwendungscodes und der Fehler.
* Wenn Sie Uvicorn vergleichen, vergleichen Sie es mit Anwendungsservern wie Daphne, Hypercorn, uWSGI, usw.
* **Starlette**:
* Wird nach Uvicorn die nächstbeste Performanz erbringen. Tatsächlich nutzt Starlette intern Uvicorn. Daher kann es wahrscheinlich nur „langsamer“ als Uvicorn sein, weil mehr Code ausgeführt wird.
* Aber es bietet Ihnen die Tools zum Erstellen einfacher Webanwendungen, mit Routing basierend auf Pfaden, usw.
* Wird nach Uvicorn die nächstbeste Performanz erbringen. Tatsächlich verwendet Starlette intern Uvicorn, um zu laufen. Daher kann es wahrscheinlich nur „langsamer“ als Uvicorn werden, weil mehr Code ausgeführt werden muss.
* Aber es bietet Ihnen die Werkzeuge, um einfache Webanwendungen zu erstellen, mit Routing basierend auf Pfaden, usw.
* Wenn Sie Starlette vergleichen, vergleichen Sie es mit Webframeworks (oder Mikroframeworks) wie Sanic, Flask, Django, usw.
* **FastAPI**:
* So wie Starlette Uvicorn verwendet und nicht schneller als dieses sein kann, verwendet **FastAPI** Starlette, sodass es nicht schneller als dieses sein kann.
* FastAPI bietet zusätzlich zu Starlette weitere Funktionen. Funktionen, die Sie beim Erstellen von APIs fast immer benötigen, wie Datenvalidierung und Serialisierung. Und wenn Sie es verwenden, erhalten Sie kostenlos automatische Dokumentation (die automatische Dokumentation verursacht nicht einmal zusätzlichen Aufwand für laufende Anwendungen, sie wird beim Start generiert).
* Wenn Sie FastAPI nicht, und direkt Starlette (oder ein anderes Tool wie Sanic, Flask, Responder, usw.) verwenden würden, müssten Sie die gesamte Datenvalidierung und Serialisierung selbst implementieren. Ihre finale Anwendung hätte also immer noch den gleichen Overhead, als ob sie mit FastAPI erstellt worden wäre. Und in vielen Fällen ist diese Datenvalidierung und Serialisierung der größte Teil des in Anwendungen geschriebenen Codes.
* Durch die Verwendung von FastAPI sparen Sie also Entwicklungszeit, Fehler und Codezeilen und würden wahrscheinlich die gleiche Leistung (oder eine bessere) erzielen, die Sie hätten, wenn Sie es nicht verwenden würden (da Sie alles in Ihrem Code implementieren müssten).
* Wenn Sie FastAPI vergleichen, vergleichen Sie es mit einem Webanwendung-Framework (oder einer Reihe von Tools), welche Datenvalidierung, Serialisierung und Dokumentation bereitstellen, wie Flask-apispec, NestJS, Molten, usw. Frameworks mit integrierter automatischer Datenvalidierung, Serialisierung und Dokumentation.
* FastAPI bietet zusätzliche Funktionen auf Basis von Starlette. Funktionen, die Sie beim Erstellen von APIs fast immer benötigen, wie Datenvalidierung und Serialisierung. Und wenn Sie es verwenden, erhalten Sie kostenlose automatische Dokumentation (die automatische Dokumentation verursacht nicht einmal zusätzlichen Overhead für laufende Anwendungen, sie wird beim Starten generiert).
* Wenn Sie FastAPI nicht verwenden und stattdessen Starlette direkt (oder ein anderes Tool wie Sanic, Flask, Responder, usw.) verwenden würden, müssten Sie die gesamte Datenvalidierung und Serialisierung selbst implementieren. Ihre finale Anwendung hätte also immer noch den gleichen Overhead, als ob sie mit FastAPI erstellt worden wäre. Und in vielen Fällen ist diese Datenvalidierung und Serialisierung der größte Teil des in Anwendungen geschriebenen Codes.
* Durch die Verwendung von FastAPI sparen Sie also Entwicklungszeit, Fehler und Codezeilen und würden wahrscheinlich die gleiche Performanz (oder eine bessere) erzielen, die Sie hätten, wenn Sie es nicht verwenden würden (da Sie alles in Ihrem Code implementieren müssten).
* Wenn Sie FastAPI vergleichen, vergleichen Sie es mit einem Webanwendungs-Framework (oder einer Reihe von Tools), das Datenvalidierung, Serialisierung und Dokumentation bereitstellt, wie Flask-apispec, NestJS, Molten, usw. Frameworks mit integrierter automatischer Datenvalidierung, Serialisierung und Dokumentation.

View File

@@ -1,447 +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/tiangolo/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:
=== "Linux, macOS"
<div class="termy">
```console
$ source ./env/bin/activate
```
</div>
=== "Windows PowerShell"
<div class="termy">
```console
$ .\env\Scripts\Activate.ps1
```
</div>
=== "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:
=== "Linux, macOS, Windows Bash"
<div class="termy">
```console
$ which pip
some/directory/fastapi/env/bin/pip
```
</div>
=== "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/tiangolo/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/tiangolo/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/tiangolo/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

@@ -1,17 +1,24 @@
# FastAPI-Deployment bei Cloud-Anbietern
# FastAPI bei Cloudanbietern deployen { #deploy-fastapi-on-cloud-providers }
Sie können praktisch **jeden Cloud-Anbieter** für das <abbr title="Bereitstellen der fertigen Anwendung für die Endbenutzer">Deployment</abbr> Ihrer FastAPI-Anwendung verwenden.
Sie können praktisch **jeden Cloudanbieter** verwenden, um Ihre FastAPI-Anwendung bereitzustellen.
In den meisten Fällen verfügen die Haupt-Cloud-Anbieter über Anleitungen zum Deployment von FastAPI.
In den meisten Fällen bieten die großen Cloudanbieter Anleitungen zum Deployment von FastAPI an.
## Cloud-Anbieter Sponsoren
## FastAPI Cloud { #fastapi-cloud }
Einige Cloud-Anbieter ✨ [**sponsern FastAPI**](../help-fastapi.md#den-autor-sponsern){.internal-link target=_blank} ✨, dies gewährleistet die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ökosystem**.
**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** wurde vom selben Autor und Team hinter **FastAPI** entwickelt.
Und es zeigt deren wahres Engagement für FastAPI und seine **Community** (Sie), da diese Ihnen nicht nur einen **guten Service** bieten möchten, sondern auch sicherstellen möchten, dass Sie über ein **gutes und gesundes Framework** verfügen, FastAPI. 🙇
Es vereinfacht den Prozess des **Erstellens**, **Deployens** und **Zugreifens** auf eine API mit minimalem Aufwand.
Vielleicht möchten Sie deren Dienste ausprobieren und deren Anleitungen folgen:
Es bringt die gleiche **Developer-Experience** beim Erstellen von Apps mit FastAPI auch zum **Deployment** in der Cloud. 🎉
* <a href="https://docs.platform.sh/languages/python.html?utm_source=fastapi-signup&utm_medium=banner&utm_campaign=FastAPI-signup-June-2023" class="external-link" target="_blank">Platform.sh</a>
* <a href="https://docs.porter.run/language-specific-guides/fastapi" class="external-link" target="_blank">Porter</a>
* <a href="https://docs.withcoherence.com/docs/configuration/frameworks?utm_medium=advertising&utm_source=fastapi&utm_campaign=banner%20january%2024#fast-api-example" class="external-link" target="_blank">Coherence</a>
FastAPI Cloud ist der Hauptsponsor und Finanzierungsgeber für die *FastAPI and friends* Open-Source-Projekte. ✨
## Cloudanbieter Sponsoren { #cloud-providers-sponsors }
Einige andere Cloudanbieter ✨ [**sponsern FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨ ebenfalls. 🙇
Sie könnten diese ebenfalls in Betracht ziehen, deren Anleitungen folgen und ihre Dienste ausprobieren:
* <a href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" class="external-link" target="_blank">Render</a>
* <a href="https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi" class="external-link" target="_blank">Railway</a>

View File

@@ -1,6 +1,6 @@
# Deployment-Konzepte
# Deployment-Konzepte { #deployments-concepts }
Bei dem Deployment der Bereitstellung einer **FastAPI**-Anwendung, oder eigentlich jeder Art von Web-API, gibt es mehrere Konzepte, die Sie wahrscheinlich interessieren, und mithilfe der Sie die **am besten geeignete** Methode zur **Bereitstellung Ihrer Anwendung** finden können.
Bei dem Deployment der Bereitstellung einer **FastAPI**-Anwendung, oder eigentlich jeder Art von Web-API, gibt es mehrere Konzepte, die Sie wahrscheinlich interessieren, und mithilfe der Sie die **am besten geeignete** Methode zum **Deployment Ihrer Anwendung** finden können.
Einige wichtige Konzepte sind:
@@ -13,17 +13,17 @@ Einige wichtige Konzepte sind:
Wir werden sehen, wie diese sich auf das **Deployment** auswirken.
Letztendlich besteht das ultimative Ziel darin, **Ihre API-Clients** auf **sichere** Weise zu bedienen, um **Unterbrechungen** zu vermeiden und die **Rechenressourcen** (z. B. entfernte Server/virtuelle Maschinen) so effizient wie möglich zu nutzen. 🚀
Letztendlich besteht das ultimative Ziel darin, **Ihre API-Clients** auf **sichere** Weise zu versorgen, um **Unterbrechungen** zu vermeiden und die **Rechenressourcen** (z. B. entfernte Server/virtuelle Maschinen) so effizient wie möglich zu nutzen. 🚀
Ich erzähle Ihnen hier etwas mehr über diese **Konzepte**, was Ihnen hoffentlich die **Intuition** gibt, die Sie benötigen, um zu entscheiden, wie Sie Ihre API in sehr unterschiedlichen Umgebungen bereitstellen, möglicherweise sogar in **zukünftigen**, die jetzt noch nicht existieren.
Ich erzähle Ihnen hier etwas mehr über diese **Konzepte**, was Ihnen hoffentlich die **Intuition** gibt, die Sie benötigen, um zu entscheiden, wie Sie Ihre API in sehr unterschiedlichen Umgebungen deployen, möglicherweise sogar in **zukünftigen**, die jetzt noch nicht existieren.
Durch die Berücksichtigung dieser Konzepte können Sie die beste Variante der Bereitstellung **Ihrer eigenen APIs** **evaluieren und konzipieren**.
Durch die Berücksichtigung dieser Konzepte können Sie die beste Variante des Deployments **Ihrer eigenen APIs** **evaluieren und konzipieren**.
In den nächsten Kapiteln werde ich Ihnen mehr **konkrete Rezepte** für die Bereitstellung von FastAPI-Anwendungen geben.
In den nächsten Kapiteln werde ich Ihnen mehr **konkrete Rezepte** für das Deployment von FastAPI-Anwendungen geben.
Aber schauen wir uns zunächst einmal diese grundlegenden **konzeptionellen Ideen** an. Diese Konzepte gelten auch für jede andere Art von Web-API. 💡
## Sicherheit HTTPS
## Sicherheit HTTPS { #security-https }
Im [vorherigen Kapitel über HTTPS](https.md){.internal-link target=_blank} haben wir erfahren, wie HTTPS Verschlüsselung für Ihre API bereitstellt.
@@ -31,7 +31,7 @@ Wir haben auch gesehen, dass HTTPS normalerweise von einer Komponente **außerha
Und es muss etwas geben, das für die **Erneuerung der HTTPS-Zertifikate** zuständig ist, es könnte sich um dieselbe Komponente handeln oder um etwas anderes.
### Beispieltools für HTTPS
### Beispieltools für HTTPS { #example-tools-for-https }
Einige der Tools, die Sie als TLS-Terminierungsproxy verwenden können, sind:
@@ -55,11 +55,11 @@ In den nächsten Kapiteln zeige ich Ihnen einige konkrete Beispiele.
Die nächsten zu berücksichtigenden Konzepte drehen sich dann um das Programm, das Ihre eigentliche API ausführt (z. B. Uvicorn).
## Programm und Prozess
## Programm und Prozess { #program-and-process }
Wir werden viel über den laufenden „**Prozess**“ sprechen, daher ist es nützlich, Klarheit darüber zu haben, was das bedeutet und was der Unterschied zum Wort „**Programm**“ ist.
### Was ist ein Programm?
### Was ist ein Programm { #what-is-a-program }
Das Wort **Programm** wird häufig zur Beschreibung vieler Dinge verwendet:
@@ -67,7 +67,7 @@ Das Wort **Programm** wird häufig zur Beschreibung vieler Dinge verwendet:
* Die **Datei**, die vom Betriebssystem **ausgeführt** werden kann, zum Beispiel: `python`, `python.exe` oder `uvicorn`.
* Ein bestimmtes Programm, während es auf dem Betriebssystem **läuft**, die CPU nutzt und Dinge im Arbeitsspeicher ablegt. Dies wird auch als **Prozess** bezeichnet.
### Was ist ein Prozess?
### Was ist ein Prozess { #what-is-a-process }
Das Wort **Prozess** wird normalerweise spezifischer verwendet und bezieht sich nur auf das, was im Betriebssystem ausgeführt wird (wie im letzten Punkt oben):
@@ -88,13 +88,13 @@ Und Sie werden beispielsweise wahrscheinlich feststellen, dass mehrere Prozesse
Nachdem wir nun den Unterschied zwischen den Begriffen **Prozess** und **Programm** kennen, sprechen wir weiter über das Deployment.
## Beim Hochfahren ausführen
## Beim Hochfahren ausführen { #running-on-startup }
Wenn Sie eine Web-API erstellen, möchten Sie in den meisten Fällen, dass diese **immer läuft**, ununterbrochen, damit Ihre Clients immer darauf zugreifen können. Es sei denn natürlich, Sie haben einen bestimmten Grund, warum Sie möchten, dass diese nur in bestimmten Situationen ausgeführt wird. Meistens möchten Sie jedoch, dass sie ständig ausgeführt wird und **verfügbar** ist.
### Auf einem entfernten Server
### Auf einem entfernten Server { #in-a-remote-server }
Wenn Sie einen entfernten Server (einen Cloud-Server, eine virtuelle Maschine, usw.) einrichten, können Sie am einfachsten Uvicorn (oder ähnliches) manuell ausführen, genau wie bei der lokalen Entwicklung.
Wenn Sie einen entfernten Server (einen Cloud-Server, eine virtuelle Maschine, usw.) einrichten, können Sie am einfachsten `fastapi run` (welches Uvicorn verwendet) oder etwas Ähnliches manuell ausführen, genau wie bei der lokalen Entwicklung.
Und es wird funktionieren und **während der Entwicklung** nützlich sein.
@@ -102,15 +102,15 @@ Wenn Ihre Verbindung zum Server jedoch unterbrochen wird, wird der **laufende Pr
Und wenn der Server neu gestartet wird (z. B. nach Updates oder Migrationen vom Cloud-Anbieter), werden Sie das wahrscheinlich **nicht bemerken**. Und deshalb wissen Sie nicht einmal, dass Sie den Prozess manuell neu starten müssen. Ihre API bleibt also einfach tot. 😱
### Beim Hochfahren automatisch ausführen
### Beim Hochfahren automatisch ausführen { #run-automatically-on-startup }
Im Allgemeinen möchten Sie wahrscheinlich, dass das Serverprogramm (z. B. Uvicorn) beim Hochfahren des Servers automatisch gestartet wird und kein **menschliches Eingreifen** erforderlich ist, sodass immer ein Prozess mit Ihrer API ausgeführt wird (z. B. Uvicorn, welches Ihre FastAPI-Anwendung ausführt).
### Separates Programm
### Separates Programm { #separate-program }
Um dies zu erreichen, haben Sie normalerweise ein **separates Programm**, welches sicherstellt, dass Ihre Anwendung beim Hochfahren ausgeführt wird. Und in vielen Fällen würde es auch sicherstellen, dass auch andere Komponenten oder Anwendungen ausgeführt werden, beispielsweise eine Datenbank.
### Beispieltools zur Ausführung beim Hochfahren
### Beispieltools zur Ausführung beim Hochfahren { #example-tools-to-run-at-startup }
Einige Beispiele für Tools, die diese Aufgabe übernehmen können, sind:
@@ -125,40 +125,43 @@ Einige Beispiele für Tools, die diese Aufgabe übernehmen können, sind:
In den nächsten Kapiteln werde ich Ihnen konkretere Beispiele geben.
## Neustart
## Neustart { #restarts }
Ähnlich wie Sie sicherstellen möchten, dass Ihre Anwendung beim Hochfahren ausgeführt wird, möchten Sie wahrscheinlich auch sicherstellen, dass diese nach Fehlern **neu gestartet** wird.
### Wir machen Fehler
### Wir machen Fehler { #we-make-mistakes }
Wir, als Menschen, machen ständig **Fehler**. Software hat fast *immer* **Bugs**, die an verschiedenen Stellen versteckt sind. 🐛
Und wir als Entwickler verbessern den Code ständig, wenn wir diese Bugs finden und neue Funktionen implementieren (und möglicherweise auch neue Bugs hinzufügen 😅).
### Kleine Fehler automatisch handhaben
### Kleine Fehler automatisch handhaben { #small-errors-automatically-handled }
Wenn beim Erstellen von Web-APIs mit FastAPI ein Fehler in unserem Code auftritt, wird FastAPI ihn normalerweise dem einzelnen Request zurückgeben, der den Fehler ausgelöst hat. 🛡
Wenn beim Erstellen von Web-APIs mit FastAPI ein Fehler in unserem Code auftritt, wird FastAPI ihn normalerweise dem einzelnen <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Request</abbr> zurückgeben, der den Fehler ausgelöst hat. 🛡
Der Client erhält für diesen Request einen **500 Internal Server Error**, aber die Anwendung arbeitet bei den nächsten Requests weiter, anstatt einfach komplett abzustürzen.
### Größere Fehler Abstürze
### Größere Fehler Abstürze { #bigger-errors-crashes }
Dennoch kann es vorkommen, dass wir Code schreiben, der **die gesamte Anwendung zum Absturz bringt** und so zum Absturz von Uvicorn und Python führt. 💥
Und dennoch möchten Sie wahrscheinlich nicht, dass die Anwendung tot bleibt, weil an einer Stelle ein Fehler aufgetreten ist. Sie möchten wahrscheinlich, dass sie zumindest für die *Pfadoperationen*, die nicht fehlerhaft sind, **weiterläuft**.
### Neustart nach Absturz
### Neustart nach Absturz { #restart-after-crash }
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"
... 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.
/// tip | Tipp
Konzentrieren wir uns also auf die Hauptfälle, in denen die Anwendung in bestimmten Fällen **in der Zukunft** völlig abstürzen könnte und es dann dennoch sinnvoll ist, sie neu zu starten.
... Obwohl es wahrscheinlich keinen Sinn macht, sie immer wieder neu zu starten, wenn die gesamte Anwendung einfach **sofort abstürzt**. Aber in diesen Fällen werden Sie es wahrscheinlich während der Entwicklung oder zumindest direkt nach dem Deployment bemerken.
Konzentrieren wir uns also auf die Hauptfälle, in denen die Anwendung in bestimmten Fällen **in der Zukunft** völlig abstürzen könnte und es dann dennoch sinnvoll ist, sie neu zu starten.
///
Sie möchten wahrscheinlich, dass eine **externe Komponente** für den Neustart Ihrer Anwendung verantwortlich ist, da zu diesem Zeitpunkt dieselbe Anwendung mit Uvicorn und Python bereits abgestürzt ist und es daher nichts im selben Code derselben Anwendung gibt, was etwas dagegen tun kann.
### Beispieltools zum automatischen Neustart
### Beispieltools zum automatischen Neustart { #example-tools-to-restart-automatically }
In den meisten Fällen wird dasselbe Tool, das zum **Ausführen des Programms beim Hochfahren** verwendet wird, auch für automatische **Neustarts** verwendet.
@@ -173,19 +176,19 @@ Dies könnte zum Beispiel erledigt werden durch:
* Intern von einem Cloud-Anbieter im Rahmen seiner Dienste
* Andere ...
## Replikation Prozesse und Arbeitsspeicher
## Replikation Prozesse und Arbeitsspeicher { #replication-processes-and-memory }
Wenn Sie eine FastAPI-Anwendung verwenden und ein Serverprogramm wie Uvicorn verwenden, kann **ein einzelner Prozess** mehrere Clients gleichzeitig bedienen.
Wenn Sie eine FastAPI-Anwendung verwenden und ein Serverprogramm wie den `fastapi`-Befehl, der Uvicorn ausführt, kann **ein einzelner Prozess** an mehrere Clients gleichzeitig ausliefern.
In vielen Fällen möchten Sie jedoch mehrere Prozesse gleichzeitig ausführen.
In vielen Fällen möchten Sie jedoch mehrere Workerprozesse gleichzeitig ausführen.
### Mehrere Prozesse Worker
### Mehrere Prozesse Worker { #multiple-processes-workers }
Wenn Sie mehr Clients haben, als ein einzelner Prozess verarbeiten kann (z. B. wenn die virtuelle Maschine nicht sehr groß ist) und die CPU des Servers **mehrere Kerne** hat, dann könnten **mehrere Prozesse** gleichzeitig mit derselben Anwendung laufen und alle Requests unter sich verteilen.
Wenn Sie mit **mehreren Prozessen** dasselbe API-Programm ausführen, werden diese üblicherweise als **<abbr title="Arbeiter">Worker</abbr>** bezeichnet.
Wenn Sie mit **mehreren Prozessen** dasselbe API-Programm ausführen, werden diese üblicherweise als <abbr title="Arbeiter">**Worker**</abbr> bezeichnet.
### Workerprozesse und Ports
### Workerprozesse und Ports { #worker-processes-and-ports }
Erinnern Sie sich aus der Dokumentation [Über HTTPS](https.md){.internal-link target=_blank}, dass nur ein Prozess auf einer Kombination aus Port und IP-Adresse auf einem Server lauschen kann?
@@ -193,35 +196,35 @@ Das ist immer noch wahr.
Um also **mehrere Prozesse** gleichzeitig zu haben, muss es einen **einzelnen Prozess geben, der einen Port überwacht**, welcher dann die Kommunikation auf irgendeine Weise an jeden Workerprozess überträgt.
### Arbeitsspeicher pro Prozess
### Arbeitsspeicher pro Prozess { #memory-per-process }
Wenn das Programm nun Dinge in den Arbeitsspeicher lädt, zum Beispiel ein Modell für maschinelles Lernen in einer Variablen oder den Inhalt einer großen Datei in einer Variablen, verbraucht das alles **einen Teil des Arbeitsspeichers (RAM Random Access Memory)** des Servers.
Und mehrere Prozesse teilen sich normalerweise keinen Speicher. Das bedeutet, dass jeder laufende Prozess seine eigenen Dinge, eigenen Variablen und eigenen Speicher hat. Und wenn Sie in Ihrem Code viel Speicher verbrauchen, verbraucht **jeder Prozess** die gleiche Menge Speicher.
### Serverspeicher
### Serverspeicher { #server-memory }
Wenn Ihr Code beispielsweise ein Machine-Learning-Modell mit **1 GB Größe** lädt und Sie einen Prozess mit Ihrer API ausführen, verbraucht dieser mindestens 1 GB RAM. Und wenn Sie **4 Prozesse** (4 Worker) starten, verbraucht jeder 1 GB RAM. Insgesamt verbraucht Ihre API also **4 GB RAM**.
Und wenn Ihr entfernter Server oder Ihre virtuelle Maschine nur über 3 GB RAM verfügt, führt der Versuch, mehr als 4 GB RAM zu laden, zu Problemen. 🚨
### Mehrere Prozesse Ein Beispiel
### Mehrere Prozesse Ein Beispiel { #multiple-processes-an-example }
Im folgenden Beispiel gibt es einen **Manager-Prozess**, welcher zwei **Workerprozesse** startet und steuert.
Dieser Manager-Prozess wäre wahrscheinlich derjenige, welcher der IP am **Port** lauscht. Und er würde die gesamte Kommunikation an die Workerprozesse weiterleiten.
Diese Workerprozesse würden Ihre Anwendung ausführen, sie würden die Hauptberechnungen durchführen, um einen **Request** entgegenzunehmen und eine **Response** zurückzugeben, und sie würden alles, was Sie in Variablen einfügen, in den RAM laden.
Diese Workerprozesse würden Ihre Anwendung ausführen, sie würden die Hauptberechnungen durchführen, um einen **<abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Request</abbr>** entgegenzunehmen und eine **<abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>** zurückzugeben, und sie würden alles, was Sie in Variablen einfügen, in den RAM laden.
<img src="/img/deployment/concepts/process-ram.svg">
<img src="/img/deployment/concepts/process-ram.drawio.svg">
Und natürlich würden auf derselben Maschine neben Ihrer Anwendung wahrscheinlich auch **andere Prozesse** laufen.
Und natürlich würden auf derselben Maschine neben Ihrer Anwendung wahrscheinlich **andere Prozesse** laufen.
Ein interessantes Detail ist dabei, dass der Prozentsatz der von jedem Prozess verwendeten **CPU** im Laufe der Zeit stark **variieren** kann, der **Arbeitsspeicher (RAM)** jedoch normalerweise mehr oder weniger **stabil** bleibt.
Wenn Sie eine API haben, die jedes Mal eine vergleichbare Menge an Berechnungen durchführt, und Sie viele Clients haben, dann wird die **CPU-Auslastung** wahrscheinlich *ebenfalls stabil sein* (anstatt ständig schnell zu steigen und zu fallen).
### Beispiele für Replikation-Tools und -Strategien
### Beispiele für Replikation-Tools und -Strategien { #examples-of-replication-tools-and-strategies }
Es gibt mehrere Ansätze, um dies zu erreichen, und ich werde Ihnen in den nächsten Kapiteln mehr über bestimmte Strategien erzählen, beispielsweise wenn es um Docker und Container geht.
@@ -229,21 +232,22 @@ Die wichtigste zu berücksichtigende Einschränkung besteht darin, dass es eine
Hier sind einige mögliche Kombinationen und Strategien:
* **Gunicorn**, welches **Uvicorn-Worker** managt
* Gunicorn wäre der **Prozessmanager**, der die **IP** und den **Port** überwacht, die Replikation würde durch **mehrere Uvicorn-Workerprozesse** erfolgen
* **Uvicorn**, welches **Uvicorn-Worker** managt
* **Uvicorn** mit `--workers`
* Ein Uvicorn-**Prozessmanager** würde der **IP** am **Port** lauschen, und er würde **mehrere Uvicorn-Workerprozesse** starten.
* **Kubernetes** und andere verteilte **Containersysteme**
* Etwas in der **Kubernetes**-Ebene würde die **IP** und den **Port** abhören. Die Replikation hätte **mehrere Container**, in jedem wird jeweils **ein Uvicorn-Prozess** ausgeführt.
* **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"
Machen Sie sich keine Sorgen, wenn einige dieser Punkte zu **Containern**, Docker oder Kubernetes noch nicht viel Sinn ergeben.
/// tip | Tipp
Ich werde Ihnen in einem zukünftigen Kapitel mehr über Container-Images, Docker, Kubernetes, usw. erzählen: [FastAPI in Containern Docker](docker.md){.internal-link target=_blank}.
Machen Sie sich keine Sorgen, wenn einige dieser Punkte zu **Containern**, Docker oder Kubernetes noch nicht viel Sinn ergeben.
## Schritte vor dem Start
Ich werde Ihnen in einem zukünftigen Kapitel mehr über Container-Images, Docker, Kubernetes, usw. erzählen: [FastAPI in Containern Docker](docker.md){.internal-link target=_blank}.
///
## Schritte vor dem Start { #previous-steps-before-starting }
Es gibt viele Fälle, in denen Sie, **bevor Sie Ihre Anwendung starten**, einige Schritte ausführen möchten.
@@ -257,14 +261,17 @@ 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"
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.
/// tip | Tipp
In diesem Fall müssen Sie sich darüber keine Sorgen machen. 🤷
Bedenken Sie außerdem, dass Sie, abhängig von Ihrer Einrichtung, in manchen Fällen **gar keine Vorab-Schritte** benötigen, bevor Sie die Anwendung starten.
### Beispiele für Strategien für Vorab-Schritte
In diesem Fall müssen Sie sich darüber keine Sorgen machen. 🤷
Es hängt **stark** davon ab, wie Sie **Ihr System bereitstellen**, und hängt wahrscheinlich mit der Art und Weise zusammen, wie Sie Programme starten, Neustarts durchführen, usw.
///
### Beispiele für Strategien für Vorab-Schritte { #examples-of-previous-steps-strategies }
Es hängt **stark** davon ab, wie Sie **Ihr System deployen**, und hängt wahrscheinlich mit der Art und Weise zusammen, wie Sie Programme starten, Neustarts durchführen, usw.
Hier sind einige mögliche Ideen:
@@ -272,10 +279,13 @@ 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"
Konkretere Beispiele hierfür mit Containern gebe ich Ihnen in einem späteren Kapitel: [FastAPI in Containern Docker](docker.md){.internal-link target=_blank}.
/// tip | Tipp
## Ressourcennutzung
Konkretere Beispiele hierfür mit Containern gebe ich Ihnen in einem späteren Kapitel: [FastAPI in Containern Docker](docker.md){.internal-link target=_blank}.
///
## Ressourcennutzung { #resource-utilization }
Ihr(e) Server ist (sind) eine **Ressource**, welche Sie mit Ihren Programmen, der Rechenzeit auf den CPUs und dem verfügbaren RAM-Speicher verbrauchen oder **nutzen** können.
@@ -291,13 +301,13 @@ In diesem Fall wäre es besser, **einen zusätzlichen Server** zu besorgen und e
Es besteht auch die Möglichkeit, dass es aus irgendeinem Grund zu **Spitzen** in der Nutzung Ihrer API kommt. Vielleicht ist diese viral gegangen, oder vielleicht haben andere Dienste oder Bots damit begonnen, sie zu nutzen. Und vielleicht möchten Sie in solchen Fällen über zusätzliche Ressourcen verfügen, um auf der sicheren Seite zu sein.
Sie können eine **beliebige Zahl** festlegen, um beispielsweise eine Ressourcenauslastung zwischen **50 % und 90 %** anzustreben. Der Punkt ist, dass dies wahrscheinlich die wichtigen Dinge sind, die Sie messen und verwenden sollten, um Ihre Deployments zu optimieren.
Sie können eine **beliebige Zahl** festlegen, um beispielsweise eine Ressourcenauslastung zwischen **50 % und 90 %** anzustreben. Der Punkt ist, dass dies wahrscheinlich die wichtigen Dinge sind, die Sie messen und verwenden sollten, um Ihre Deployments zu optimieren.
Sie können einfache Tools wie `htop` verwenden, um die in Ihrem Server verwendete CPU und den RAM oder die von jedem Prozess verwendete Menge anzuzeigen. Oder Sie können komplexere Überwachungstools verwenden, die möglicherweise auf mehrere Server usw. verteilt sind.
## Zusammenfassung
## Zusammenfassung { #recap }
Sie haben hier einige der wichtigsten Konzepte gelesen, die Sie wahrscheinlich berücksichtigen müssen, wenn Sie entscheiden, wie Sie Ihre Anwendung bereitstellen:
Sie haben hier einige der wichtigsten Konzepte gelesen, die Sie wahrscheinlich berücksichtigen müssen, wenn Sie entscheiden, wie Sie Ihre Anwendung deployen:
* Sicherheit HTTPS
* Beim Hochfahren ausführen

View File

@@ -1,13 +1,16 @@
# FastAPI in Containern Docker
# FastAPI in Containern Docker { #fastapi-in-containers-docker }
Beim Deployment von FastAPI-Anwendungen besteht ein gängiger Ansatz darin, ein **Linux-Containerimage** zu erstellen. Normalerweise erfolgt dies mit <a href="https://www.docker.com/" class="external-link" target="_blank">**Docker**</a>. Sie können dieses Containerimage dann auf eine von mehreren möglichen Arten bereitstellen.
Beim Deployment von FastAPI-Anwendungen besteht ein gängiger Ansatz darin, ein **Linux-Containerimage** zu erstellen. Normalerweise erfolgt dies mit <a href="https://www.docker.com/" class="external-link" target="_blank">**Docker**</a>. Sie können dieses Containerimage dann auf eine von mehreren möglichen Arten deployen.
Die Verwendung von Linux-Containern bietet mehrere Vorteile, darunter **Sicherheit**, **Replizierbarkeit**, **Einfachheit** und andere.
!!! tip "Tipp"
Sie haben es eilig und kennen sich bereits aus? Springen Sie zum [`Dockerfile` unten 👇](#ein-docker-image-fur-fastapi-erstellen).
/// tip | Tipp
<Details>
Sie haben es eilig und kennen sich bereits aus? Springen Sie zum [`Dockerfile` unten 👇](#build-a-docker-image-for-fastapi).
///
<details>
<summary>Dockerfile-Vorschau 👀</summary>
```Dockerfile
@@ -21,15 +24,15 @@ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
CMD ["fastapi", "run", "app/main.py", "--port", "80"]
# Wenn Sie hinter einem Proxy wie Nginx oder Traefik sind, fügen Sie --proxy-headers hinzu
# CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80", "--proxy-headers"]
# CMD ["fastapi", "run", "app/main.py", "--port", "80", "--proxy-headers"]
```
</details>
## Was ist ein Container?
## Was ist ein Container { #what-is-a-container }
Container (hauptsächlich Linux-Container) sind eine sehr **leichtgewichtige** Möglichkeit, Anwendungen einschließlich aller ihrer Abhängigkeiten und erforderlichen Dateien zu verpacken und sie gleichzeitig von anderen Containern (anderen Anwendungen oder Komponenten) im selben System isoliert zu halten.
@@ -37,9 +40,9 @@ Linux-Container werden mit demselben Linux-Kernel des Hosts (Maschine, virtuelle
Auf diese Weise verbrauchen Container **wenig Ressourcen**, eine Menge vergleichbar mit der direkten Ausführung der Prozesse (eine virtuelle Maschine würde viel mehr verbrauchen).
Container verfügen außerdem über ihre eigenen **isoliert** laufenden Prozesse (üblicherweise nur einen Prozess), über ihr eigenes Dateisystem und ihr eigenes Netzwerk, was die Bereitstellung, Sicherheit, Entwicklung usw. vereinfacht.
Container verfügen außerdem über ihre eigenen **isoliert** laufenden Prozesse (üblicherweise nur einen Prozess), über ihr eigenes Dateisystem und ihr eigenes Netzwerk, was Deployment, Sicherheit, Entwicklung usw. vereinfacht.
## Was ist ein Containerimage?
## Was ist ein Containerimage { #what-is-a-container-image }
Ein **Container** wird von einem **Containerimage** ausgeführt.
@@ -47,17 +50,17 @@ Ein Containerimage ist eine **statische** Version aller Dateien, Umgebungsvariab
Im Gegensatz zu einem „**Containerimage**“, bei dem es sich um den gespeicherten statischen Inhalt handelt, bezieht sich ein „**Container**“ normalerweise auf die laufende Instanz, das Ding, das **ausgeführt** wird.
Wenn der **Container** gestartet und ausgeführt wird (gestartet von einem **Containerimage**), kann er Dateien, Umgebungsvariablen usw. erstellen oder ändern. Diese Änderungen sind nur in diesem Container vorhanden, nicht im zugrunde liegenden bestehen Containerimage (werden nicht auf der Festplatte gespeichert).
Wenn der **Container** gestartet und ausgeführt wird (gestartet von einem **Containerimage**), kann er Dateien, Umgebungsvariablen usw. erstellen oder ändern. Diese Änderungen sind nur in diesem Container vorhanden, nicht im zugrunde liegenden Containerimage (werden nicht auf der Festplatte gespeichert).
Ein Containerimage ist vergleichbar mit der **Programmdatei** und ihrem Inhalt, z. B. `python` und eine Datei `main.py`.
Und der **Container** selbst (im Gegensatz zum **Containerimage**) ist die tatsächlich laufende Instanz des Images, vergleichbar mit einem **Prozess**. Tatsächlich läuft ein Container nur, wenn er einen **laufenden Prozess** hat (und normalerweise ist es nur ein einzelner Prozess). Der Container stoppt, wenn kein Prozess darin ausgeführt wird.
## Containerimages
## Containerimages { #container-images }
Docker ist eines der wichtigsten Tools zum Erstellen und Verwalten von **Containerimages** und **Containern**.
Und es gibt einen öffentlichen <a href="https://hub.docker.com/" class="external-link" target="_blank">Docker <abbr title="Umschlagsplatz">Hub</abbr></a> mit vorgefertigten **offiziellen Containerimages** für viele Tools, Umgebungen, Datenbanken und Anwendungen.
Und es gibt einen öffentlichen <a href="https://hub.docker.com/" class="external-link" target="_blank">Docker <abbr title="Umschlagplatz">Hub</abbr></a> mit vorgefertigten **offiziellen Containerimages** für viele Tools, Umgebungen, Datenbanken und Anwendungen.
Beispielsweise gibt es ein offizielles <a href="https://hub.docker.com/_/python" class="external-link" target="_blank">Python-Image</a>.
@@ -76,7 +79,7 @@ Sie würden also **mehrere Container** mit unterschiedlichen Dingen ausführen,
In alle Containerverwaltungssysteme (wie Docker oder Kubernetes) sind diese Netzwerkfunktionen integriert.
## Container und Prozesse
## Container und Prozesse { #containers-and-processes }
Ein **Containerimage** enthält normalerweise in seinen Metadaten das Standardprogramm oder den Standardbefehl, der ausgeführt werden soll, wenn der **Container** gestartet wird, sowie die Parameter, die an dieses Programm übergeben werden sollen. Sehr ähnlich zu dem, was wäre, wenn es über die Befehlszeile gestartet werden würde.
@@ -88,7 +91,7 @@ Ein Container hat normalerweise einen **einzelnen Prozess**, aber es ist auch m
Es ist jedoch nicht möglich, einen laufenden Container, ohne **mindestens einen laufenden Prozess** zu haben. Wenn der Hauptprozess stoppt, stoppt der Container.
## Ein Docker-Image für FastAPI erstellen
## Ein Docker-Image für FastAPI erstellen { #build-a-docker-image-for-fastapi }
Okay, wollen wir jetzt etwas bauen! 🚀
@@ -100,7 +103,7 @@ Das ist, was Sie in **den meisten Fällen** tun möchten, zum Beispiel:
* Beim Betrieb auf einem **Raspberry Pi**
* Bei Verwendung eines Cloud-Dienstes, der ein Containerimage für Sie ausführt, usw.
### Paketanforderungen
### Paketanforderungen { #package-requirements }
Normalerweise befinden sich die **Paketanforderungen** für Ihre Anwendung in einer Datei.
@@ -113,9 +116,8 @@ Sie würden natürlich die gleichen Ideen verwenden, die Sie in [Über FastAPI-V
Ihre `requirements.txt` könnte beispielsweise so aussehen:
```
fastapi>=0.68.0,<0.69.0
pydantic>=1.8.0,<2.0.0
uvicorn>=0.15.0,<0.16.0
fastapi[standard]>=0.113.0,<0.114.0
pydantic>=2.7.0,<3.0.0
```
Und normalerweise würden Sie diese Paketabhängigkeiten mit `pip` installieren, zum Beispiel:
@@ -125,17 +127,18 @@ Und normalerweise würden Sie diese Paketabhängigkeiten mit `pip` installieren,
```console
$ pip install -r requirements.txt
---> 100%
Successfully installed fastapi pydantic uvicorn
Successfully installed fastapi pydantic
```
</div>
!!! info
Es gibt andere Formate und Tools zum Definieren und Installieren von Paketabhängigkeiten.
/// info | Info
Ich zeige Ihnen später in einem Abschnitt unten ein Beispiel unter Verwendung von Poetry. 👇
Es gibt andere Formate und Tools zum Definieren und Installieren von Paketabhängigkeiten.
### Den **FastAPI**-Code erstellen
///
### Den **FastAPI**-Code erstellen { #create-the-fastapi-code }
* Erstellen Sie ein `app`-Verzeichnis und betreten Sie es.
* Erstellen Sie eine leere Datei `__init__.py`.
@@ -159,35 +162,35 @@ def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
### Dockerfile
### Dockerfile { #dockerfile }
Erstellen Sie nun im selben Projektverzeichnis eine Datei `Dockerfile` mit:
```{ .dockerfile .annotate }
# (1)
# (1)!
FROM python:3.9
# (2)
# (2)!
WORKDIR /code
# (3)
# (3)!
COPY ./requirements.txt /code/requirements.txt
# (4)
# (4)!
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
# (5)
# (5)!
COPY ./app /code/app
# (6)
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
# (6)!
CMD ["fastapi", "run", "app/main.py", "--port", "80"]
```
1. Beginne mit dem offiziellen Python-Basisimage.
2. Setze das aktuelle Arbeitsverzeichnis auf `/code`.
Hier plazieren wir die Datei `requirements.txt` und das Verzeichnis `app`.
Hier platzieren wir die Datei `requirements.txt` und das Verzeichnis `app`.
3. Kopiere die Datei mit den Paketanforderungen in das Verzeichnis `/code`.
@@ -199,8 +202,11 @@ CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
Die Option `--no-cache-dir` weist `pip` an, die heruntergeladenen Pakete nicht lokal zu speichern, da dies nur benötigt wird, sollte `pip` erneut ausgeführt werden, um dieselben Pakete zu installieren, aber das ist beim Arbeiten mit Containern nicht der Fall.
!!! note "Hinweis"
Das `--no-cache-dir` bezieht sich nur auf `pip`, es hat nichts mit Docker oder Containern zu tun.
/// note | Hinweis
Das `--no-cache-dir` bezieht sich nur auf `pip`, es hat nichts mit Docker oder Containern zu tun.
///
Die Option `--upgrade` weist `pip` an, die Packages zu aktualisieren, wenn sie bereits installiert sind.
@@ -214,16 +220,49 @@ CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
Daher ist es wichtig, dies **nahe dem Ende** des `Dockerfile`s zu platzieren, um die Erstellungszeiten des Containerimages zu optimieren.
6. Lege den **Befehl** fest, um den `uvicorn`-Server zu starten.
6. Lege den **Befehl** fest, um `fastapi run` zu nutzen, welches Uvicorn darunter verwendet.
`CMD` nimmt eine Liste von Zeichenfolgen entgegen. Jede dieser Zeichenfolgen entspricht dem, was Sie durch Leerzeichen getrennt in die Befehlszeile eingeben würden.
Dieser Befehl wird aus dem **aktuellen Arbeitsverzeichnis** ausgeführt, dem gleichen `/code`-Verzeichnis, das Sie oben mit `WORKDIR /code` festgelegt haben.
Da das Programm unter `/code` gestartet wird und sich darin das Verzeichnis `./app` mit Ihrem Code befindet, kann **Uvicorn** `app` sehen und aus `app.main` **importieren**.
/// tip | Tipp
!!! tip "Tipp"
Lernen Sie, was jede Zeile bewirkt, indem Sie auf die Zahlenblasen im Code klicken. 👆
Lernen Sie, was jede Zeile bewirkt, indem Sie auf die Zahlenblasen im Code klicken. 👆
///
/// warning | Achtung
Stellen Sie sicher, dass Sie **immer** die **exec form** der Anweisung `CMD` verwenden, wie unten erläutert.
///
#### `CMD` Exec Form verwenden { #use-cmd-exec-form }
Die <a href="https://docs.docker.com/reference/dockerfile/#cmd" class="external-link" target="_blank">`CMD`</a> Docker-Anweisung kann in zwei Formen geschrieben werden:
✅ **Exec** form:
```Dockerfile
# ✅ Tun Sie das
CMD ["fastapi", "run", "app/main.py", "--port", "80"]
```
⛔️ **Shell** form:
```Dockerfile
# ⛔️ Tun Sie das nicht
CMD fastapi run app/main.py --port 80
```
Achten Sie darauf, stets die **exec** form zu verwenden, um sicherzustellen, dass FastAPI ordnungsgemäß heruntergefahren wird und [Lifespan-Events](../advanced/events.md){.internal-link target=_blank} ausgelöst werden.
Sie können mehr darüber in der <a href="https://docs.docker.com/reference/dockerfile/#shell-and-exec-form" class="external-link" target="_blank">Docker-Dokumentation für Shell und Exec Form lesen</a>.
Dies kann insbesondere bei der Verwendung von `docker compose` deutlich spürbar sein. Sehen Sie sich diesen Abschnitt in der Docker Compose-FAQ für technische Details an: <a href="https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop" class="external-link" target="_blank">Warum benötigen meine Dienste 10 Sekunden, um neu erstellt oder gestoppt zu werden?</a>.
#### Verzeichnisstruktur { #directory-structure }
Sie sollten jetzt eine Verzeichnisstruktur wie diese haben:
@@ -236,15 +275,15 @@ Sie sollten jetzt eine Verzeichnisstruktur wie diese haben:
└── requirements.txt
```
#### Hinter einem TLS-Terminierungsproxy
#### Hinter einem TLS-Terminierungsproxy { #behind-a-tls-termination-proxy }
Wenn Sie Ihren Container hinter einem TLS-Terminierungsproxy (Load Balancer) wie Nginx oder Traefik ausführen, fügen Sie die Option `--proxy-headers` hinzu. Das sagt Uvicorn, den von diesem Proxy gesendeten Headern zu vertrauen und dass die Anwendung hinter HTTPS ausgeführt wird, usw.
Wenn Sie Ihren Container hinter einem TLS-Terminierungsproxy (Load Balancer) wie Nginx oder Traefik ausführen, fügen Sie die Option `--proxy-headers` hinzu. Das sagt Uvicorn (durch das FastAPI CLI), den von diesem Proxy gesendeten Headern zu vertrauen und dass die Anwendung hinter HTTPS ausgeführt wird, usw.
```Dockerfile
CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
CMD ["fastapi", "run", "app/main.py", "--proxy-headers", "--port", "80"]
```
#### Docker-Cache
#### Docker-Cache { #docker-cache }
In diesem `Dockerfile` gibt es einen wichtigen Trick: Wir kopieren zuerst die **Datei nur mit den Abhängigkeiten**, nicht den Rest des Codes. Lassen Sie mich Ihnen erklären, warum.
@@ -276,7 +315,7 @@ Dann, gegen Ende des `Dockerfile`s, kopieren wir den gesamten Code. Da sich der
COPY ./app /code/app
```
### Das Docker-Image erstellen
### Das Docker-Image erstellen { #build-the-docker-image }
Nachdem nun alle Dateien vorhanden sind, erstellen wir das Containerimage.
@@ -293,12 +332,15 @@ $ docker build -t myimage .
</div>
!!! tip "Tipp"
Beachten Sie das `.` am Ende, es entspricht `./` und teilt Docker mit, welches Verzeichnis zum Erstellen des Containerimages verwendet werden soll.
/// tip | Tipp
In diesem Fall handelt es sich um dasselbe aktuelle Verzeichnis (`.`).
Beachten Sie das `.` am Ende, es entspricht `./` und teilt Docker mit, welches Verzeichnis zum Erstellen des Containerimages verwendet werden soll.
### Den Docker-Container starten
In diesem Fall handelt es sich um dasselbe aktuelle Verzeichnis (`.`).
///
### Den Docker-Container starten { #start-the-docker-container }
* Führen Sie einen Container basierend auf Ihrem Image aus:
@@ -310,7 +352,7 @@ $ docker run -d --name mycontainer -p 80:80 myimage
</div>
## Es überprüfen
## Es testen { #check-it }
Sie sollten es in der URL Ihres Docker-Containers überprüfen können, zum Beispiel: <a href="http://192.168.99.100/items/5?q=somequery" class="external-link" target="_blank">http://192.168.99.100/items/5?q=somequery</a> oder <a href="http://127.0.0.1/items/5?q=somequery" class="external-link" target="_blank">http://127.0.0.1/items/5?q=somequery</a> (oder gleichwertig, unter Verwendung Ihres Docker-Hosts).
@@ -320,7 +362,7 @@ Sie werden etwas sehen wie:
{"item_id": 5, "q": "somequery"}
```
## Interaktive API-Dokumentation
## Interaktive API-Dokumentation { #interactive-api-docs }
Jetzt können Sie auf <a href="http://192.168.99.100/docs" class="external-link" target="_blank">http://192.168.99.100/docs</a> oder <a href="http://127.0.0.1/docs" class="external-link" target="_blank">http://127.0.0.1/docs</a> gehen (oder ähnlich, unter Verwendung Ihres Docker-Hosts).
@@ -328,7 +370,7 @@ Sie sehen die automatische interaktive API-Dokumentation (bereitgestellt von <a
![Swagger-Oberfläche](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png)
## Alternative API-Dokumentation
## Alternative API-Dokumentation { #alternative-api-docs }
Sie können auch auf <a href="http://192.168.99.100/redoc" class="external-link" target="_blank">http://192.168.99.100/redoc</a> oder <a href="http://127.0.0.1/redoc" class="external-link" target="_blank">http://127.0.0.1/redoc</a> gehen (oder ähnlich, unter Verwendung Ihres Docker-Hosts).
@@ -336,7 +378,7 @@ Sie sehen die alternative automatische Dokumentation (bereitgestellt von <a href
![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
## Ein Docker-Image mit einem Single-File-FastAPI erstellen
## Ein Docker-Image mit einem Single-File-FastAPI erstellen { #build-a-docker-image-with-a-single-file-fastapi }
Wenn Ihr FastAPI eine einzelne Datei ist, zum Beispiel `main.py` ohne ein `./app`-Verzeichnis, könnte Ihre Dateistruktur wie folgt aussehen:
@@ -358,20 +400,20 @@ COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
# (1)
# (1)!
COPY ./main.py /code/
# (2)
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
# (2)!
CMD ["fastapi", "run", "main.py", "--port", "80"]
```
1. Kopiere die Datei `main.py` direkt in das Verzeichnis `/code` (ohne ein Verzeichnis `./app`).
2. Führe Uvicorn aus und weisen es an, das `app`-Objekt von `main` zu importieren (anstatt von `app.main` zu importieren).
2. Verwenden Sie `fastapi run`, um Ihre Anwendung in der einzelnen Datei `main.py` bereitzustellen.
Passen Sie dann den Uvicorn-Befehl an, um das neue Modul `main` anstelle von `app.main` zu verwenden, um das FastAPI-Objekt `app` zu importieren.
Indem Sie die Datei an `fastapi run` übergeben, wird automatisch erkannt, dass es sich um eine einzelne Datei handelt und nicht um den Teil eines Packages, und es wird wissen, wie es zu importieren ist und Ihre FastAPI-App bereitzustellen. 😎
## Deployment-Konzepte
## Deployment-Konzepte { #deployment-concepts }
Lassen Sie uns noch einmal über einige der gleichen [Deployment-Konzepte](concepts.md){.internal-link target=_blank} in Bezug auf Container sprechen.
@@ -381,25 +423,28 @@ Die **gute Nachricht** ist, dass es mit jeder unterschiedlichen Strategie eine M
Sehen wir uns diese **Deployment-Konzepte** im Hinblick auf Container noch einmal an:
* Sicherheit HTTPS
* HTTPS
* Beim Hochfahren ausführen
* Neustarts
* Replikation (die Anzahl der laufenden Prozesse)
* Arbeitsspeicher
* Schritte vor dem Start
## HTTPS
## HTTPS { #https }
Wenn wir uns nur auf das **Containerimage** für eine FastAPI-Anwendung (und später auf den laufenden **Container**) konzentrieren, würde HTTPS normalerweise **extern** von einem anderen Tool verarbeitet.
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"
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.
/// 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.
///
Alternativ könnte HTTPS von einem Cloud-Anbieter als einer seiner Dienste gehandhabt werden (während die Anwendung weiterhin in einem Container ausgeführt wird).
## Beim Hochfahren ausführen und Neustarts
## Beim Hochfahren ausführen und Neustarts { #running-on-startup-and-restarts }
Normalerweise gibt es ein anderes Tool, das für das **Starten und Ausführen** Ihres Containers zuständig ist.
@@ -409,26 +454,29 @@ In den meisten (oder allen) Fällen gibt es eine einfache Option, um die Ausfüh
Ohne die Verwendung von Containern kann es umständlich und schwierig sein, Anwendungen beim Hochfahren auszuführen und neu zu starten. Bei der **Arbeit mit Containern** ist diese Funktionalität jedoch in den meisten Fällen standardmäßig enthalten. ✨
## Replikation Anzahl der Prozesse
## Replikation Anzahl der Prozesse { #replication-number-of-processes }
Wenn Sie einen <abbr title="Eine Gruppe von Maschinen, die so konfiguriert sind, dass sie verbunden sind und auf irgendeine Weise zusammenarbeiten.">Cluster</abbr> von Maschinen mit **Kubernetes**, Docker Swarm Mode, Nomad verwenden, oder einem anderen, ähnlich komplexen System zur Verwaltung verteilter Container auf mehreren Maschinen, möchten Sie wahrscheinlich die **Replikation auf Cluster-Ebene abwickeln**, anstatt in jedem Container einen **Prozessmanager** (wie Gunicorn mit Workern) zu verwenden.
Wenn Sie einen <abbr title="Eine Gruppe von Maschinen, die so konfiguriert sind, dass sie verbunden sind und auf irgendeine Weise zusammenarbeiten.">Cluster</abbr> von Maschinen mit **Kubernetes**, Docker Swarm Mode, Nomad verwenden, oder einem anderen, ähnlich komplexen System zur Verwaltung verteilter Container auf mehreren Maschinen, möchten Sie wahrscheinlich die **Replikation auf Cluster-Ebene abwickeln**, anstatt in jedem Container einen **Prozessmanager** (wie Uvicorn mit Workern) zu verwenden.
Diese verteilten Containerverwaltungssysteme wie Kubernetes verfügen normalerweise über eine integrierte Möglichkeit, die **Replikation von Containern** zu handhaben und gleichzeitig **Load Balancing** für die eingehenden Requests zu unterstützen. Alles auf **Cluster-Ebene**.
Diese verteilten Containerverwaltungssysteme wie Kubernetes verfügen normalerweise über eine integrierte Möglichkeit, die **Replikation von Containern** zu handhaben und gleichzeitig **Load Balancing** für die eingehenden <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Requests</abbr> zu unterstützen. Alles auf **Cluster-Ebene**.
In diesen Fällen möchten Sie wahrscheinlich ein **Docker-Image von Grund auf** erstellen, wie [oben erklärt](#dockerfile), Ihre Abhängigkeiten installieren und **einen einzelnen Uvicorn-Prozess** ausführen, anstatt etwas wie Gunicorn mit Uvicorn-Workern auszuführen.
In diesen Fällen möchten Sie wahrscheinlich ein **Docker-Image von Grund auf** erstellen, wie [oben erklärt](#dockerfile), Ihre Abhängigkeiten installieren und **einen einzelnen Uvicorn-Prozess** ausführen, anstatt mehrere Uvicorn-Worker zu verwenden.
### Load Balancer
### Load Balancer { #load-balancer }
Bei der Verwendung von Containern ist normalerweise eine Komponente vorhanden, **die am Hauptport lauscht**. Es könnte sich um einen anderen Container handeln, der auch ein **TLS-Terminierungsproxy** ist, um **HTTPS** zu verarbeiten, oder ein ähnliches Tool.
Da diese Komponente die **Last** an Requests aufnehmen und diese (hoffentlich) **ausgewogen** auf die Worker verteilen würde, wird sie üblicherweise auch **Load Balancer** Lastverteiler genannt.
Da diese Komponente die **Last** an Requests aufnehmen und diese (hoffentlich) **ausgewogen** auf die Worker verteilen würde, wird sie üblicherweise auch <abbr title="Lastverteiler">**Load Balancer**</abbr> genannt.
!!! tip "Tipp"
Die gleiche **TLS-Terminierungsproxy**-Komponente, die für HTTPS verwendet wird, wäre wahrscheinlich auch ein **Load Balancer**.
/// tip | Tipp
Die gleiche **TLS-Terminierungsproxy**-Komponente, die für HTTPS verwendet wird, wäre wahrscheinlich auch ein **Load Balancer**.
///
Und wenn Sie mit Containern arbeiten, verfügt das gleiche System, mit dem Sie diese starten und verwalten, bereits über interne Tools, um die **Netzwerkkommunikation** (z. B. HTTP-Requests) von diesem **Load Balancer** (das könnte auch ein **TLS-Terminierungsproxy** sein) zu den Containern mit Ihrer Anwendung weiterzuleiten.
### Ein Load Balancer mehrere Workercontainer
### Ein Load Balancer mehrere Workercontainer { #one-load-balancer-multiple-worker-containers }
Bei der Arbeit mit **Kubernetes** oder ähnlichen verteilten Containerverwaltungssystemen würde die Verwendung ihrer internen Netzwerkmechanismen es dem einzelnen **Load Balancer**, der den Haupt-**Port** überwacht, ermöglichen, Kommunikation (Requests) an möglicherweise **mehrere Container** weiterzuleiten, in denen Ihre Anwendung ausgeführt wird.
@@ -438,42 +486,49 @@ Und das verteilte Containersystem mit dem **Load Balancer** würde **die Request
Und normalerweise wäre dieser **Load Balancer** in der Lage, Requests zu verarbeiten, die an *andere* Anwendungen in Ihrem Cluster gerichtet sind (z. B. eine andere Domain oder unter einem anderen URL-Pfad-Präfix), und würde diese Kommunikation an die richtigen Container weiterleiten für *diese andere* Anwendung, die in Ihrem Cluster ausgeführt wird.
### Ein Prozess pro Container
### Ein Prozess pro Container { #one-process-per-container }
In einem solchen Szenario möchten Sie wahrscheinlich **einen einzelnen (Uvicorn-)Prozess pro Container** haben, da Sie die Replikation bereits auf Cluster ebene durchführen würden.
In einem solchen Szenario möchten Sie wahrscheinlich **einen einzelnen (Uvicorn-)Prozess pro Container** haben, da Sie die Replikation bereits auf Cluster-Ebene durchführen würden.
In diesem Fall möchten Sie also **nicht** einen Prozessmanager wie Gunicorn mit Uvicorn-Workern oder Uvicorn mit seinen eigenen Uvicorn-Workern haben. Sie möchten nur einen **einzelnen Uvicorn-Prozess** pro Container haben (wahrscheinlich aber mehrere Container).
In diesem Fall möchten Sie also **nicht** mehrere Worker im Container haben, z. B. mit der `--workers` Befehlszeilenoption. Sie möchten nur einen **einzelnen Uvicorn-Prozess** pro Container haben (wahrscheinlich aber mehrere Container).
Ein weiterer Prozessmanager im Container (wie es bei Gunicorn oder Uvicorn der Fall wäre, welche Uvicorn-Worker verwalten) würde nur **unnötige Komplexität** hinzufügen, um welche Sie sich höchstwahrscheinlich bereits mit Ihrem Clustersystem kümmern.
Ein weiterer Prozessmanager im Container (wie es bei mehreren Workern der Fall wäre) würde nur **unnötige Komplexität** hinzufügen, um welche Sie sich höchstwahrscheinlich bereits mit Ihrem Clustersystem kümmern.
### Container mit mehreren Prozessen und Sonderfälle
### Container mit mehreren Prozessen und Sonderfälle { #containers-with-multiple-processes-and-special-cases }
Natürlich gibt es **Sonderfälle**, in denen Sie **einen Container** mit einem **Gunicorn-Prozessmanager** haben möchten, welcher mehrere **Uvicorn-Workerprozesse** darin startet.
Natürlich gibt es **Sonderfälle**, in denen Sie **einen Container** mit mehreren **Uvicorn-Workerprozessen** haben möchten.
In diesen Fällen können Sie das **offizielle Docker-Image** verwenden, welches **Gunicorn** als Prozessmanager enthält, welcher mehrere **Uvicorn-Workerprozesse** ausführt, sowie einige Standardeinstellungen, um die Anzahl der Worker basierend auf den verfügbaren CPU-Kernen automatisch anzupassen. Ich erzähle Ihnen weiter unten in [Offizielles Docker-Image mit Gunicorn Uvicorn](#offizielles-docker-image-mit-gunicorn-uvicorn) mehr darüber.
In diesen Fällen können Sie die `--workers` Befehlszeilenoption verwenden, um die Anzahl der zu startenden Worker festzulegen:
```{ .dockerfile .annotate }
FROM python:3.9
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
# (1)!
CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
```
1. Hier verwenden wir die `--workers` Befehlszeilenoption, um die Anzahl der Worker auf 4 festzulegen.
Hier sind einige Beispiele, wann das sinnvoll sein könnte:
#### Eine einfache Anwendung
#### Eine einfache Anwendung { #a-simple-app }
Sie könnten einen Prozessmanager im Container haben wollen, wenn Ihre Anwendung **einfach genug** ist, sodass Sie die Anzahl der Prozesse nicht (zumindest noch nicht) zu stark tunen müssen und Sie einfach einen automatisierten Standard verwenden können (mit dem offiziellen Docker-Image), und Sie führen es auf einem **einzelnen Server** aus, nicht auf einem Cluster.
Sie könnten einen Prozessmanager im Container haben wollen, wenn Ihre Anwendung **einfach genug** ist, sodass Sie es auf einem **einzelnen Server** ausführen können, nicht auf einem Cluster.
#### Docker Compose
#### Docker Compose { #docker-compose }
Sie könnten das Deployment auf einem **einzelnen Server** (kein Cluster) mit **Docker Compose** durchführen, sodass Sie keine einfache Möglichkeit hätten, die Replikation von Containern (mit Docker Compose) zu verwalten und gleichzeitig das gemeinsame Netzwerk mit **Load Balancing** zu haben.
Dann möchten Sie vielleicht **einen einzelnen Container** mit einem **Prozessmanager** haben, der darin **mehrere Workerprozesse** startet.
#### Prometheus und andere Gründe
Sie könnten auch **andere Gründe** haben, die es einfacher machen würden, einen **einzelnen Container** mit **mehreren Prozessen** zu haben, anstatt **mehrere Container** mit **einem einzelnen Prozess** in jedem von ihnen.
Beispielsweise könnten Sie (abhängig von Ihrem Setup) ein Tool wie einen Prometheus-Exporter im selben Container haben, welcher Zugriff auf **jeden der eingehenden Requests** haben sollte.
Wenn Sie in hier **mehrere Container** hätten, würde Prometheus beim **Lesen der Metriken** standardmäßig jedes Mal diejenigen für **einen einzelnen Container** abrufen (für den Container, der den spezifischen Request verarbeitet hat), anstatt die **akkumulierten Metriken** für alle replizierten Container abzurufen.
In diesem Fall könnte einfacher sein, **einen Container** mit **mehreren Prozessen** und ein lokales Tool (z. B. einen Prometheus-Exporter) in demselben Container zu haben, welches Prometheus-Metriken für alle internen Prozesse sammelt und diese Metriken für diesen einzelnen Container offenlegt.
---
Der Hauptpunkt ist, dass **keine** dieser Regeln **in Stein gemeißelt** ist, der man blind folgen muss. Sie können diese Ideen verwenden, um **Ihren eigenen Anwendungsfall zu evaluieren**, zu entscheiden, welcher Ansatz für Ihr System am besten geeignet ist und herauszufinden, wie Sie folgende Konzepte verwalten:
@@ -485,100 +540,55 @@ Der Hauptpunkt ist, dass **keine** dieser Regeln **in Stein gemeißelt** ist, de
* Arbeitsspeicher
* Schritte vor dem Start
## Arbeitsspeicher
## Arbeitsspeicher { #memory }
Wenn Sie **einen einzelnen Prozess pro Container** ausführen, wird von jedem dieser Container (mehr als einer, wenn sie repliziert werden) eine mehr oder weniger klar definierte, stabile und begrenzte Menge an Arbeitsspeicher verbraucht.
Und dann können Sie dieselben Speichergrenzen und -anforderungen in Ihren Konfigurationen für Ihr Container-Management-System festlegen (z. B. in **Kubernetes**). Auf diese Weise ist es in der Lage, die Container auf den **verfügbaren Maschinen** zu replizieren, wobei die von denen benötigte Speichermenge und die auf den Maschinen im Cluster verfügbare Menge berücksichtigt werden.
Und dann können Sie dieselben Speichergrenzen und -anforderungen in Ihren Konfigurationen für Ihr Container-Management-System festlegen (z. B. in **Kubernetes**). Auf diese Weise ist es in der Lage, die Container auf den **verfügbaren Maschinen** zu replizieren, wobei die von diesen benötigte Speichermenge und die auf den Maschinen im Cluster verfügbare Menge berücksichtigt werden.
Wenn Ihre Anwendung **einfach** ist, wird dies wahrscheinlich **kein Problem darstellen** und Sie müssen möglicherweise keine festen Speichergrenzen angeben. Wenn Sie jedoch **viel Speicher verbrauchen** (z. B. bei **Modellen für maschinelles Lernen**), sollten Sie überprüfen, wie viel Speicher Sie verbrauchen, und die **Anzahl der Container** anpassen, die in **jeder Maschine** ausgeführt werden. (und möglicherweise weitere Maschinen zu Ihrem Cluster hinzufügen).
Wenn Ihre Anwendung **einfach** ist, wird dies wahrscheinlich **kein Problem darstellen** und Sie müssen möglicherweise keine festen Speichergrenzen angeben. Wenn Sie jedoch **viel Speicher verbrauchen** (z. B. bei **Modellen für maschinelles Lernen**), sollten Sie überprüfen, wie viel Speicher Sie verbrauchen, und die **Anzahl der Container** anpassen, die in **jeder Maschine** ausgeführt werden (und möglicherweise weitere Maschinen zu Ihrem Cluster hinzufügen).
Wenn Sie **mehrere Prozesse pro Container** ausführen (zum Beispiel mit dem offiziellen Docker-Image), müssen Sie sicherstellen, dass die Anzahl der gestarteten Prozesse nicht **mehr Speicher verbraucht** als verfügbar ist.
Wenn Sie **mehrere Prozesse pro Container** ausführen, müssen Sie sicherstellen, dass die Anzahl der gestarteten Prozesse nicht **mehr Speicher verbraucht** als verfügbar ist.
## Schritte vor dem Start und Container
## Schritte vor dem Start und Container { #previous-steps-before-starting-and-containers }
Wenn Sie Container (z. B. Docker, Kubernetes) verwenden, können Sie hauptsächlich zwei Ansätze verwenden.
### Mehrere Container
### Mehrere Container { #multiple-containers }
Wenn Sie **mehrere Container** haben, von denen wahrscheinlich jeder einen **einzelnen Prozess** ausführt (z. B. in einem **Kubernetes**-Cluster), dann möchten Sie wahrscheinlich einen **separaten Container** haben, welcher die Arbeit der **Vorab-Schritte** in einem einzelnen Container, mit einem einzelnenen Prozess ausführt, **bevor** die replizierten Workercontainer ausgeführt werden.
Wenn Sie **mehrere Container** haben, von denen wahrscheinlich jeder einen **einzelnen Prozess** ausführt (z. B. in einem **Kubernetes**-Cluster), dann möchten Sie wahrscheinlich einen **separaten Container** haben, welcher die Arbeit der **Vorab-Schritte** in einem einzelnen Container, mit einem einzelnen Prozess ausführt, **bevor** die replizierten Workercontainer ausgeführt werden.
!!! info
Wenn Sie Kubernetes verwenden, wäre dies wahrscheinlich ein <a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" class="external-link" target="_blank">Init-Container</a>.
/// info | Info
Wenn Sie Kubernetes verwenden, wäre dies wahrscheinlich ein <a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" class="external-link" target="_blank">Init-Container</a>.
///
Wenn es in Ihrem Anwendungsfall kein Problem darstellt, diese vorherigen Schritte **mehrmals parallel** auszuführen (z. B. wenn Sie keine Datenbankmigrationen ausführen, sondern nur prüfen, ob die Datenbank bereits bereit ist), können Sie sie auch einfach in jedem Container direkt vor dem Start des Hauptprozesses einfügen.
### Einzelner Container
### Einzelner Container { #single-container }
Wenn Sie ein einfaches Setup mit einem **einzelnen Container** haben, welcher dann mehrere **Workerprozesse** (oder auch nur einen Prozess) startet, können Sie die Vorab-Schritte im selben Container direkt vor dem Starten des Prozesses mit der Anwendung ausführen. Das offizielle Docker-Image unterstützt das intern.
Wenn Sie ein einfaches Setup mit einem **einzelnen Container** haben, welcher dann mehrere **Workerprozesse** (oder auch nur einen Prozess) startet, können Sie die Vorab-Schritte im selben Container direkt vor dem Starten des Prozesses mit der Anwendung ausführen.
## Offizielles Docker-Image mit Gunicorn Uvicorn
### Docker-Basisimage { #base-docker-image }
Es gibt ein offizielles Docker-Image, in dem Gunicorn mit Uvicorn-Workern ausgeführt wird, wie in einem vorherigen Kapitel beschrieben: [Serverworker Gunicorn mit Uvicorn](server-workers.md){.internal-link target=_blank}.
Es gab ein offizielles FastAPI-Docker-Image: <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>. Dieses ist jedoch jetzt veraltet. ⛔️
Dieses Image wäre vor allem in den oben beschriebenen Situationen nützlich: [Container mit mehreren Prozessen und Sonderfälle](#container-mit-mehreren-prozessen-und-sonderfalle).
Sie sollten wahrscheinlich **nicht** dieses Basis-Docker-Image (oder ein anderes ähnliches) verwenden.
* <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>.
Wenn Sie **Kubernetes** (oder andere) verwenden und bereits **Replikation** auf Cluster-Ebene mit mehreren **Containern** eingerichtet haben. In diesen Fällen ist es besser, **ein Image von Grund auf neu zu erstellen**, wie oben beschrieben: [Ein Docker-Image für FastAPI erstellen](#build-a-docker-image-for-fastapi).
!!! 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).
Und wenn Sie mehrere Worker benötigen, können Sie einfach die `--workers` Befehlszeilenoption verwenden.
Dieses Image verfügt über einen **Auto-Tuning**-Mechanismus, um die **Anzahl der Arbeitsprozesse** basierend auf den verfügbaren CPU-Kernen festzulegen.
/// note | Technische Details
Es verfügt über **vernünftige Standardeinstellungen**, aber Sie können trotzdem alle Konfigurationen mit **Umgebungsvariablen** oder Konfigurationsdateien ändern und aktualisieren.
Das Docker-Image wurde erstellt, als Uvicorn das Verwalten und Neustarten von ausgefallenen Workern noch nicht unterstützte, weshalb es notwendig war, Gunicorn mit Uvicorn zu verwenden, was zu einer erheblichen Komplexität führte, nur damit Gunicorn die Uvicorn-Workerprozesse verwaltet und neu startet.
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.
Aber jetzt, da Uvicorn (und der `fastapi`-Befehl) die Verwendung von `--workers` unterstützen, gibt es keinen Grund, ein Basis-Docker-Image an Stelle eines eigenen (das praktisch denselben Code enthält 😅) zu verwenden.
!!! 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>.
///
### Anzahl der Prozesse auf dem offiziellen Docker-Image
Die **Anzahl der Prozesse** auf diesem Image wird **automatisch** anhand der verfügbaren CPU-**Kerne** berechnet.
Das bedeutet, dass versucht wird, so viel **Leistung** wie möglich aus der CPU herauszuquetschen.
Sie können das auch in der Konfiguration anpassen, indem Sie **Umgebungsvariablen**, usw. verwenden.
Das bedeutet aber auch, da die Anzahl der Prozesse von der CPU abhängt, welche der Container ausführt, dass die **Menge des verbrauchten Speichers** ebenfalls davon abhängt.
Wenn Ihre Anwendung also viel Speicher verbraucht (z. B. bei Modellen für maschinelles Lernen) und Ihr Server über viele CPU-Kerne, **aber wenig Speicher** verfügt, könnte Ihr Container am Ende versuchen, mehr Speicher als vorhanden zu verwenden, was zu erheblichen Leistungseinbußen (oder sogar zum Absturz) führen kann. 🚨
### Ein `Dockerfile` erstellen
So würden Sie ein `Dockerfile` basierend auf diesem Image erstellen:
```Dockerfile
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9
COPY ./requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
COPY ./app /app
```
### Größere Anwendungen
Wenn Sie dem Abschnitt zum Erstellen von [größeren Anwendungen mit mehreren Dateien](../tutorial/bigger-applications.md){.internal-link target=_blank} gefolgt sind, könnte Ihr `Dockerfile` stattdessen wie folgt aussehen:
```Dockerfile hl_lines="7"
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9
COPY ./requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
COPY ./app /app/app
```
### Wann verwenden
Sie sollten dieses offizielle Basisimage (oder ein ähnliches) wahrscheinlich **nicht** benutzen, wenn Sie **Kubernetes** (oder andere) verwenden und Sie bereits **Replikation** auf Cluster ebene mit mehreren **Containern** eingerichtet haben. In diesen Fällen ist es besser, **ein Image von Grund auf zu erstellen**, wie oben beschrieben: [Ein Docker-Image für FastAPI erstellen](#ein-docker-image-fur-fastapi-erstellen).
Dieses Image wäre vor allem in den oben in [Container mit mehreren Prozessen und Sonderfälle](#container-mit-mehreren-prozessen-und-sonderfalle) beschriebenen Sonderfällen nützlich. Wenn Ihre Anwendung beispielsweise **einfach genug** ist, dass das Festlegen einer Standardanzahl von Prozessen basierend auf der CPU gut funktioniert, möchten Sie sich nicht mit der manuellen Konfiguration der Replikation auf Cluster ebene herumschlagen und führen nicht mehr als einen Container mit Ihrer Anwendung aus. Oder wenn Sie das Deployment mit **Docker Compose** durchführen und auf einem einzelnen Server laufen, usw.
## Deployment des Containerimages
## Deployment des Containerimages { #deploy-the-container-image }
Nachdem Sie ein Containerimage (Docker) haben, gibt es mehrere Möglichkeiten, es bereitzustellen.
@@ -588,99 +598,13 @@ Zum Beispiel:
* Mit einem **Kubernetes**-Cluster
* Mit einem Docker Swarm Mode-Cluster
* Mit einem anderen Tool wie Nomad
* Mit einem Cloud-Dienst, der Ihr Containerimage nimmt und es bereitstellt
* Mit einem Cloud-Dienst, der Ihr Containerimage nimmt und es deployt
## Docker-Image mit Poetry
## Docker-Image mit `uv` { #docker-image-with-uv }
Wenn Sie <a href="https://python-poetry.org/" class="external-link" target="_blank">Poetry</a> verwenden, um die Abhängigkeiten Ihres Projekts zu verwalten, können Sie Dockers mehrphasige Builds verwenden:
Wenn Sie <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">uv</a> verwenden, um Ihr Projekt zu installieren und zu verwalten, können Sie deren <a href="https://docs.astral.sh/uv/guides/integration/docker/" class="external-link" target="_blank">uv-Docker-Leitfaden</a> befolgen.
```{ .dockerfile .annotate }
# (1)
FROM python:3.9 as requirements-stage
# (2)
WORKDIR /tmp
# (3)
RUN pip install poetry
# (4)
COPY ./pyproject.toml ./poetry.lock* /tmp/
# (5)
RUN poetry export -f requirements.txt --output requirements.txt --without-hashes
# (6)
FROM python:3.9
# (7)
WORKDIR /code
# (8)
COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt
# (9)
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
# (10)
COPY ./app /code/app
# (11)
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
```
1. Dies ist die erste Phase, genannt `requirements-stage` „Anforderungsphase“.
2. Setze `/tmp` als aktuelles Arbeitsverzeichnis.
Hier werden wir die Datei `requirements.txt` generieren.
3. Installiere Poetry in dieser Docker-Phase.
4. Kopiere die Dateien `pyproject.toml` und `poetry.lock` in das Verzeichnis `/tmp`.
Da es `./poetry.lock*` verwendet (endet mit einem `*`), stürzt es nicht ab, wenn diese Datei noch nicht verfügbar ist.
5. Generiere die Datei `requirements.txt`.
6. Dies ist die letzte Phase. Alles hier bleibt im endgültigen Containerimage erhalten.
7. Setze das aktuelle Arbeitsverzeichnis auf `/code`.
8. Kopiere die Datei `requirements.txt` in das Verzeichnis `/code`.
Diese Datei existiert nur in der vorherigen Docker-Phase, deshalb verwenden wir `--from-requirements-stage`, um sie zu kopieren.
9. Installiere die Paketabhängigkeiten von der generierten Datei `requirements.txt`.
10. Kopiere das Verzeichnis `app` in das Verzeichnis `/code`.
11. Führe den Befehl `uvicorn` aus und weise ihn an, das aus `app.main` importierte `app`-Objekt zu verwenden.
!!! tip "Tipp"
Klicken Sie auf die Zahlenblasen, um zu sehen, was jede Zeile bewirkt.
Eine **Docker-Phase** ist ein Teil eines `Dockerfile`s, welcher als **temporäres Containerimage** fungiert und nur zum Generieren einiger Dateien für die spätere Verwendung verwendet wird.
Die erste Phase wird nur zur **Installation von Poetry** und zur **Generierung der `requirements.txt`** mit deren Projektabhängigkeiten aus der Datei `pyproject.toml` von Poetry verwendet.
Diese `requirements.txt`-Datei wird später in der **nächsten Phase** mit `pip` verwendet.
Im endgültigen Containerimage bleibt **nur die letzte Stufe** erhalten. Die vorherigen Stufen werden verworfen.
Bei der Verwendung von Poetry wäre es sinnvoll, **mehrstufige Docker-Builds** zu verwenden, da Poetry und seine Abhängigkeiten nicht wirklich im endgültigen Containerimage installiert sein müssen, sondern Sie brauchen **nur** die Datei `requirements.txt`, um Ihre Projektabhängigkeiten zu installieren.
Dann würden Sie im nächsten (und letzten) Schritt das Image mehr oder weniger auf die gleiche Weise wie zuvor beschrieben erstellen.
### Hinter einem TLS-Terminierungsproxy Poetry
Auch hier gilt: Wenn Sie Ihren Container hinter einem TLS-Terminierungsproxy (Load Balancer) wie Nginx oder Traefik ausführen, fügen Sie dem Befehl die Option `--proxy-headers` hinzu:
```Dockerfile
CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
```
## Zusammenfassung
## Zusammenfassung { #recap }
Mithilfe von Containersystemen (z. B. mit **Docker** und **Kubernetes**) ist es ziemlich einfach, alle **Deployment-Konzepte** zu handhaben:
@@ -694,5 +618,3 @@ Mithilfe von Containersystemen (z. B. mit **Docker** und **Kubernetes**) ist es
In den meisten Fällen möchten Sie wahrscheinlich kein Basisimage verwenden und stattdessen **ein Containerimage von Grund auf erstellen**, eines basierend auf dem offiziellen Python-Docker-Image.
Indem Sie auf die **Reihenfolge** der Anweisungen im `Dockerfile` und den **Docker-Cache** achten, können Sie **die Build-Zeiten minimieren**, um Ihre Produktivität zu erhöhen (und Langeweile zu vermeiden). 😎
In bestimmten Sonderfällen möchten Sie möglicherweise das offizielle Docker-Image für FastAPI verwenden. 🤓

View File

@@ -0,0 +1,65 @@
# FastAPI Cloud { #fastapi-cloud }
Sie können Ihre FastAPI-App in der <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a> mit **einem einzigen Befehl** deployen tragen Sie sich in die Warteliste ein, falls noch nicht geschehen. 🚀
## Anmelden { #login }
Stellen Sie sicher, dass Sie bereits ein **FastAPI-Cloud-Konto** haben (wir haben Sie von der Warteliste eingeladen 😉).
Melden Sie sich dann an:
<div class="termy">
```console
$ fastapi login
You are logged in to FastAPI Cloud 🚀
```
</div>
## Deployen { #deploy }
Stellen Sie Ihre App jetzt mit **einem einzigen Befehl** bereit:
<div class="termy">
```console
$ fastapi deploy
Deploying to FastAPI Cloud...
✅ Deployment successful!
🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev
```
</div>
Das wars! Jetzt können Sie Ihre App unter dieser URL aufrufen. ✨
## Über FastAPI Cloud { #about-fastapi-cloud }
**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** wird vom gleichen Autor und Team hinter **FastAPI** entwickelt.
Es vereinfacht den Prozess des **Erstellens**, **Deployens** und **Nutzens** einer API mit minimalem Aufwand.
Es bringt die gleiche **Developer-Experience** beim Erstellen von Apps mit FastAPI auch zum **Deployment** in der Cloud. 🎉
Es kümmert sich außerdem um das meiste, was beim Deployen einer App nötig ist, zum Beispiel:
* HTTPS
* Replikation, mit Autoscaling basierend auf Requests
* usw.
FastAPI Cloud ist Hauptsponsor und Finanzierer der Open-Source-Projekte *FastAPI and friends*. ✨
## Bei anderen Cloudanbietern deployen { #deploy-to-other-cloud-providers }
FastAPI ist Open Source und basiert auf Standards. Sie können FastAPI-Apps bei jedem Cloudanbieter Ihrer Wahl deployen.
Folgen Sie den Anleitungen Ihres Cloudanbieters, um dort FastAPI-Apps zu deployen. 🤓
## Auf den eigenen Server deployen { #deploy-your-own-server }
Ich werde Ihnen später in diesem **Deployment-Leitfaden** auch alle Details zeigen, sodass Sie verstehen, was passiert, was geschehen muss und wie Sie FastAPI-Apps selbst deployen können, auch auf Ihre eigenen Server. 🤓

View File

@@ -1,11 +1,14 @@
# Über HTTPS
# Über HTTPS { #about-https }
Es ist leicht anzunehmen, dass HTTPS etwas ist, was einfach nur „aktiviert“ wird oder nicht.
Aber es ist viel komplexer als das.
!!! 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.
/// 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.
///
Um **die Grundlagen von HTTPS** aus Sicht des Benutzers zu erlernen, schauen Sie sich <a href="https://howhttps.works/" class="external-link" target="_blank">https://howhttps.works/</a> an.
@@ -19,19 +22,19 @@ Aus **Sicht des Entwicklers** sollten Sie beim Nachdenken über HTTPS Folgendes
* Die Verschlüsselung der Verbindung erfolgt auf **TCP-Ebene**.
* Das ist eine Schicht **unter HTTP**.
* Die Handhabung von **Zertifikaten und Verschlüsselung** erfolgt also **vor HTTP**.
* **TCP weiß nichts über „<abbr title="Domäne, Bereich, Wirkungsraum">Domains</abbr>“**. Nur über IP-Adressen.
* **TCP weiß nichts über „Domains“**. Nur über IP-Adressen.
* Die Informationen über die angeforderte **spezifische Domain** befinden sich in den **HTTP-Daten**.
* Die **HTTPS-Zertifikate** „zertifizieren“ eine **bestimmte Domain**, aber das Protokoll und die Verschlüsselung erfolgen auf TCP-Ebene, **ohne zu wissen**, um welche Domain es sich handelt.
* **Standardmäßig** bedeutet das, dass Sie nur **ein HTTPS-Zertifikat pro IP-Adresse** haben können.
* Ganz gleich, wie groß Ihr Server ist oder wie klein die einzelnen Anwendungen darauf sind.
* Hierfür gibt es jedoch eine **Lösung**.
* Es gibt eine **Erweiterung** zum **TLS**-Protokoll (dasjenige, das die Verschlüsselung auf TCP-Ebene, vor HTTP, verwaltet) namens **<a href="https://en.wikipedia.org/wiki/Server_Name_Indication" class="external-link" target="_blank"><abbr title="Server Name Indication Angabe des Servernamens">SNI</abbr></a>**.
* Mit dieser SNI-Erweiterung kann ein einzelner Server (mit einer **einzelnen IP-Adresse**) über **mehrere HTTPS-Zertifikate** verfügen und **mehrere HTTPS-Domains/Anwendungen** bedienen.
* Es gibt eine **Erweiterung** zum **TLS**-Protokoll (dasjenige, das die Verschlüsselung auf TCP-Ebene, vor HTTP, verwaltet) namens **<a href="https://en.wikipedia.org/wiki/Server_Name_Indication" class="external-link" target="_blank"><abbr title="Server Name Indication Servernamensanzeige">SNI</abbr></a>**.
* Mit dieser SNI-Erweiterung kann ein einzelner Server (mit einer **einzelnen IP-Adresse**) über **mehrere HTTPS-Zertifikate** verfügen und **mehrere HTTPS-Domains/Anwendungen bereitstellen**.
* Damit das funktioniert, muss eine **einzelne** Komponente (Programm), die auf dem Server ausgeführt wird und welche die **öffentliche IP-Adresse** überwacht, **alle HTTPS-Zertifikate** des Servers haben.
* **Nachdem** eine sichere Verbindung hergestellt wurde, ist das Kommunikationsprotokoll **immer noch HTTP**.
* Die Inhalte sind **verschlüsselt**, auch wenn sie mit dem **HTTP-Protokoll** gesendet werden.
Es ist eine gängige Praxis, **ein Programm/HTTP-Server** auf dem Server (der Maschine, dem Host usw.) laufen zu lassen, welches **alle HTTPS-Aspekte verwaltet**: Empfangen der **verschlüsselten HTTPS-Requests**, Senden der **entschlüsselten HTTP-Requests** an die eigentliche HTTP-Anwendung die auf demselben Server läuft (in diesem Fall die **FastAPI**-Anwendung), entgegennehmen der **HTTP-Response** von der Anwendung, **verschlüsseln derselben** mithilfe des entsprechenden **HTTPS-Zertifikats** und Zurücksenden zum Client über **HTTPS**. Dieser Server wird oft als **<a href="https://en.wikipedia.org/wiki/TLS_termination_proxy" class="external-link" target="_blank">TLS-Terminierungsproxy</a>** bezeichnet.
Es ist eine gängige Praxis, **ein Programm/HTTP-Server** auf dem Server (der Maschine, dem Host usw.) laufen zu lassen, welches **alle HTTPS-Aspekte verwaltet**: Empfangen der **verschlüsselten HTTPS-<abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Requests</abbr>**, Senden der **entschlüsselten HTTP-Requests** an die eigentliche HTTP-Anwendung die auf demselben Server läuft (in diesem Fall die **FastAPI**-Anwendung), entgegennehmen der **HTTP-Response** von der Anwendung, **verschlüsseln derselben** mithilfe des entsprechenden **HTTPS-Zertifikats** und Zurücksenden zum Client über **HTTPS**. Dieser Server wird oft als **<a href="https://en.wikipedia.org/wiki/TLS_termination_proxy" class="external-link" target="_blank">TLS-Terminierungsproxy</a>** bezeichnet.
Einige der Optionen, die Sie als TLS-Terminierungsproxy verwenden können, sind:
@@ -40,7 +43,7 @@ Einige der Optionen, die Sie als TLS-Terminierungsproxy verwenden können, sind:
* Nginx
* HAProxy
## Let's Encrypt
## Let's Encrypt { #lets-encrypt }
Vor Let's Encrypt wurden diese **HTTPS-Zertifikate** von vertrauenswürdigen Dritten verkauft.
@@ -54,13 +57,13 @@ Die Domains werden sicher verifiziert und die Zertifikate werden automatisch gen
Die Idee besteht darin, den Erwerb und die Erneuerung der Zertifikate zu automatisieren, sodass Sie **sicheres HTTPS, kostenlos und für immer** haben können.
## HTTPS für Entwickler
## HTTPS für Entwickler { #https-for-developers }
Hier ist ein Beispiel, wie eine HTTPS-API aussehen könnte, Schritt für Schritt, wobei vor allem die für Entwickler wichtigen Ideen berücksichtigt werden.
### Domainname
### Domainname { #domain-name }
Alles beginnt wahrscheinlich damit, dass Sie einen **Domainnamen erwerben**. Anschließend konfigurieren Sie ihn in einem DNS-Server (wahrscheinlich beim selben Cloud-Anbieter).
Alles beginnt wahrscheinlich damit, dass Sie einen **Domainnamen erwerben**. Anschließend konfigurieren Sie ihn in einem DNS-Server (wahrscheinlich beim selben Cloudanbieter).
Sie würden wahrscheinlich einen Cloud-Server (eine virtuelle Maschine) oder etwas Ähnliches bekommen, und dieser hätte eine <abbr title="Sie ändert sich nicht">feste</abbr> **öffentliche IP-Adresse**.
@@ -68,30 +71,33 @@ 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"
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.
/// tip | Tipp
### DNS
Dieser Domainnamen-Aspekt liegt weit vor HTTPS, aber da alles von der Domain und der IP-Adresse abhängt, lohnt es sich, das hier zu erwähnen.
///
### DNS { #dns }
Konzentrieren wir uns nun auf alle tatsächlichen HTTPS-Aspekte.
Zuerst würde der Browser mithilfe der **DNS-Server** herausfinden, welches die **IP für die Domain** ist, in diesem Fall für `someapp.example.com`.
Zuerst würde der Browser mithilfe der **DNS-Server** herausfinden, welches die **IP für die Domain** ist, in diesem Fall `someapp.example.com`.
Die DNS-Server geben dem Browser eine bestimmte **IP-Adresse** zurück. Das wäre die von Ihrem Server verwendete öffentliche IP-Adresse, die Sie in den DNS-Servern konfiguriert haben.
<img src="/img/deployment/https/https01.svg">
<img src="/img/deployment/https/https01.drawio.svg">
### TLS-Handshake-Start
### TLS-Handshake-Start { #tls-handshake-start }
Der Browser kommuniziert dann mit dieser IP-Adresse über **Port 443** (den HTTPS-Port).
Der erste Teil der Kommunikation besteht lediglich darin, die Verbindung zwischen dem Client und dem Server herzustellen und die zu verwendenden kryptografischen Schlüssel usw. zu vereinbaren.
<img src="/img/deployment/https/https02.svg">
<img src="/img/deployment/https/https02.drawio.svg">
Diese Interaktion zwischen dem Client und dem Server zum Aufbau der TLS-Verbindung wird als **<abbr title="TLS-Handschlag">TLS-Handshake</abbr>** bezeichnet.
### TLS mit SNI-Erweiterung
### TLS mit SNI-Erweiterung { #tls-with-sni-extension }
**Nur ein Prozess** im Server kann an einem bestimmten **Port** einer bestimmten **IP-Adresse** lauschen. Möglicherweise gibt es andere Prozesse, die an anderen Ports dieselbe IP-Adresse abhören, jedoch nur einen für jede Kombination aus IP-Adresse und Port.
@@ -105,7 +111,7 @@ Mithilfe der oben beschriebenen **SNI-Erweiterung** würde der TLS-Terminierungs
In diesem Fall würde er das Zertifikat für `someapp.example.com` verwenden.
<img src="/img/deployment/https/https03.svg">
<img src="/img/deployment/https/https03.drawio.svg">
Der Client **vertraut** bereits der Entität, die das TLS-Zertifikat generiert hat (in diesem Fall Let's Encrypt, aber wir werden später mehr darüber erfahren), sodass er **verifizieren** kann, dass das Zertifikat gültig ist.
@@ -115,56 +121,59 @@ 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"
Beachten Sie, dass die Verschlüsselung der Kommunikation auf der **TCP-Ebene** und nicht auf der HTTP-Ebene erfolgt.
/// tip | Tipp
### HTTPS-Request
Beachten Sie, dass die Verschlüsselung der Kommunikation auf der **TCP-Ebene** und nicht auf der HTTP-Ebene erfolgt.
///
### HTTPS-Request { #https-request }
Da Client und Server (sprich, der Browser und der TLS-Terminierungsproxy) nun über eine **verschlüsselte TCP-Verbindung** verfügen, können sie die **HTTP-Kommunikation** starten.
Der Client sendet also einen **HTTPS-Request**. Das ist einfach ein HTTP-Request über eine verschlüsselte TLS-Verbindung.
<img src="/img/deployment/https/https04.svg">
<img src="/img/deployment/https/https04.drawio.svg">
### Den Request entschlüsseln
### Den Request entschlüsseln { #decrypt-the-request }
Der TLS-Terminierungsproxy würde die vereinbarte Verschlüsselung zum **Entschlüsseln des Requests** verwenden und den **einfachen (entschlüsselten) HTTP-Request** an den Prozess weiterleiten, der die Anwendung ausführt (z. B. einen Prozess, bei dem Uvicorn die FastAPI-Anwendung ausführt).
<img src="/img/deployment/https/https05.svg">
<img src="/img/deployment/https/https05.drawio.svg">
### HTTP-Response
### HTTP-Response { #http-response }
Die Anwendung würde den Request verarbeiten und eine **einfache (unverschlüsselte) HTTP-Response** an den TLS-Terminierungsproxy senden.
<img src="/img/deployment/https/https06.svg">
<img src="/img/deployment/https/https06.drawio.svg">
### HTTPS-Response
### HTTPS-Response { #https-response }
Der TLS-Terminierungsproxy würde dann die Response mithilfe der zuvor vereinbarten Kryptografie (als das Zertifikat für `someapp.example.com` verhandelt wurde) **verschlüsseln** und sie an den Browser zurücksenden.
Als Nächstes überprüft der Browser, ob die Response gültig und mit dem richtigen kryptografischen Schlüssel usw. verschlüsselt ist. Anschließend **entschlüsselt er die Response** und verarbeitet sie.
<img src="/img/deployment/https/https07.svg">
<img src="/img/deployment/https/https07.drawio.svg">
Der Client (Browser) weiß, dass die Response vom richtigen Server kommt, da dieser die Kryptografie verwendet, die zuvor mit dem **HTTPS-Zertifikat** vereinbart wurde.
### Mehrere Anwendungen
### Mehrere Anwendungen { #multiple-applications }
Auf demselben Server (oder denselben Servern) könnten sich **mehrere Anwendungen** befinden, beispielsweise andere API-Programme oder eine Datenbank.
Nur ein Prozess kann diese spezifische IP und den Port verarbeiten (in unserem Beispiel der TLS-Terminierungsproxy), aber die anderen Anwendungen/Prozesse können auch auf dem/den Server(n) ausgeführt werden, solange sie nicht versuchen, dieselbe **Kombination aus öffentlicher IP und Port** zu verwenden.
<img src="/img/deployment/https/https08.svg">
<img src="/img/deployment/https/https08.drawio.svg">
Auf diese Weise könnte der TLS-Terminierungsproxy HTTPS und Zertifikate für **mehrere Domains**, für mehrere Anwendungen, verarbeiten und die Requests dann jeweils an die richtige Anwendung weiterleiten.
### Verlängerung des Zertifikats
### Verlängerung des Zertifikats { #certificate-renewal }
Irgendwann in der Zukunft würde jedes Zertifikat **ablaufen** (etwa 3 Monate nach dem Erwerb).
Und dann gäbe es ein anderes Programm (in manchen Fällen ist es ein anderes Programm, in manchen Fällen ist es derselbe TLS-Terminierungsproxy), das mit Let's Encrypt kommuniziert und das/die Zertifikat(e) erneuert.
<img src="/img/deployment/https/https.svg">
<img src="/img/deployment/https/https.drawio.svg">
Die **TLS-Zertifikate** sind **einem Domainnamen zugeordnet**, nicht einer IP-Adresse.
@@ -181,7 +190,39 @@ Um dies zu erreichen und den unterschiedlichen Anwendungsanforderungen gerecht z
Dieser ganze Erneuerungsprozess, während die Anwendung weiterhin bereitgestellt wird, ist einer der Hauptgründe, warum Sie ein **separates System zur Verarbeitung von HTTPS** mit einem TLS-Terminierungsproxy haben möchten, anstatt einfach die TLS-Zertifikate direkt mit dem Anwendungsserver zu verwenden (z. B. Uvicorn).
## Zusammenfassung
## Proxy-<abbr title="weitergeleitete Header">Forwarded-Header</abbr> { #proxy-forwarded-headers }
Wenn Sie einen Proxy zur Verarbeitung von HTTPS verwenden, weiß Ihr **Anwendungsserver** (z. B. Uvicorn über das FastAPI CLI) nichts über den HTTPS-Prozess, er kommuniziert per einfachem HTTP mit dem **TLS-Terminierungsproxy**.
Dieser **Proxy** würde normalerweise unmittelbar vor dem Übermitteln der Anfrage an den **Anwendungsserver** einige HTTP-Header dynamisch setzen, um dem Anwendungsserver mitzuteilen, dass der Request vom Proxy **weitergeleitet** wird.
/// note | Technische Details
Die Proxy-Header sind:
* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For" class="external-link" target="_blank">X-Forwarded-For</a>
* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto" class="external-link" target="_blank">X-Forwarded-Proto</a>
* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host" class="external-link" target="_blank">X-Forwarded-Host</a>
///
Trotzdem, da der **Anwendungsserver** nicht weiß, dass er sich hinter einem vertrauenswürdigen **Proxy** befindet, würde er diesen Headern standardmäßig nicht vertrauen.
Sie können den **Anwendungsserver** jedoch so konfigurieren, dass er den vom **Proxy** gesendeten *Forwarded*-Headern vertraut. Wenn Sie das FastAPI CLI verwenden, können Sie die *CLI-Option* `--forwarded-allow-ips` nutzen, um anzugeben, von welchen IPs er diesen *Forwarded*-Headern vertrauen soll.
Wenn der **Anwendungsserver** beispielsweise nur Kommunikation vom vertrauenswürdigen **Proxy** empfängt, können Sie `--forwarded-allow-ips="*"` setzen, um allen eingehenden IPs zu vertrauen, da er nur Requests von der vom **Proxy** verwendeten IP erhalten wird.
Auf diese Weise kann die Anwendung ihre eigene öffentliche URL, ob sie HTTPS verwendet, die Domain, usw. erkennen.
Das ist z. B. nützlich, um <abbr title="Redirect Umleitung">Redirects</abbr> korrekt zu handhaben.
/// tip | Tipp
Mehr dazu finden Sie in der Dokumentation zu [Hinter einem Proxy Proxy-Forwarded-Header aktivieren](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers){.internal-link target=_blank}
///
## Zusammenfassung { #recap }
**HTTPS** zu haben ist sehr wichtig und in den meisten Fällen eine **kritische Anforderung**. Die meiste Arbeit, die Sie als Entwickler in Bezug auf HTTPS aufwenden müssen, besteht lediglich darin, **diese Konzepte zu verstehen** und wie sie funktionieren.

View File

@@ -1,20 +1,22 @@
# Deployment
# Deployment { #deployment }
Das Deployment einer **FastAPI**-Anwendung ist relativ einfach.
## Was bedeutet Deployment?
## Was bedeutet Deployment { #what-does-deployment-mean }
**Deployment** (Deutsch etwa: **Bereitstellen der Anwendung**) bedeutet, die notwendigen Schritte durchzuführen, um die Anwendung **für die Endbenutzer verfügbar** zu machen.
<abbr title="Bereitstellen der Anwendung">**Deployment**</abbr> bedeutet, die notwendigen Schritte durchzuführen, um die Anwendung **für die Endbenutzer verfügbar** zu machen.
Bei einer **Web-API** bedeutet das normalerweise, diese auf einem **entfernten Rechner** zu platzieren, mit einem **Serverprogramm**, welches gute Leistung, Stabilität, usw. bietet, damit Ihre **Benutzer** auf die Anwendung effizient und ohne Unterbrechungen oder Probleme **zugreifen** können.
Das steht im Gegensatz zu den **Entwicklungsphasen**, in denen Sie ständig den Code ändern, kaputt machen, reparieren, den Entwicklungsserver stoppen und neu starten, usw.
## Deployment-Strategien
## Deployment-Strategien { #deployment-strategies }
Abhängig von Ihrem spezifischen Anwendungsfall und den von Ihnen verwendeten Tools gibt es mehrere Möglichkeiten, das zu tun.
Es gibt mehrere Möglichkeiten, dies zu tun, abhängig von Ihrem spezifischen Anwendungsfall und den von Ihnen verwendeten Tools.
Sie könnten mithilfe einer Kombination von Tools selbst **einen Server bereitstellen**, Sie könnten einen **Cloud-Dienst** nutzen, der einen Teil der Arbeit für Sie erledigt, oder andere mögliche Optionen.
Sie könnten mithilfe einer Kombination von Tools selbst **einen Server deployen**, Sie könnten einen **Cloud-Dienst** nutzen, der einen Teil der Arbeit für Sie erledigt, oder andere mögliche Optionen.
Zum Beispiel haben wir, das Team hinter FastAPI, <a href="https://fastapicloud.com" class="external-link" target="_blank">**FastAPI Cloud**</a> entwickelt, um das Deployment von FastAPI-Apps in der Cloud so reibungslos wie möglich zu gestalten, mit derselben Developer-Experience wie beim Arbeiten mit FastAPI.
Ich zeige Ihnen einige der wichtigsten Konzepte, die Sie beim Deployment einer **FastAPI**-Anwendung wahrscheinlich berücksichtigen sollten (obwohl das meiste davon auch für jede andere Art von Webanwendung gilt).

View File

@@ -1,137 +1,149 @@
# Einen Server manuell ausführen Uvicorn
# Einen Server manuell ausführen { #run-a-server-manually }
Das Wichtigste, was Sie zum Ausführen einer **FastAPI**-Anwendung auf einer entfernten Servermaschine benötigen, ist ein ASGI-Serverprogramm, wie **Uvicorn**.
## Den `fastapi run` Befehl verwenden { #use-the-fastapi-run-command }
Es gibt 3 Hauptalternativen:
* <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>: ein hochperformanter ASGI-Server.
* <a href="https://pgjones.gitlab.io/hypercorn/" class="external-link" target="_blank">Hypercorn</a>: ein ASGI-Server, der unter anderem mit HTTP/2 und Trio kompatibel ist.
* <a href="https://github.com/django/daphne" class="external-link" target="_blank">Daphne</a>: Der für Django Channels entwickelte ASGI-Server.
## Servermaschine und Serverprogramm
Bei den Benennungen gibt es ein kleines Detail, das Sie beachten sollten. 💡
Das Wort „**Server**“ bezieht sich häufig sowohl auf den entfernten-/Cloud-Computer (die physische oder virtuelle Maschine) als auch auf das Programm, das auf dieser Maschine ausgeführt wird (z. B. Uvicorn).
Denken Sie einfach daran, wenn Sie „Server“ im Allgemeinen lesen, dass es sich auf eines dieser beiden Dinge beziehen kann.
Wenn man sich auf die entfernte Maschine bezieht, wird sie üblicherweise als **Server**, aber auch als **Maschine**, **VM** (virtuelle Maschine) oder **Knoten** bezeichnet. Diese Begriffe beziehen sich auf irgendeine Art von entfernten Rechner, normalerweise unter Linux, auf dem Sie Programme ausführen.
## Das Serverprogramm installieren
Sie können einen ASGI-kompatiblen Server installieren mit:
=== "Uvicorn"
* <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>, ein blitzschneller ASGI-Server, basierend auf uvloop und httptools.
<div class="termy">
```console
$ pip install "uvicorn[standard]"
---> 100%
```
</div>
!!! tip "Tipp"
Durch das Hinzufügen von `standard` installiert und verwendet Uvicorn einige empfohlene zusätzliche Abhängigkeiten.
Inklusive `uvloop`, einen hochperformanten Drop-in-Ersatz für `asyncio`, welcher für einen großen Leistungsschub bei der Nebenläufigkeit sorgt.
=== "Hypercorn"
* <a href="https://gitlab.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>, ein ASGI-Server, der auch mit HTTP/2 kompatibel ist.
<div class="termy">
```console
$ pip install hypercorn
---> 100%
```
</div>
... oder jeden anderen ASGI-Server.
## Das Serverprogramm ausführen
Anschließend können Sie Ihre Anwendung auf die gleiche Weise ausführen, wie Sie es in den Tutorials getan haben, jedoch ohne die Option `--reload`, z. B.:
=== "Uvicorn"
<div class="termy">
```console
$ uvicorn main:app --host 0.0.0.0 --port 80
<span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
```
</div>
=== "Hypercorn"
<div class="termy">
```console
$ hypercorn main:app --bind 0.0.0.0:80
Running on 0.0.0.0:8080 over http (CTRL + C to quit)
```
</div>
!!! warning "Achtung"
Denken Sie daran, die Option `--reload` zu entfernen, wenn Sie diese verwendet haben.
Die Option `--reload` verbraucht viel mehr Ressourcen, ist instabiler, usw.
Sie hilft sehr während der **Entwicklung**, aber Sie sollten sie **nicht** in der **Produktion** verwenden.
## Hypercorn mit Trio
Starlette und **FastAPI** basieren auf <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>, welches diese sowohl mit der Python-Standardbibliothek <a href="https://docs.python.org/3/library/asyncio-task.html" class="external-link" target="_blank">asyncio</a>, als auch mit <a href="https://trio.readthedocs.io/en/stable/" class="external-link" target="_blank">Trio</a> kompatibel macht.
Dennoch ist Uvicorn derzeit nur mit asyncio kompatibel und verwendet normalerweise <a href="https://github.com/MagicStack/uvloop" class="external-link" target="_blank">`uvloop`</a>, den leistungsstarken Drop-in-Ersatz für `asyncio`.
Wenn Sie jedoch **Trio** direkt verwenden möchten, können Sie **Hypercorn** verwenden, da dieses es unterstützt. ✨
### Hypercorn mit Trio installieren
Zuerst müssen Sie Hypercorn mit Trio-Unterstützung installieren:
Kurz gesagt, nutzen Sie `fastapi run`, um Ihre FastAPI-Anwendung bereitzustellen:
<div class="termy">
```console
$ pip install "hypercorn[trio]"
$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid">main.py</u>
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting production server 🚀
Searching for package file structure from directories
with <font color="#3465A4">__init__.py</font> files
Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
<span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> 🐍 main.py
<span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with
the following code:
<u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
<span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000/docs</u></font>
Logs:
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>2306215</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font> <b>(</b>Press CTRL+C
to quit<b>)</b>
```
</div>
Das würde in den meisten Fällen funktionieren. 😎
Sie könnten diesen Befehl beispielsweise verwenden, um Ihre **FastAPI**-App in einem Container, auf einem Server usw. zu starten.
## ASGI-Server { #asgi-servers }
Lassen Sie uns ein wenig tiefer in die Details eintauchen.
FastAPI verwendet einen Standard zum Erstellen von Python-Webframeworks und -Servern, der als <abbr title="Asynchrones Server-Gateway-Interface">ASGI</abbr> bekannt ist. FastAPI ist ein ASGI-Webframework.
Das Wichtigste, was Sie benötigen, um eine **FastAPI**-Anwendung (oder eine andere ASGI-Anwendung) auf einer entfernten Servermaschine auszuführen, ist ein ASGI-Serverprogramm wie **Uvicorn**, der standardmäßig im `fastapi`-Kommando enthalten ist.
Es gibt mehrere Alternativen, einschließlich:
* <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a>: ein hochperformanter ASGI-Server.
* <a href="https://hypercorn.readthedocs.io/" class="external-link" target="_blank">Hypercorn</a>: ein ASGI-Server, der unter anderem kompatibel mit HTTP/2 und Trio ist.
* <a href="https://github.com/django/daphne" class="external-link" target="_blank">Daphne</a>: der für Django Channels entwickelte ASGI-Server.
* <a href="https://github.com/emmett-framework/granian" class="external-link" target="_blank">Granian</a>: Ein Rust HTTP-Server für Python-Anwendungen.
* <a href="https://unit.nginx.org/howto/fastapi/" class="external-link" target="_blank">NGINX Unit</a>: NGINX Unit ist eine leichte und vielseitige Laufzeitumgebung für Webanwendungen.
## Servermaschine und Serverprogramm { #server-machine-and-server-program }
Es gibt ein kleines Detail bei den Namen, das Sie beachten sollten. 💡
Das Wort „**Server**“ wird häufig verwendet, um sowohl den entfernten/Cloud-Computer (die physische oder virtuelle Maschine) als auch das Programm zu bezeichnen, das auf dieser Maschine läuft (z. B. Uvicorn).
Denken Sie einfach daran, dass sich „Server“ im Allgemeinen auf eines dieser beiden Dinge beziehen kann.
Wenn man sich auf die entfernte Maschine bezieht, wird sie üblicherweise als **Server**, aber auch als **Maschine**, **VM** (virtuelle Maschine) oder **Knoten** bezeichnet. Diese Begriffe beziehen sich auf irgendeine Art von entfernten Rechner, normalerweise unter Linux, auf dem Sie Programme ausführen.
## Das Serverprogramm installieren { #install-the-server-program }
Wenn Sie FastAPI installieren, wird es mit einem Produktionsserver, Uvicorn, geliefert, und Sie können ihn mit dem `fastapi run` Befehl starten.
Aber Sie können auch ein ASGI-Serverprogramm manuell installieren.
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und dann die Serveranwendung installieren.
Zum Beispiel, um Uvicorn zu installieren:
<div class="termy">
```console
$ pip install "uvicorn[standard]"
---> 100%
```
</div>
### Mit Trio ausführen
Ein ähnlicher Prozess würde für jedes andere ASGI-Serverprogramm gelten.
Dann können Sie die Befehlszeilenoption `--worker-class` mit dem Wert `trio` übergeben:
/// tip | Tipp
Durch das Hinzufügen von `standard` installiert und verwendet Uvicorn einige empfohlene zusätzliche Abhängigkeiten.
Dazu gehört `uvloop`, der hochperformante Drop-in-Ersatz für `asyncio`, der den großen Nebenläufigkeits-Performanz-Schub bietet.
Wenn Sie FastAPI mit etwas wie `pip install "fastapi[standard]"` installieren, erhalten Sie auch `uvicorn[standard]`.
///
## Das Serverprogramm ausführen { #run-the-server-program }
Wenn Sie einen ASGI-Server manuell installiert haben, müssen Sie normalerweise einen Importstring in einem speziellen Format übergeben, damit er Ihre FastAPI-Anwendung importiert:
<div class="termy">
```console
$ hypercorn main:app --worker-class trio
$ uvicorn main:app --host 0.0.0.0 --port 80
<span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
```
</div>
Und das startet Hypercorn mit Ihrer Anwendung und verwendet Trio als Backend.
/// note | Hinweis
Jetzt können Sie Trio intern in Ihrer Anwendung verwenden. Oder noch besser: Sie können AnyIO verwenden, sodass Ihr Code sowohl mit Trio als auch asyncio kompatibel ist. 🎉
Der Befehl `uvicorn main:app` bezieht sich auf:
## Konzepte des Deployments
* `main`: die Datei `main.py` (das Python-„Modul“).
* `app`: das Objekt, das innerhalb von `main.py` mit der Zeile `app = FastAPI()` erstellt wurde.
Obige Beispiele führen das Serverprogramm (z. B. Uvicorn) aus, starten **einen einzelnen Prozess** und überwachen alle IPs (`0.0.0.0`) an einem vordefinierten Port (z. B. `80`).
Es ist äquivalent zu:
```Python
from main import app
```
///
Jedes alternative ASGI-Serverprogramm hätte einen ähnlichen Befehl, Sie können in deren jeweiligen Dokumentationen mehr lesen.
/// warning | Achtung
Uvicorn und andere Server unterstützen eine `--reload`-Option, die während der Entwicklung nützlich ist.
Die `--reload`-Option verbraucht viel mehr Ressourcen, ist instabiler, usw.
Sie hilft während der **Entwicklung**, Sie sollten sie jedoch **nicht** in der **Produktion** verwenden.
///
## Deployment-Konzepte { #deployment-concepts }
Diese Beispiele führen das Serverprogramm (z. B. Uvicorn) aus, starten **einen einzelnen Prozess** und überwachen alle IPs (`0.0.0.0`) an einem vordefinierten Port (z. B. `80`).
Das ist die Grundidee. Aber Sie möchten sich wahrscheinlich um einige zusätzliche Dinge kümmern, wie zum Beispiel:
@@ -139,7 +151,7 @@ Das ist die Grundidee. Aber Sie möchten sich wahrscheinlich um einige zusätzli
* Beim Hochfahren ausführen
* Neustarts
* Replikation (die Anzahl der laufenden Prozesse)
* Arbeitsspeicher
* Speicher
* Schritte vor dem Start
In den nächsten Kapiteln erzähle ich Ihnen mehr über jedes dieser Konzepte, wie Sie über diese nachdenken, und gebe Ihnen einige konkrete Beispiele mit Strategien für den Umgang damit. 🚀

View File

@@ -1,4 +1,4 @@
# Serverworker Gunicorn mit Uvicorn
# Serverworker Uvicorn mit Workern { #server-workers-uvicorn-with-workers }
Schauen wir uns die Deployment-Konzepte von früher noch einmal an:
@@ -9,120 +9,79 @@ Schauen wir uns die Deployment-Konzepte von früher noch einmal an:
* Arbeitsspeicher
* Schritte vor dem Start
Bis zu diesem Punkt, in allen Tutorials in der Dokumentation, haben Sie wahrscheinlich ein **Serverprogramm** wie Uvicorn ausgeführt, in einem **einzelnen Prozess**.
Bis zu diesem Punkt, in allen Tutorials in der Dokumentation, haben Sie wahrscheinlich ein **Serverprogramm** ausgeführt, zum Beispiel mit dem `fastapi`-Befehl, der Uvicorn startet, und einen **einzelnen Prozess** ausführt.
Wenn Sie Anwendungen bereitstellen, möchten Sie wahrscheinlich eine gewisse **Replikation von Prozessen**, um **mehrere CPU-Kerne** zu nutzen und mehr Requests bearbeiten zu können.
Wenn Sie Anwendungen deployen, möchten Sie wahrscheinlich eine gewisse **Replikation von Prozessen**, um **mehrere Kerne** zu nutzen und mehr <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Requests</abbr> bearbeiten zu können.
Wie Sie im vorherigen Kapitel über [Deployment-Konzepte](concepts.md){.internal-link target=_blank} gesehen haben, gibt es mehrere Strategien, die Sie anwenden können.
Hier zeige ich Ihnen, wie Sie <a href="https://gunicorn.org/" class="external-link" target="_blank">**Gunicorn**</a> mit **Uvicorn Workerprozessen** verwenden.
Hier zeige ich Ihnen, wie Sie **Uvicorn** mit **Workerprozessen** verwenden, indem Sie den `fastapi`-Befehl oder den `uvicorn`-Befehl direkt verwenden.
!!! info
Wenn Sie Container verwenden, beispielsweise mit Docker oder Kubernetes, erzähle ich Ihnen mehr darüber im nächsten Kapitel: [FastAPI in Containern Docker](docker.md){.internal-link target=_blank}.
/// info | Info
Insbesondere wenn die Anwendung auf **Kubernetes** läuft, werden Sie Gunicorn wahrscheinlich **nicht** verwenden wollen und stattdessen **einen einzelnen Uvicorn-Prozess pro Container** ausführen wollen, aber ich werde Ihnen später in diesem Kapitel mehr darüber erzählen.
Wenn Sie Container verwenden, beispielsweise mit Docker oder Kubernetes, erzähle ich Ihnen mehr darüber im nächsten Kapitel: [FastAPI in Containern Docker](docker.md){.internal-link target=_blank}.
## Gunicorn mit Uvicorn-Workern
Insbesondere wenn die Anwendung auf **Kubernetes** läuft, werden Sie wahrscheinlich **keine** Worker verwenden wollen, und stattdessen **einen einzelnen Uvicorn-Prozess pro Container** ausführen wollen, aber ich werde Ihnen später in diesem Kapitel mehr darüber erzählen.
**Gunicorn** ist hauptsächlich ein Anwendungsserver, der den **WSGI-Standard** verwendet. Das bedeutet, dass Gunicorn Anwendungen wie Flask und Django ausliefern kann. Gunicorn selbst ist nicht mit **FastAPI** kompatibel, da FastAPI den neuesten **<a href="https://asgi.readthedocs.io/en/latest/" class="external-link" target="_blank">ASGI-Standard</a>** verwendet.
///
Aber Gunicorn kann als **Prozessmanager** arbeiten und Benutzer können ihm mitteilen, welche bestimmte **Workerprozessklasse** verwendet werden soll. Dann würde Gunicorn einen oder mehrere **Workerprozesse** starten, diese Klasse verwendend.
## Mehrere Worker { #multiple-workers }
Und **Uvicorn** hat eine **Gunicorn-kompatible Workerklasse**.
Sie können mehrere Worker mit der `--workers`-Befehlszeilenoption starten:
Mit dieser Kombination würde Gunicorn als **Prozessmanager** fungieren und den **Port** und die **IP** abhören. Und er würde die Kommunikation an die Workerprozesse **weiterleiten**, welche die **Uvicorn-Klasse** ausführen.
//// tab | `fastapi`
Und dann wäre die Gunicorn-kompatible **Uvicorn-Worker**-Klasse dafür verantwortlich, die von Gunicorn gesendeten Daten in den ASGI-Standard zu konvertieren, damit FastAPI diese verwenden kann.
## Gunicorn und Uvicorn installieren
Wenn Sie den `fastapi`-Befehl verwenden:
<div class="termy">
```console
$ pip install "uvicorn[standard]" gunicorn
$ <font color="#4E9A06">fastapi</font> run --workers 4 <u style="text-decoration-style:solid">main.py</u>
---> 100%
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting production server 🚀
Searching for package file structure from directories with
<font color="#3465A4">__init__.py</font> files
Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
<span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> 🐍 main.py
<span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with the
following code:
<u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
<span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000/docs</u></font>
Logs:
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font> <b>(</b>Press CTRL+C to
quit<b>)</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started parent process <b>[</b><font color="#34E2E2"><b>27365</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27368</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27369</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27370</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27367</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
```
</div>
Dadurch wird sowohl Uvicorn mit zusätzlichen `standard`-Packages (um eine hohe Leistung zu erzielen) als auch Gunicorn installiert.
////
## Gunicorn mit Uvicorn-Workern ausführen
//// tab | `uvicorn`
Dann können Sie Gunicorn ausführen mit:
<div class="termy">
```console
$ gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80
[19499] [INFO] Starting gunicorn 20.1.0
[19499] [INFO] Listening at: http://0.0.0.0:80 (19499)
[19499] [INFO] Using worker: uvicorn.workers.UvicornWorker
[19511] [INFO] Booting worker with pid: 19511
[19513] [INFO] Booting worker with pid: 19513
[19514] [INFO] Booting worker with pid: 19514
[19515] [INFO] Booting worker with pid: 19515
[19511] [INFO] Started server process [19511]
[19511] [INFO] Waiting for application startup.
[19511] [INFO] Application startup complete.
[19513] [INFO] Started server process [19513]
[19513] [INFO] Waiting for application startup.
[19513] [INFO] Application startup complete.
[19514] [INFO] Started server process [19514]
[19514] [INFO] Waiting for application startup.
[19514] [INFO] Application startup complete.
[19515] [INFO] Started server process [19515]
[19515] [INFO] Waiting for application startup.
[19515] [INFO] Application startup complete.
```
</div>
Sehen wir uns an, was jede dieser Optionen bedeutet:
* `main:app`: Das ist die gleiche Syntax, die auch von Uvicorn verwendet wird. `main` bedeutet das Python-Modul mit dem Namen `main`, also eine Datei `main.py`. Und `app` ist der Name der Variable, welche die **FastAPI**-Anwendung ist.
* Stellen Sie sich einfach vor, dass `main:app` einer Python-`import`-Anweisung wie der folgenden entspricht:
```Python
from main import app
```
* Der Doppelpunkt in `main:app` entspricht also dem Python-`import`-Teil in `from main import app`.
* `--workers`: Die Anzahl der zu verwendenden Workerprozesse, jeder führt einen Uvicorn-Worker aus, in diesem Fall 4 Worker.
* `--worker-class`: Die Gunicorn-kompatible Workerklasse zur Verwendung in den Workerprozessen.
* Hier übergeben wir die Klasse, die Gunicorn etwa so importiert und verwendet:
```Python
import uvicorn.workers.UvicornWorker
```
* `--bind`: Das teilt Gunicorn die IP und den Port mit, welche abgehört werden sollen, wobei ein Doppelpunkt (`:`) verwendet wird, um die IP und den Port zu trennen.
* Wenn Sie Uvicorn direkt ausführen würden, würden Sie anstelle von `--bind 0.0.0.0:80` (die Gunicorn-Option) stattdessen `--host 0.0.0.0` und `--port 80` verwenden.
In der Ausgabe können Sie sehen, dass die **PID** (Prozess-ID) jedes Prozesses angezeigt wird (es ist nur eine Zahl).
Sie können sehen, dass:
* Der Gunicorn **Prozessmanager** beginnt, mit der PID `19499` (in Ihrem Fall ist es eine andere Nummer).
* Dann beginnt er zu lauschen: `Listening at: http://0.0.0.0:80`.
* Dann erkennt er, dass er die Workerklasse `uvicorn.workers.UvicornWorker` verwenden muss.
* Und dann werden **4 Worker** gestartet, jeder mit seiner eigenen PID: `19511`, `19513`, `19514` und `19515`.
Gunicorn würde sich bei Bedarf auch um die Verwaltung **beendeter Prozesse** und den **Neustart** von Prozessen kümmern, um die Anzahl der Worker aufrechtzuerhalten. Das hilft also teilweise beim **Neustarts**-Konzept aus der obigen Liste.
Dennoch möchten Sie wahrscheinlich auch etwas außerhalb haben, um sicherzustellen, dass Gunicorn bei Bedarf **neu gestartet wird**, und er auch **beim Hochfahren ausgeführt wird**, usw.
## Uvicorn mit Workern
Uvicorn bietet ebenfalls die Möglichkeit, mehrere **Workerprozesse** zu starten und auszuführen.
Dennoch sind die Fähigkeiten von Uvicorn zur Abwicklung von Workerprozessen derzeit eingeschränkter als die von Gunicorn. Wenn Sie also einen Prozessmanager auf dieser Ebene (auf der Python-Ebene) haben möchten, ist es vermutlich besser, es mit Gunicorn als Prozessmanager zu versuchen.
Wie auch immer, Sie würden es so ausführen:
Wenn Sie den `uvicorn`-Befehl direkt verwenden möchten:
<div class="termy">
@@ -146,15 +105,17 @@ $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
</div>
////
Die einzige neue Option hier ist `--workers`, die Uvicorn anweist, 4 Workerprozesse zu starten.
Sie können auch sehen, dass die **PID** jedes Prozesses angezeigt wird, `27365` für den übergeordneten Prozess (dies ist der **Prozessmanager**) und eine für jeden Workerprozess: `27368`, `27369`, `27370` und `27367`.
## Deployment-Konzepte
## Deployment-Konzepte { #deployment-concepts }
Hier haben Sie gesehen, wie Sie mit **Gunicorn** (oder Uvicorn) **Uvicorn-Workerprozesse** verwalten, um die Ausführung der Anwendung zu **parallelisieren**, **mehrere Kerne** der CPU zu nutzen und in der Lage zu sein, **mehr Requests** zu bedienen.
Hier haben Sie gesehen, wie Sie mehrere **Worker** verwenden, um die Ausführung der Anwendung zu **parallelisieren**, **mehrere Kerne** der CPU zu nutzen und in der Lage zu sein, **mehr Requests** zu bearbeiten.
In der Liste der Deployment-Konzepte von oben würde die Verwendung von Workern hauptsächlich beim **Replikation**-Teil und ein wenig bei **Neustarts** helfen, aber Sie müssen sich trotzdem um die anderen kümmern:
In der Liste der Deployment-Konzepte von oben würde die Verwendung von Workern hauptsächlich bei der **Replikation** und ein wenig bei **Neustarts** helfen, aber Sie müssen sich trotzdem um die anderen kümmern:
* **Sicherheit HTTPS**
* **Beim Hochfahren ausführen**
@@ -163,18 +124,16 @@ In der Liste der Deployment-Konzepte von oben würde die Verwendung von Workern
* **Arbeitsspeicher**
* **Schritte vor dem Start**
## Container und Docker
## Container und Docker { #containers-and-docker }
Im nächsten Kapitel über [FastAPI in Containern Docker](docker.md){.internal-link target=_blank} werde ich einige Strategien erläutern, die Sie für den Umgang mit den anderen **Deployment-Konzepten** verwenden können.
Ich zeige Ihnen auch das **offizielle Docker-Image**, welches **Gunicorn mit Uvicorn-Workern** und einige Standardkonfigurationen enthält, die für einfache Fälle nützlich sein können.
Ich zeige Ihnen, wie Sie **Ihr eigenes Image von Grund auf erstellen**, um einen einzelnen Uvicorn-Prozess auszuführen. Es ist ein einfacher Vorgang und wahrscheinlich das, was Sie tun möchten, wenn Sie ein verteiltes Containerverwaltungssystem wie **Kubernetes** verwenden.
Dort zeige ich Ihnen auch, wie Sie **Ihr eigenes Image von Grund auf erstellen**, um einen einzelnen Uvicorn-Prozess (ohne Gunicorn) auszuführen. Es ist ein einfacher Vorgang und wahrscheinlich das, was Sie tun möchten, wenn Sie ein verteiltes Containerverwaltungssystem wie **Kubernetes** verwenden.
## Zusammenfassung { #recap }
## Zusammenfassung
Sie können mehrere Workerprozesse mit der `--workers`-CLI-Option über die `fastapi`- oder `uvicorn`-Befehle nutzen, um **Multikern-CPUs** auszunutzen und **mehrere Prozesse parallel** auszuführen.
Sie können **Gunicorn** (oder auch Uvicorn) als Prozessmanager mit Uvicorn-Workern verwenden, um **Multikern-CPUs** zu nutzen und **mehrere Prozesse parallel** auszuführen.
Sie können diese Tools und Ideen nutzen, wenn Sie **Ihr eigenes Deployment-System** einrichten und sich dabei selbst um die anderen Deployment-Konzepte kümmern.
Sie könnten diese Tools und Ideen nutzen, wenn Sie **Ihr eigenes Deployment-System** einrichten und sich dabei selbst um die anderen Deployment-Konzepte kümmern.
Schauen Sie sich das nächste Kapitel an, um mehr über **FastAPI** mit Containern (z. B. Docker und Kubernetes) zu erfahren. Sie werden sehen, dass diese Tools auch einfache Möglichkeiten bieten, die anderen **Deployment-Konzepte** zu lösen. ✨

View File

@@ -1,4 +1,4 @@
# Über FastAPI-Versionen
# Über FastAPI-Versionen { #about-fastapi-versions }
**FastAPI** wird bereits in vielen Anwendungen und Systemen produktiv eingesetzt. Und die Testabdeckung wird bei 100 % gehalten. Aber seine Entwicklung geht immer noch schnell voran.
@@ -8,42 +8,45 @@ Aus diesem Grund sind die aktuellen Versionen immer noch `0.x.x`, was darauf hin
Sie können jetzt Produktionsanwendungen mit **FastAPI** erstellen (und das tun Sie wahrscheinlich schon seit einiger Zeit), Sie müssen nur sicherstellen, dass Sie eine Version verwenden, die korrekt mit dem Rest Ihres Codes funktioniert.
## `fastapi`-Version pinnen
## Ihre `fastapi`-Version pinnen { #pin-your-fastapi-version }
Als Erstes sollten Sie die Version von **FastAPI**, die Sie verwenden, an die höchste Version „pinnen“, von der Sie wissen, dass sie für Ihre Anwendung korrekt funktioniert.
Angenommen, Sie verwenden in Ihrer Anwendung die Version `0.45.0`.
Angenommen, Sie verwenden in Ihrer App die Version `0.112.0`.
Wenn Sie eine `requirements.txt`-Datei verwenden, können Sie die Version wie folgt angeben:
```txt
fastapi==0.45.0
fastapi[standard]==0.112.0
```
Das würde bedeuten, dass Sie genau die Version `0.45.0` verwenden.
Das würde bedeuten, dass Sie genau die Version `0.112.0` verwenden.
Oder Sie können sie auch anpinnen mit:
```txt
fastapi>=0.45.0,<0.46.0
fastapi[standard]>=0.112.0,<0.113.0
```
Das würde bedeuten, dass Sie eine Version `0.45.0` oder höher verwenden würden, aber kleiner als `0.46.0`, beispielsweise würde eine Version `0.45.2` immer noch akzeptiert.
Das würde bedeuten, dass Sie eine Version `0.112.0` oder höher verwenden würden, aber kleiner als `0.113.0`, beispielsweise würde eine Version `0.112.2` immer noch akzeptiert.
Wenn Sie zum Verwalten Ihrer Installationen andere Tools wie Poetry, Pipenv oder andere verwenden, sie verfügen alle über eine Möglichkeit, bestimmte Versionen für Ihre Packages zu definieren.
Wenn Sie zum Verwalten Ihrer Installationen andere Tools wie `uv`, Poetry, Pipenv oder andere verwenden, sie verfügen alle über eine Möglichkeit, bestimmte Versionen für Ihre Packages zu definieren.
## Verfügbare Versionen
## Verfügbare Versionen { #available-versions }
Die verfügbaren Versionen können Sie in den [Release Notes](../release-notes.md){.internal-link target=_blank} einsehen (z. B. um zu überprüfen, welches die neueste Version ist).
Die verfügbaren Versionen können Sie in den [Versionshinweisen](../release-notes.md){.internal-link target=_blank} einsehen (z. B. um zu überprüfen, welches die neueste Version ist).
## Über Versionen
## Über Versionen { #about-versions }
Gemäß den Konventionen zur semantischen Versionierung könnte jede Version unter `1.0.0` potenziell nicht abwärtskompatible Änderungen hinzufügen.
FastAPI folgt auch der Konvention, dass jede „PATCH“-Versionsänderung für Bugfixes und abwärtskompatible Änderungen gedacht ist.
!!! tip "Tipp"
Der „PATCH“ ist die letzte Zahl, zum Beispiel ist in `0.2.3` die PATCH-Version `3`.
/// tip | Tipp
Der „PATCH“ ist die letzte Zahl, zum Beispiel ist in `0.2.3` die PATCH-Version `3`.
///
Sie sollten also in der Lage sein, eine Version wie folgt anzupinnen:
@@ -53,12 +56,15 @@ fastapi>=0.45.0,<0.46.0
Nicht abwärtskompatible Änderungen und neue Funktionen werden in „MINOR“-Versionen hinzugefügt.
!!! tip "Tipp"
„MINOR“ ist die Zahl in der Mitte, zum Beispiel ist in `0.2.3` die MINOR-Version `2`.
/// tip | Tipp
## Upgrade der FastAPI-Versionen
„MINOR“ ist die Zahl in der Mitte, zum Beispiel ist in `0.2.3` die MINOR-Version `2`.
Sie sollten Tests für Ihre Anwendung hinzufügen.
///
## Upgrade der FastAPI-Versionen { #upgrading-the-fastapi-versions }
Sie sollten Tests für Ihre App hinzufügen.
Mit **FastAPI** ist das sehr einfach (dank Starlette), schauen Sie sich die Dokumentation an: [Testen](../tutorial/testing.md){.internal-link target=_blank}
@@ -66,7 +72,7 @@ Nachdem Sie Tests erstellt haben, können Sie die **FastAPI**-Version auf eine n
Wenn alles funktioniert oder nachdem Sie die erforderlichen Änderungen vorgenommen haben und alle Ihre Tests bestehen, können Sie Ihr `fastapi` an die neue aktuelle Version pinnen.
## Über Starlette
## Über Starlette { #about-starlette }
Sie sollten die Version von `starlette` nicht pinnen.
@@ -74,13 +80,14 @@ Verschiedene Versionen von **FastAPI** verwenden eine bestimmte neuere Version v
Sie können **FastAPI** also einfach die korrekte Starlette-Version verwenden lassen.
## Über Pydantic
## Über Pydantic { #about-pydantic }
Pydantic integriert die Tests für **FastAPI** in seine eigenen Tests, sodass neue Versionen von Pydantic (über `1.0.0`) immer mit FastAPI kompatibel sind.
Sie können Pydantic an jede für Sie geeignete Version über `1.0.0` und unter `2.0.0` anpinnen.
Sie können Pydantic an jede für Sie geeignete Version über `1.0.0` anpinnen.
Zum Beispiel:
```txt
pydantic>=1.2.0,<2.0.0
pydantic>=2.7.0,<3.0.0
```

View File

@@ -0,0 +1,298 @@
# Umgebungsvariablen { #environment-variables }
/// tip | Tipp
Wenn Sie bereits wissen, was „Umgebungsvariablen“ sind und wie man sie verwendet, können Sie dies überspringen.
///
Eine Umgebungsvariable (auch bekannt als „**env var**“) ist eine Variable, die **außerhalb** des Python-Codes im **Betriebssystem** lebt und von Ihrem Python-Code (oder auch von anderen Programmen) gelesen werden kann.
Umgebungsvariablen können nützlich sein, um **Einstellungen** der Anwendung zu handhaben, als Teil der **Installation** von Python usw.
## Umgebungsvariablen erstellen und verwenden { #create-and-use-env-vars }
Sie können Umgebungsvariablen in der **Shell (Terminal)** erstellen und verwenden, ohne Python zu benötigen:
//// tab | Linux, macOS, Windows Bash
<div class="termy">
```console
// Sie können eine Umgebungsvariable MY_NAME erstellen mit
$ export MY_NAME="Wade Wilson"
// Dann können Sie sie mit anderen Programmen verwenden, etwa
$ echo "Hello $MY_NAME"
Hello Wade Wilson
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
// Erstellen Sie eine Umgebungsvariable MY_NAME
$ $Env:MY_NAME = "Wade Wilson"
// Verwenden Sie sie mit anderen Programmen, etwa
$ echo "Hello $Env:MY_NAME"
Hello Wade Wilson
```
</div>
////
## Umgebungsvariablen in Python lesen { #read-env-vars-in-python }
Sie können auch Umgebungsvariablen **außerhalb** von Python erstellen, im Terminal (oder mit jeder anderen Methode) und sie dann **in Python** lesen.
Zum Beispiel könnten Sie eine Datei `main.py` haben mit:
```Python hl_lines="3"
import os
name = os.getenv("MY_NAME", "World")
print(f"Hello {name} from Python")
```
/// tip | Tipp
Das zweite Argument von <a href="https://docs.python.org/3.8/library/os.html#os.getenv" class="external-link" target="_blank">`os.getenv()`</a> ist der Defaultwert, der zurückgegeben wird.
Wenn er nicht angegeben wird, ist er standardmäßig `None`. Hier geben wir `"World"` als den zu verwendenden Defaultwert an.
///
Dann könnten Sie das Python-Programm aufrufen:
//// tab | Linux, macOS, Windows Bash
<div class="termy">
```console
// Hier setzen wir die Umgebungsvariable noch nicht
$ python main.py
// Da wir die Umgebungsvariable nicht gesetzt haben, erhalten wir den Defaultwert
Hello World from Python
// Aber wenn wir zuerst eine Umgebungsvariable erstellen
$ export MY_NAME="Wade Wilson"
// Und dann das Programm erneut aufrufen
$ python main.py
// Jetzt kann es die Umgebungsvariable lesen
Hello Wade Wilson from Python
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
// Hier setzen wir die Umgebungsvariable noch nicht
$ python main.py
// Da wir die Umgebungsvariable nicht gesetzt haben, erhalten wir den Defaultwert
Hello World from Python
// Aber wenn wir zuerst eine Umgebungsvariable erstellen
$ $Env:MY_NAME = "Wade Wilson"
// Und dann das Programm erneut aufrufen
$ python main.py
// Jetzt kann es die Umgebungsvariable lesen
Hello Wade Wilson from Python
```
</div>
////
Da Umgebungsvariablen außerhalb des Codes gesetzt werden können, aber vom Code gelesen werden können und nicht mit den restlichen Dateien gespeichert (in `git` committet) werden müssen, werden sie häufig für Konfigurationen oder **Einstellungen** verwendet.
Sie können auch eine Umgebungsvariable nur für einen **spezifischen Programmaufruf** erstellen, die nur für dieses Programm und nur für dessen Dauer verfügbar ist.
Um dies zu tun, erstellen Sie sie direkt vor dem Programmaufruf, in derselben Zeile:
<div class="termy">
```console
// Erstellen Sie eine Umgebungsvariable MY_NAME in der Zeile für diesen Programmaufruf
$ MY_NAME="Wade Wilson" python main.py
// Jetzt kann es die Umgebungsvariable lesen
Hello Wade Wilson from Python
// Die Umgebungsvariable existiert danach nicht mehr
$ python main.py
Hello World from Python
```
</div>
/// tip | Tipp
Sie können mehr darüber lesen auf <a href="https://12factor.net/config" class="external-link" target="_blank">The Twelve-Factor App: Config</a>.
///
## Typen und Validierung { #types-and-validation }
Diese Umgebungsvariablen können nur **Textstrings** handhaben, da sie extern zu Python sind und kompatibel mit anderen Programmen und dem Rest des Systems (und sogar mit verschiedenen Betriebssystemen, wie Linux, Windows, macOS) sein müssen.
Das bedeutet, dass **jeder Wert**, der in Python von einer Umgebungsvariable gelesen wird, **ein `str` sein wird**, und jede Konvertierung in einen anderen Typ oder jede Validierung muss im Code vorgenommen werden.
Sie werden mehr darüber lernen, wie man Umgebungsvariablen zur Handhabung von **Anwendungseinstellungen** verwendet, im [Handbuch für fortgeschrittene Benutzer Einstellungen und Umgebungsvariablen](./advanced/settings.md){.internal-link target=_blank}.
## `PATH`-Umgebungsvariable { #path-environment-variable }
Es gibt eine **spezielle** Umgebungsvariable namens **`PATH`**, die von den Betriebssystemen (Linux, macOS, Windows) verwendet wird, um Programme zu finden, die ausgeführt werden sollen.
Der Wert der Variable `PATH` ist ein langer String, der aus Verzeichnissen besteht, die auf Linux und macOS durch einen Doppelpunkt `:` und auf Windows durch ein Semikolon `;` getrennt sind.
Zum Beispiel könnte die `PATH`-Umgebungsvariable so aussehen:
//// tab | Linux, macOS
```plaintext
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```
Das bedeutet, dass das System nach Programmen in den Verzeichnissen suchen sollte:
* `/usr/local/bin`
* `/usr/bin`
* `/bin`
* `/usr/sbin`
* `/sbin`
////
//// tab | Windows
```plaintext
C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32
```
Das bedeutet, dass das System nach Programmen in den Verzeichnissen suchen sollte:
* `C:\Program Files\Python312\Scripts`
* `C:\Program Files\Python312`
* `C:\Windows\System32`
////
Wenn Sie einen **Befehl** im Terminal eingeben, **sucht** das Betriebssystem nach dem Programm in **jedem dieser Verzeichnisse**, die in der `PATH`-Umgebungsvariablen aufgeführt sind.
Zum Beispiel, wenn Sie `python` im Terminal eingeben, sucht das Betriebssystem nach einem Programm namens `python` im **ersten Verzeichnis** in dieser Liste.
Wenn es es findet, wird es **benutzt**. Andernfalls sucht es weiter in den **anderen Verzeichnissen**.
### Python installieren und den `PATH` aktualisieren { #installing-python-and-updating-the-path }
Wenn Sie Python installieren, könnten Sie gefragt werden, ob Sie die `PATH`-Umgebungsvariable aktualisieren möchten.
//// tab | Linux, macOS
Angenommen, Sie installieren Python und es landet in einem Verzeichnis `/opt/custompython/bin`.
Wenn Sie erlauben, die `PATH`-Umgebungsvariable zu aktualisieren, fügt der Installer `/opt/custompython/bin` zur `PATH`-Umgebungsvariable hinzu.
Das könnte so aussehen:
```plaintext
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin
```
Auf diese Weise, wenn Sie `python` im Terminal eingeben, findet das System das Python-Programm in `/opt/custompython/bin` (das letzte Verzeichnis) und verwendet dieses.
////
//// tab | Windows
Angenommen, Sie installieren Python und es landet in einem Verzeichnis `C:\opt\custompython\bin`.
Wenn Sie erlauben, die `PATH`-Umgebungsvariable zu aktualisieren, fügt der Installer `C:\opt\custompython\bin` zur `PATH`-Umgebungsvariable hinzu.
```plaintext
C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32;C:\opt\custompython\bin
```
Auf diese Weise, wenn Sie `python` im Terminal eingeben, findet das System das Python-Programm in `C:\opt\custompython\bin` (das letzte Verzeichnis) und verwendet dieses.
////
Also, wenn Sie tippen:
<div class="termy">
```console
$ python
```
</div>
//// tab | Linux, macOS
Das System wird das `python` Programm in `/opt/custompython/bin` **finden** und es ausführen.
Es wäre ungefähr gleichbedeutend mit der Eingabe von:
<div class="termy">
```console
$ /opt/custompython/bin/python
```
</div>
////
//// tab | Windows
Das System wird das `python` Programm in `C:\opt\custompython\bin\python` **finden** und es ausführen.
Es wäre ungefähr gleichbedeutend mit der Eingabe von:
<div class="termy">
```console
$ C:\opt\custompython\bin\python
```
</div>
////
Diese Informationen werden nützlich sein, wenn Sie über [Virtuelle Umgebungen](virtual-environments.md){.internal-link target=_blank} lernen.
## Fazit { #conclusion }
Mit diesem Wissen sollten Sie ein grundlegendes Verständnis davon haben, was **Umgebungsvariablen** sind und wie man sie in Python verwendet.
Sie können auch mehr darüber in der <a href="https://en.wikipedia.org/wiki/Environment_variable" class="external-link" target="_blank">Wikipedia zu Umgebungsvariablen</a> lesen.
In vielen Fällen ist es nicht sehr offensichtlich, wie Umgebungsvariablen nützlich und sofort anwendbar sein könnten. Aber sie tauchen immer wieder in vielen verschiedenen Szenarien auf, wenn Sie entwickeln, deshalb ist es gut, darüber Bescheid zu wissen.
Zum Beispiel werden Sie diese Informationen im nächsten Abschnitt über [Virtuelle Umgebungen](virtual-environments.md) benötigen.

View File

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

View File

@@ -0,0 +1,75 @@
# FastAPI CLI { #fastapi-cli }
**FastAPI CLI** ist ein Kommandozeilenprogramm, mit dem Sie Ihre FastAPI-App bereitstellen, Ihr FastAPI-Projekt verwalten und mehr.
Wenn Sie FastAPI installieren (z. B. mit `pip install "fastapi[standard]"`), wird ein Package namens `fastapi-cli` mitgeliefert, das den Befehl `fastapi` im Terminal bereitstellt.
Um Ihre FastAPI-App für die Entwicklung auszuführen, können Sie den Befehl `fastapi dev` verwenden:
<div class="termy">
```console
$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u>
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server 🚀
Searching for package file structure from directories with
<font color="#3465A4">__init__.py</font> files
Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
<span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> 🐍 main.py
<span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with the
following code:
<u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
<span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000/docs</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> tip </font></span> Running in development mode, for production use:
<b>fastapi run</b>
Logs:
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Will watch for changes in these directories:
<b>[</b><font color="#4E9A06">&apos;/home/user/code/awesomeapp&apos;</font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font> <b>(</b>Press CTRL+C to
quit<b>)</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started reloader process <b>[</b><font color="#34E2E2"><b>383138</b></font><b>]</b> using WatchFiles
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>383153</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
```
</div>
Das Kommandozeilenprogramm namens `fastapi` ist das **FastAPI CLI**.
FastAPI CLI nimmt den Pfad zu Ihrem Python-Programm (z. B. `main.py`), erkennt automatisch die `FastAPI`-Instanz (häufig `app` genannt), bestimmt den korrekten Importprozess und stellt sie dann bereit.
Für die Produktion würden Sie stattdessen `fastapi run` verwenden. 🚀
Intern verwendet das **FastAPI CLI** <a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a>, einen leistungsstarken, produktionsreifen, ASGI-Server. 😎
## `fastapi dev` { #fastapi-dev }
Das Ausführen von `fastapi dev` startet den Entwicklermodus.
Standardmäßig ist **Autoreload** aktiviert, das den Server automatisch neu lädt, wenn Sie Änderungen an Ihrem Code vornehmen. Dies ist ressourcenintensiv und könnte weniger stabil sein als wenn es deaktiviert ist. Sie sollten es nur für die Entwicklung verwenden. Es horcht auch auf der IP-Adresse `127.0.0.1`, die die IP für Ihre Maschine ist, um nur mit sich selbst zu kommunizieren (`localhost`).
## `fastapi run` { #fastapi-run }
Das Ausführen von `fastapi run` startet FastAPI standardmäßig im Produktionsmodus.
Standardmäßig ist **Autoreload** deaktiviert. Es horcht auch auf der IP-Adresse `0.0.0.0`, was alle verfügbaren IP-Adressen bedeutet, so wird es öffentlich zugänglich für jeden, der mit der Maschine kommunizieren kann. So würden Sie es normalerweise in der Produktion ausführen, beispielsweise in einem Container.
In den meisten Fällen würden (und sollten) Sie einen „Terminierungsproxy“ haben, der HTTPS für Sie verwaltet. Dies hängt davon ab, wie Sie Ihre Anwendung deployen. Ihr Anbieter könnte dies für Sie erledigen, oder Sie müssen es selbst einrichten.
/// tip | Tipp
Sie können mehr darüber in der [Deployment-Dokumentation](deployment/index.md){.internal-link target=_blank} erfahren.
///

View File

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

View File

@@ -1,26 +1,21 @@
---
hide:
- navigation
---
# Merkmale { #features }
# Merkmale
## FastAPI Merkmale
## FastAPI Merkmale { #fastapi-features }
**FastAPI** ermöglicht Ihnen Folgendes:
### Basiert auf offenen Standards
### Basiert auf offenen Standards { #based-on-open-standards }
* <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a> für die Erstellung von APIs, inklusive Deklarationen von <abbr title="auch genannt Endpunkte, Routen">Pfad</abbr>-<abbr title="gemeint sind HTTP-Methoden wie POST, GET, PUT, DELETE">Operationen</abbr>, Parametern, Body-Anfragen, Sicherheit, usw.
* <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a> für die Erstellung von APIs, inklusive Deklarationen von <abbr title="auch bekannt als: Endpunkte, Routen">Pfad</abbr>-<abbr title="auch bekannt als HTTP-Methoden, wie POST, GET, PUT, DELETE">Operationen</abbr>, Parametern, <abbr title="Anfragekörper">Requestbodys</abbr>, Sicherheit, usw.
* Automatische Dokumentation der Datenmodelle mit <a href="https://json-schema.org/" class="external-link" target="_blank"><strong>JSON Schema</strong></a> (da OpenAPI selbst auf JSON Schema basiert).
* Um diese Standards herum entworfen, nach sorgfältigem Studium. Statt einer nachträglichen Schicht darüber.
* Dies ermöglicht auch automatische **Client-Code-Generierung** in vielen Sprachen.
### Automatische Dokumentation
### Automatische Dokumentation { #automatic-docs }
Interaktive API-Dokumentation und erkundbare Web-Benutzeroberflächen. Da das Framework auf OpenAPI basiert, gibt es mehrere Optionen, zwei sind standardmäßig vorhanden.
* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank"><strong>Swagger UI</strong></a>, bietet interaktive Erkundung, testen und rufen Sie ihre API direkt im Webbrowser auf.
* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank"><strong>Swagger UI</strong></a>, bietet interaktive Erkundung, testen und rufen Sie Ihre API direkt im Webbrowser auf.
![Swagger UI Interaktion](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png)
@@ -28,22 +23,21 @@ Interaktive API-Dokumentation und erkundbare Web-Benutzeroberflächen. Da das Fr
![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png)
### Nur modernes Python
### Nur modernes Python { #just-modern-python }
Alles basiert auf **Python 3.8 Typ**-Deklarationen (dank Pydantic). Es muss keine neue Syntax gelernt werden, nur standardisiertes modernes Python.
Alles basiert auf Standard-**Python-Typ**deklarationen (dank Pydantic). Es muss keine neue Syntax gelernt werden, nur standardisiertes modernes Python.
Wenn Sie eine zweiminütige Auffrischung benötigen, wie man Python-Typen verwendet (auch wenn Sie FastAPI nicht benutzen), schauen Sie sich das kurze Tutorial an: [Einführung in Python-Typen](python-types.md){.internal-link target=_blank}.
Sie schreiben Standard-Python mit Typen:
```Python
from typing import List, Dict
from datetime import date
from pydantic import BaseModel
# Deklarieren Sie eine Variable als ein `str`
# und bekommen Sie Editor-Unterstütung innerhalb der Funktion
# Deklarieren Sie eine Variable als ein str
# und bekommen Sie Editor-Unterstützung innerhalb der Funktion
def main(user_id: str):
return user_id
@@ -69,22 +63,25 @@ second_user_data = {
my_second_user: User = User(**second_user_data)
```
!!! info
`**second_user_data` bedeutet:
/// info | Info
Nimm die Schlüssel-Wert-Paare des `second_user_data` <abbr title="Dictionary Wörterbuch: In anderen Programmiersprachen auch Hash, Map, Objekt, Assoziatives Array genannt">Dicts</abbr> und übergib sie direkt als Schlüsselwort-Argumente. Äquivalent zu: `User(id=4, name="Mary", joined="2018-11-30")`.
`**second_user_data` bedeutet:
### Editor Unterstützung
Nimm die Schlüssel-Wert-Paare des `second_user_data` <abbr title="Dictionary Zuordnungstabelle: In anderen Sprachen auch Hash, Map, Objekt, Assoziatives Array genannt">Dicts</abbr> und übergebe sie direkt als Schlüsselwort-Argumente. Äquivalent zu: `User(id=4, name="Mary", joined="2018-11-30")`
///
### Editor Unterstützung { #editor-support }
Das ganze Framework wurde so entworfen, dass es einfach und intuitiv zu benutzen ist; alle Entscheidungen wurden auf mehreren Editoren getestet, sogar vor der Implementierung, um die bestmögliche Entwicklererfahrung zu gewährleisten.
In der letzten Python-Entwickler-Umfrage wurde klar, <a href="https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features" class="external-link" target="_blank">dass die meist genutzte Funktion die „Autovervollständigung“ ist</a>.
In den Python-Entwickler-Umfragen wird klar, <a href="https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features" class="external-link" target="_blank">dass die meist genutzte Funktion die „Autovervollständigung“ ist</a>.
Das gesamte **FastAPI**-Framework ist darauf ausgelegt, das zu erfüllen. Autovervollständigung funktioniert überall.
Sie werden selten noch mal in der Dokumentation nachschauen müssen.
So kann ihr Editor Sie unterstützen:
So kann Ihr Editor Sie unterstützen:
* in <a href="https://code.visualstudio.com/" class="external-link" target="_blank">Visual Studio Code</a>:
@@ -94,23 +91,23 @@ So kann ihr Editor Sie unterstützen:
![Editor Unterstützung](https://fastapi.tiangolo.com/img/pycharm-completion.png)
Sie bekommen sogar Autovervollständigung an Stellen, an denen Sie dies vorher nicht für möglich gehalten hätten. Zum Beispiel der `price` Schlüssel in einem JSON Datensatz (dieser könnte auch verschachtelt sein), der aus einer Anfrage kommt.
Sie bekommen sogar Autovervollständigung an Stellen, an denen Sie dies vorher nicht für möglich gehalten hätten. Zum Beispiel der `price` Schlüssel in einem JSON Datensatz (dieser könnte auch verschachtelt sein), der aus einem Request kommt.
Nie wieder falsche Schlüsselnamen tippen, Hin und Herhüpfen zwischen der Dokumentation, Hoch- und Runterscrollen, um herauszufinden, ob es `username` oder `user_name` war.
### Kompakt
### Kompakt { #short }
Es gibt für alles sensible **Defaultwerte**, mit optionaler Konfiguration überall. Alle Parameter können feinjustiert werden, damit sie tun, was Sie benötigen, und die API definieren, die Sie brauchen.
Aber standardmäßig **„funktioniert einfach alles“**.
### Validierung
### Validierung { #validation }
* Validierung für die meisten (oder alle?) Python-**Datentypen**, hierzu gehören:
* JSON Objekte (`dict`).
* JSON Listen (`list`), die den Typ ihrer Elemente definieren.
* Strings (`str`) mit definierter minimaler und maximaler Länge.
* Zahlen (`int`, `float`) mit Mindest- und Maximal-Werten, usw.
* Zahlen (`int`, `float`) mit Mindest- und Maximalwerten, usw.
* Validierung für mehr exotische Typen, wie:
* URL.
@@ -120,49 +117,49 @@ Aber standardmäßig **„funktioniert einfach alles“**.
Die gesamte Validierung übernimmt das gut etablierte und robuste **Pydantic**.
### Sicherheit und Authentifizierung
### Sicherheit und Authentifizierung { #security-and-authentication }
Sicherheit und Authentifizierung ist integriert. Ohne Kompromisse bei Datenbanken oder Datenmodellen.
Sicherheit und Authentifizierung sind integriert. Ohne Kompromisse bei Datenbanken oder Datenmodellen.
Alle in OpenAPI definierten Sicherheitsschemas, inklusive:
* HTTP Basic Authentifizierung.
* HTTP Basic.
* **OAuth2** (auch mit **JWT Tokens**). Siehe dazu das Tutorial zu [OAuth2 mit JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}.
* API Schlüssel in:
* Header-Feldern.
* Anfrageparametern.
* Headern.
* Query-Parametern.
* Cookies, usw.
Zusätzlich alle Sicherheitsfunktionen von Starlette (inklusive **Session Cookies**).
Alles als wiederverwendbare Tools und Komponenten gebaut, die einfach in ihre Systeme, Datenspeicher, relationalen und nicht-relationalen Datenbanken, usw., integriert werden können.
Alles als wiederverwendbare Tools und Komponenten gebaut, die einfach in Ihre Systeme, Datenspeicher, relationale und nicht-relationale Datenbanken, usw., integriert werden können.
### Einbringen von Abhängigkeiten (Dependency Injection)
### Dependency Injection { #dependency-injection }
FastAPI enthält ein extrem einfach zu verwendendes, aber extrem mächtiges <abbr title='Dependency Injection Einbringen von Abhängigkeiten: Auch bekannt als Komponenten, Resourcen, Dienste, Dienstanbieter'><strong>Dependency Injection</strong></abbr> System.
FastAPI enthält ein extrem einfach zu verwendendes, aber extrem mächtiges <abbr title='auch bekannt als Komponenten, Resourcen, Dienste, Dienstanbieter'><strong>Dependency Injection</strong></abbr> System.
* Selbst Abhängigkeiten können Abhängigkeiten haben, woraus eine Hierarchie oder ein **„Graph“ von Abhängigkeiten** entsteht.
* Alles **automatisch gehandhabt** durch das Framework.
* Alle Abhängigkeiten können Daten von Anfragen anfordern und das Verhalten von **Pfadoperationen** und der automatisierten Dokumentation **modifizieren**.
* Alle Abhängigkeiten können Daten von Requests anfordern und das Verhalten von **Pfadoperationen** und der automatisierten Dokumentation **modifizieren**.
* **Automatische Validierung** selbst für solche Parameter von *Pfadoperationen*, welche in Abhängigkeiten definiert sind.
* Unterstützung für komplexe Authentifizierungssysteme, **Datenbankverbindungen**, usw.
* **Keine Kompromisse** bei Datenbanken, Frontends, usw., sondern einfache Integration mit allen.
### Unbegrenzte Erweiterungen
### Unbegrenzte Erweiterungen { #unlimited-plug-ins }
Oder mit anderen Worten, sie werden nicht benötigt. Importieren und nutzen Sie den Code, den Sie brauchen.
Jede Integration wurde so entworfen, dass sie so einfach zu nutzen ist (mit Abhängigkeiten), dass Sie eine Erweiterung für Ihre Anwendung mit nur zwei Zeilen Code erstellen können. Hierbei nutzen Sie die gleiche Struktur und Syntax, wie bei *Pfadoperationen*.
### Getestet
### Getestet { #tested }
* 100 % <abbr title="Der Prozentsatz an Code, der automatisch getestet wird">Testabdeckung</abbr>.
* 100 % <abbr title="Python-Typannotationen, mit denen Ihr Editor und andere exteren Werkezuge Sie besser unterstützen können">Typen annotiert</abbr>.
* 100 % <abbr title="Python-Typannotationen, mit denen Ihr Editor und andere externe Werkzeuge Sie besser unterstützen können">Typen annotiert</abbr>.
* Verwendet in Produktionsanwendungen.
## Starlette's Merkmale
## Starlette Merkmale { #starlette-features }
**FastAPI** ist vollkommen kompatibel (und basiert auf) <a href="https://www.starlette.io/" class="external-link" target="_blank"><strong>Starlette</strong></a>. Das bedeutet, wenn Sie eigenen Starlette Quellcode haben, funktioniert der.
**FastAPI** ist vollkommen kompatibel (und basiert auf) <a href="https://www.starlette.dev/" class="external-link" target="_blank"><strong>Starlette</strong></a>. Das bedeutet, wenn Sie eigenen Starlette Quellcode haben, funktioniert der.
`FastAPI` ist tatsächlich eine Unterklasse von `Starlette`. Wenn Sie also bereits Starlette kennen oder benutzen, das meiste funktioniert genau so.
@@ -170,31 +167,31 @@ Mit **FastAPI** bekommen Sie alles von **Starlette** (da FastAPI nur Starlette a
* Schwer beeindruckende Performanz. Es ist <a href="https://github.com/encode/starlette#performance" class="external-link" target="_blank">eines der schnellsten Python-Frameworks, auf Augenhöhe mit **NodeJS** und **Go**</a>.
* **WebSocket**-Unterstützung.
* Hintergrundaufgaben im selben Prozess.
* Ereignisse beim Starten und Herunterfahren.
* Testclient baut auf HTTPX auf.
* Hintergrundtasks im selben Prozess.
* Startup- und Shutdown-Events.
* Testclient basierend auf HTTPX.
* **CORS**, GZip, statische Dateien, Responses streamen.
* **Sitzungs- und Cookie**-Unterstützung.
* 100 % Testabdeckung.
* 100 % Typen annotierte Codebasis.
## Pydantic's Merkmale
## Pydantic Merkmale { #pydantic-features }
**FastAPI** ist vollkommen kompatibel (und basiert auf) <a href="https://docs.pydantic.dev/" class="external-link" target="_blank"><strong>Pydantic</strong></a>. Das bedeutet, wenn Sie eigenen Pydantic Quellcode haben, funktioniert der.
Inklusive externer Bibliotheken, die auf Pydantic basieren, wie <abbr title="Object-Relational Mapper (Abbildung von Objekten auf relationale Strukturen)">ORM</abbr>s, <abbr title="Object-Document Mapper (Abbildung von Objekten auf nicht-relationale Strukturen)">ODM</abbr>s für Datenbanken.
Inklusive externer Bibliotheken, die auf Pydantic basieren, wie <abbr title="Object-Relational Mapper Objektrelationaler Abbilder">ORM</abbr>s, <abbr title="Object-Document Mapper Objekt-Dokument-Abbilder">ODM</abbr>s für Datenbanken.
Daher können Sie in vielen Fällen das Objekt einer Anfrage **direkt zur Datenbank** schicken, weil alles automatisch validiert wird.
Daher können Sie in vielen Fällen das Objekt eines Requests **direkt zur Datenbank** schicken, weil alles automatisch validiert wird.
Das gleiche gilt auch für die andere Richtung: Sie können in vielen Fällen das Objekt aus der Datenbank **direkt zum Client** schicken.
Das gleiche gilt auch für die andere Richtung: Sie können in vielen Fällen das Objekt aus der Datenbank **direkt zum Client** senden.
Mit **FastAPI** bekommen Sie alle Funktionen von **Pydantic** (da FastAPI für die gesamte Datenverarbeitung Pydantic nutzt):
* **Kein Kopfzerbrechen**:
* Keine neue Schemadefinition-Mikrosprache zu lernen.
* Wenn Sie Pythons Typen kennen, wissen Sie, wie man Pydantic verwendet.
* Gutes Zusammenspiel mit Ihrer/Ihrem **<abbr title="Integrierten Entwicklungsumgebung, ähnlich zu (Quellcode-)Editor">IDE</abbr>/<abbr title="Ein Programm, was Fehler im Quellcode sucht">Linter</abbr>/Gehirn**:
* Weil Pydantics Datenstrukturen einfach nur Instanzen ihrer definierten Klassen sind; Autovervollständigung, Linting, mypy und ihre Intuition sollten alle einwandfrei mit ihren validierten Daten funktionieren.
* Gutes Zusammenspiel mit Ihrer/Ihrem **<abbr title="Integrated Development Environment Integrierte Entwicklungsumgebung: Ähnlich einem Code-Editor">IDE</abbr>/<abbr title="Ein Programm, das Fehler im Quellcode sucht">Linter</abbr>/Gehirn**:
* Weil Pydantics Datenstrukturen einfach nur Instanzen ihrer definierten Klassen sind; Autovervollständigung, Linting, mypy und Ihre Intuition sollten alle einwandfrei mit Ihren validierten Daten funktionieren.
* Validierung von **komplexen Strukturen**:
* Benutzung von hierarchischen Pydantic-Modellen, Python-`typing`s `List` und `Dict`, etc.
* Die Validierer erlauben es, komplexe Datenschemen klar und einfach zu definieren, überprüft und dokumentiert als JSON Schema.

View File

@@ -1,95 +1,96 @@
# FastAPI helfen Hilfe erhalten
# FastAPI helfen Hilfe erhalten { #help-fastapi-get-help }
Gefällt Ihnen **FastAPI**?
Mögen Sie **FastAPI**?
Möchten Sie FastAPI, anderen Benutzern und dem Autor helfen?
Oder möchten Sie Hilfe zu **FastAPI** erhalten?
Es gibt sehr einfache Möglichkeiten zu helfen (manche erfordern nur ein oder zwei Klicks).
Es gibt sehr einfache Möglichkeiten zu helfen (einige erfordern nur ein oder zwei Klicks).
Und es gibt auch viele Möglichkeiten, Hilfe zu bekommen.
Und es gibt auch mehrere Möglichkeiten, Hilfe zu bekommen.
## Newsletter abonnieren
## Newsletter abonnieren { #subscribe-to-the-newsletter }
Sie können den (unregelmäßig erscheinenden) [**FastAPI and Friends**-Newsletter](newsletter.md){.internal-link target=_blank} abonnieren, um auf dem Laufenden zu bleiben:
Sie können den (unregelmäßigen) [**FastAPI and friends**-Newsletter](newsletter.md){.internal-link target=_blank} abonnieren, um über folgende Themen informiert zu bleiben:
* Neuigkeiten über FastAPI and Friends 🚀
* Neuigkeiten über FastAPI und Freunde 🚀
* Anleitungen 📝
* Funktionen ✨
* Breaking Changes 🚨
* Tipps und Tricks ✅
## FastAPI auf Twitter folgen
<a href="https://twitter.com/fastapi" class="external-link" target="_blank">Folgen Sie @fastapi auf **Twitter**</a>, um die neuesten Nachrichten über **FastAPI** zu erhalten. 🐦
## FastAPI auf X (Twitter) folgen { #follow-fastapi-on-x-twitter }
## **FastAPI** auf GitHub einen Stern geben
<a href="https://x.com/fastapi" class="external-link" target="_blank">Folgen Sie @fastapi auf **X (Twitter)**</a>, um die neuesten Nachrichten über **FastAPI** zu erhalten. 🐦
Sie können FastAPI auf GitHub „starren“ (durch Klicken auf den Stern-Button oben rechts): <a href="https://github.com/tiangolo/fastapi" class="external-link" target="_blank">https://github.com/tiangolo/fastapi</a>. ⭐️
## **FastAPI** auf GitHub einen Stern geben { #star-fastapi-in-github }
Sie können FastAPI auf GitHub „starren“ (klicken Sie auf den Stern-Button oben rechts): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. ⭐️
Durch das Hinzufügen eines Sterns können andere Benutzer es leichter finden und sehen, dass es für andere bereits nützlich war.
## Das GitHub-Repository auf Releases beobachten
## Das GitHub-Repository auf Releases überwachen { #watch-the-github-repository-for-releases }
Sie können FastAPI in GitHub beobachten (Klicken Sie oben rechts auf den Button „watch“): <a href="https://github.com/tiangolo/fastapi" class="external-link" target="_blank">https://github.com/tiangolo/fastapi</a>. 👀
Sie können FastAPI auf GitHub beobachten (klicken Sie auf den „watch“-Button oben rechts): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. 👀
Dort können Sie „Releases only“ auswählen.
Auf diese Weise erhalten Sie Benachrichtigungen (per E-Mail), wenn es einen neuen Release (eine neue Version) von **FastAPI** mit Fehlerbehebungen und neuen Funktionen gibt.
Auf diese Weise erhalten Sie Benachrichtigungen (per E-Mail), wenn es ein neues Release (eine neue Version) von **FastAPI** mit Bugfixes und neuen Funktionen gibt.
## Mit dem Autor vernetzen
## Mit dem Autor vernetzen { #connect-with-the-author }
Sie können sich mit <a href="https://tiangolo.com" class="external-link" target="_blank">mir (Sebastián Ramírez / `tiangolo`)</a>, dem Autor, verbinden.
Sie können sich mit <a href="https://tiangolo.com" class="external-link" target="_blank">mir (Sebastián Ramírez / `tiangolo`)</a>, dem Autor, vernetzen.
Insbesondere:
Sie können:
* <a href="https://github.com/tiangolo" class="external-link" target="_blank"> Folgen Sie mir auf **GitHub**</a>.
* Finden Sie andere Open-Source-Projekte, die ich erstellt habe und die Ihnen helfen könnten.
* Folgen Sie mir, um mitzubekommen, wenn ich ein neues Open-Source-Projekt erstelle.
* <a href="https://twitter.com/tiangolo" class="external-link" target="_blank">Folgen Sie mir auf **Twitter**</a> oder <a href="https://fosstodon.org/@tiangolo" class="external-link" target="_blank">Mastodon</a>.
* Berichten Sie mir, wie Sie FastAPI verwenden (das höre ich gerne).
* Bekommen Sie mit, wenn ich Ankündigungen mache oder neue Tools veröffentliche.
* Sie können auch <a href="https://twitter.com/fastapi" class="external-link" target="_blank">@fastapi auf Twitter folgen</a> (ein separates Konto).
* <a href="https://www.linkedin.com/in/tiangolo/" class="external-link" target="_blank">Folgen Sie mir auf **LinkedIn**</a>.
* Bekommen Sie mit, wenn ich Ankündigungen mache oder neue Tools veröffentliche (obwohl ich Twitter häufiger verwende 🤷‍♂).
* Lesen Sie, was ich schreibe (oder folgen Sie mir) auf <a href="https://dev.to/tiangolo" class="external-link" target="_blank">**Dev.to**</a> oder <a href="https://medium.com/@tiangolo" class="external-link" target="_blank">**Medium**</a>.
* Lesen Sie andere Ideen, Artikel, und erfahren Sie mehr über die von mir erstellten Tools.
* Folgen Sie mir, um zu lesen, wenn ich etwas Neues veröffentliche.
* <a href="https://github.com/tiangolo" class="external-link" target="_blank">Mir auf **GitHub** folgen</a>.
* Andere Open-Source-Projekte sehen, die ich erstellt habe und die Ihnen helfen könnten.
* Mir folgen, um zu sehen, wenn ich ein neues Open-Source-Projekt erstelle.
* <a href="https://x.com/tiangolo" class="external-link" target="_blank">Mir auf **X (Twitter)** folgen</a> oder <a href="https://fosstodon.org/@tiangolo" class="external-link" target="_blank">Mastodon</a>.
* Mir mitteilen, wie Sie FastAPI verwenden (ich höre das gerne).
* Mitbekommen, wenn ich Ankündigungen mache oder neue Tools veröffentliche.
* Sie können auch <a href="https://x.com/fastapi" class="external-link" target="_blank">@fastapi auf X (Twitter) folgen</a> (ein separates Konto).
* <a href="https://www.linkedin.com/in/tiangolo/" class="external-link" target="_blank">Mir auf **LinkedIn** folgen</a>.
* Mitbekommen, wenn ich Ankündigungen mache oder neue Tools veröffentliche (obwohl ich X (Twitter) häufiger verwende 🤷‍♂).
* Lesen, was ich schreibe (oder mir folgen) auf <a href="https://dev.to/tiangolo" class="external-link" target="_blank">**Dev.to**</a> oder <a href="https://medium.com/@tiangolo" class="external-link" target="_blank">**Medium**</a>.
* Andere Ideen, Artikel lesen und mehr über die von mir erstellten Tools erfahren.
* Mir folgen, um zu lesen, wenn ich etwas Neues veröffentliche.
## Über **FastAPI** tweeten
## Über **FastAPI** tweeten { #tweet-about-fastapi }
<a href="https://twitter.com/compose/tweet?text=Ich liebe @fastapi, weil ... https://github.com/tiangolo/fastapi" class="external-link" target= "_blank">Tweeten Sie über **FastAPI**</a> und teilen Sie mir und anderen mit, warum es Ihnen gefällt. 🎉
<a href="https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi" class="external-link" target="_blank">Tweeten Sie über **FastAPI**</a> und teilen Sie mir und anderen mit, warum es Ihnen gefällt. 🎉
Ich höre gerne, wie **FastAPI** verwendet wird, was Ihnen daran gefallen hat, in welchem Projekt/Unternehmen Sie es verwenden, usw.
## Für FastAPI abstimmen
## Für FastAPI abstimmen { #vote-for-fastapi }
* <a href="https://www.slant.co/options/34241/~fastapi-review" class="external-link" target="_blank">Stimmen Sie für **FastAPI** auf Slant</a >.
* <a href="https://www.slant.co/options/34241/~fastapi-review" class="external-link" target="_blank">Stimmen Sie für **FastAPI** auf Slant</a>.
* <a href="https://alternativeto.net/software/fastapi/about/" class="external-link" target="_blank">Stimmen Sie für **FastAPI** auf AlternativeTo</a>.
* <a href="https://stackshare.io/pypi-fastapi" class="external-link" target="_blank">Berichten Sie auf StackShare, dass Sie **FastAPI** verwenden</a>.
* <a href="https://stackshare.io/pypi-fastapi" class="external-link" target="_blank">Sagen Sie auf StackShare, dass Sie **FastAPI** verwenden</a>.
## Anderen bei Fragen auf GitHub helfen
## Anderen bei Fragen auf GitHub helfen { #help-others-with-questions-in-github }
Sie können versuchen, anderen bei ihren Fragen zu helfen:
* <a href="https://github.com/tiangolo/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered" class="external-link" target="_blank">GitHub-Diskussionen</a>
* <a href="https://github.com/tiangolo/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+" class="external-link" target="_blank">GitHub-Issues</a>
* <a href="https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered" class="external-link" target="_blank">GitHub-Diskussionen</a>
* <a href="https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+" class="external-link" target="_blank">GitHub-Issues</a>
In vielen Fällen kennen Sie möglicherweise bereits die Antwort auf diese Fragen. 🤓
Wenn Sie vielen Menschen bei ihren Fragen helfen, werden Sie offizieller [FastAPI-Experte](fastapi-people.md#experten){.internal-link target=_blank}. 🎉
Wenn Sie vielen Menschen bei ihren Fragen helfen, werden Sie offizieller [FastAPI-Experte](fastapi-people.md#fastapi-experts){.internal-link target=_blank}. 🎉
Denken Sie aber daran, der wichtigste Punkt ist: Versuchen Sie, freundlich zu sein. Die Leute bringen ihre Frustrationen mit und fragen in vielen Fällen nicht auf die beste Art und Weise, aber versuchen Sie dennoch so gut wie möglich, freundlich zu sein. 🤗
Denken Sie daran, der wichtigste Punkt ist: Versuchen Sie, freundlich zu sein. Die Leute bringen ihre Frustrationen mit und fragen in vielen Fällen nicht auf die beste Art und Weise, aber versuchen Sie dennoch so gut wie möglich, freundlich zu sein. 🤗
Die **FastAPI**-Community soll freundlich und einladend sein. Und auch kein Mobbing oder respektloses Verhalten gegenüber anderen akzeptieren. Wir müssen uns umeinander kümmern.
Die **FastAPI**-Community soll freundlich und einladend sein. Akzeptieren Sie gleichzeitig kein Mobbing oder respektloses Verhalten gegenüber anderen. Wir müssen uns umeinander kümmern.
---
So helfen Sie anderen bei Fragen (in Diskussionen oder Problemen):
So helfen Sie anderen bei Fragen (in Diskussionen oder Issues):
### Die Frage verstehen
### Die Frage verstehen { #understand-the-question }
* Fragen Sie sich, ob Sie verstehen, was das **Ziel** und der Anwendungsfall der fragenden Person ist.
* Prüfen Sie, ob Sie verstehen können, was der **Zweck** und der Anwendungsfall der fragenden Person ist.
* Überprüfen Sie dann, ob die Frage (die überwiegende Mehrheit sind Fragen) **klar** ist.
@@ -97,23 +98,23 @@ So helfen Sie anderen bei Fragen (in Diskussionen oder Problemen):
* Wenn Sie die Frage nicht verstehen können, fragen Sie nach weiteren **Details**.
### Das Problem reproduzieren
### Das Problem reproduzieren { #reproduce-the-problem }
In den meisten Fällen und bei den meisten Fragen ist etwas mit dem von der Person erstellten **eigenen Quellcode** los.
In den meisten Fällen und bei den meisten Fragen gibt es etwas in Bezug auf den **originalen Code** der Person.
In vielen Fällen wird nur ein Fragment des Codes gepostet, aber das reicht nicht aus, um **das Problem zu reproduzieren**.
* Sie können die Person darum bitten, ein <a href="https://stackoverflow.com/help/minimal-reproducible-example" class="external-link" target="_blank">minimales, reproduzierbares Beispiel</a> bereitzustellen, welches Sie **kopieren, einfügen** und lokal ausführen können, um den gleichen Fehler oder das gleiche Verhalten zu sehen, das die Person sieht, oder um ihren Anwendungsfall besser zu verstehen.
* Sie können die Person bitten, ein <a href="https://stackoverflow.com/help/minimal-reproducible-example" class="external-link" target="_blank">minimales, reproduzierbares Beispiel</a> bereitzustellen, welches Sie **kopieren, einfügen** und lokal ausführen können, um den gleichen Fehler oder das gleiche Verhalten zu sehen, das die Person sieht, oder um ihren Anwendungsfall besser zu verstehen.
* Wenn Sie in Geberlaune sind, können Sie versuchen, selbst ein solches Beispiel zu erstellen, nur basierend auf der Beschreibung des Problems. Denken Sie jedoch daran, dass dies viel Zeit in Anspruch nehmen kann und dass es besser sein kann, zunächst um eine Klärung des Problems zu bitten.
* Wenn Sie in Geberlaune sind, können Sie ein solches Beispiel selbst erstellen, nur basierend auf der Beschreibung des Problems. Denken Sie jedoch daran, dass dies viel Zeit in Anspruch nehmen kann und dass es besser sein kann, zunächst um eine Klärung des Problems zu bitten.
### Lösungen vorschlagen
### Lösungen vorschlagen { #suggest-solutions }
* Nachdem Sie die Frage verstanden haben, können Sie eine mögliche **Antwort** geben.
* In vielen Fällen ist es besser, das **zugrunde liegende Problem oder den Anwendungsfall** zu verstehen, da es möglicherweise einen besseren Weg zur Lösung gibt als das, was die Person versucht.
### Um Schließung bitten
### Um Schließung bitten { #ask-to-close }
Wenn die Person antwortet, besteht eine hohe Chance, dass Sie ihr Problem gelöst haben. Herzlichen Glückwunsch, **Sie sind ein Held**! 🦸
@@ -122,26 +123,26 @@ Wenn die Person antwortet, besteht eine hohe Chance, dass Sie ihr Problem gelös
* In GitHub-Diskussionen: den Kommentar als **Antwort** zu markieren.
* In GitHub-Issues: Das Issue zu **schließen**.
## Das GitHub-Repository beobachten
## Das GitHub-Repository beobachten { #watch-the-github-repository }
Sie können FastAPI auf GitHub „beobachten“ (Klicken Sie oben rechts auf die Schaltfläche „watch“): <a href="https://github.com/tiangolo/fastapi" class="external-link" target="_blank" >https://github.com/tiangolo/fastapi</a>. 👀
Sie können FastAPI auf GitHub „beobachten“ (klicken Sie auf den „watch“-Button oben rechts): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. 👀
Wenn Sie dann „Watching“ statt „Releases only“ auswählen, erhalten Sie Benachrichtigungen, wenn jemand ein neues Issue eröffnet oder eine neue Frage stellt. Sie können auch spezifizieren, dass Sie nur über neue Issues, Diskussionen, PRs, usw. benachrichtigt werden möchten.
Wenn Sie dann „Watching“ statt „Releases only“ auswählen, erhalten Sie Benachrichtigungen, wenn jemand ein neues Issue eröffnet oder eine neue Frage stellt. Sie können auch spezifizieren, dass Sie nur über neue Issues, Diskussionen, PRs usw. benachrichtigt werden möchten.
Dann können Sie versuchen, bei der Lösung solcher Fragen zu helfen.
## Fragen stellen
## Fragen stellen { #ask-questions }
Sie können im GitHub-Repository <a href="https://github.com/tiangolo/fastapi/discussions/new?category=questions" class="external-link" target="_blank">eine neue Frage erstellen</a>, zum Beispiel:
Sie können im GitHub-Repository <a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">eine neue Frage erstellen</a>, zum Beispiel:
* Stellen Sie eine **Frage** oder bitten Sie um Hilfe mit einem **Problem**.
* Schlagen Sie eine neue **Funktionalität** vor.
**Hinweis**: Wenn Sie das tun, bitte ich Sie, auch anderen zu helfen. 😉
## Pull Requests prüfen
## Pull Requests prüfen { #review-pull-requests }
Sie können mir helfen, Pull Requests von anderen zu überprüfen (Review).
Sie können mir helfen, Pull Requests von anderen zu überprüfen.
Noch einmal, bitte versuchen Sie Ihr Bestes, freundlich zu sein. 🤗
@@ -149,113 +150,106 @@ Noch einmal, bitte versuchen Sie Ihr Bestes, freundlich zu sein. 🤗
Hier ist, was Sie beachten sollten und wie Sie einen Pull Request überprüfen:
### Das Problem verstehen
### Das Problem verstehen { #understand-the-problem }
* Stellen Sie zunächst sicher, dass Sie **das Problem verstehen**, welches der Pull Request zu lösen versucht. Möglicherweise gibt es eine längere Diskussion dazu in einer GitHub-Diskussion oder einem GitHub-Issue.
* Es besteht auch eine gute Chance, dass der Pull Request nicht wirklich benötigt wird, da das Problem auf **andere Weise** gelöst werden kann. Dann können Sie das vorschlagen oder danach fragen.
### Der Stil ist nicht so wichtig
### Keine Panik wegen des Stils { #dont-worry-about-style }
* Machen Sie sich nicht zu viele Gedanken über Dinge wie den Stil von Commit-Nachrichten, ich werde den Commit manuell zusammenführen und anpassen.
* Machen Sie sich keine Sorgen über Dinge wie den Stil von Commit-Nachrichten. Ich werde den Commit zusammenführen und manuell anpassen.
* Machen Sie sich auch keine Sorgen über Stilregeln, es gibt bereits automatisierte Tools, die das überprüfen.
* Außerdem, keine Sorgen über Stilregeln, es gibt bereits automatisierte Tools, die das überprüfen.
Und wenn es irgendeinen anderen Stil- oder Konsistenz-Bedarf gibt, bitte ich direkt darum oder füge zusätzliche Commits mit den erforderlichen Änderungen hinzu.
Und wenn es irgendeinen anderen Stil- oder Konsistenzbedarf gibt, werde ich direkt danach fragen oder zusätzliche Commits mit den erforderlichen Änderungen hinzufügen.
### Den Code überprüfen
### Den Code testen { #check-the-code }
* Prüfen und lesen Sie den Code, fragen Sie sich, ob er Sinn macht, **führen Sie ihn lokal aus** und testen Sie, ob er das Problem tatsächlich löst.
* Schreiben Sie dann einen **Kommentar** und berichten, dass Sie das getan haben. So weiß ich, dass Sie ihn wirklich überprüft haben.
!!! info
Leider kann ich PRs, nur weil sie von Mehreren gutgeheißen wurden, nicht einfach vertrauen.
/// info | Info
Es ist mehrmals passiert, dass es PRs mit drei, fünf oder mehr Zustimmungen gibt, wahrscheinlich weil die Beschreibung ansprechend ist, aber wenn ich die PRs überprüfe, sind sie tatsächlich fehlerhaft, haben einen Bug, oder lösen das Problem nicht, welches sie behaupten, zu lösen. 😅
Leider kann ich PRs, nur weil sie von mehreren gutgeheißen wurden, nicht einfach vertrauen.
Daher ist es wirklich wichtig, dass Sie den Code tatsächlich lesen und ausführen und mir in den Kommentaren mitteilen, dass Sie dies getan haben. 🤓
Es ist mehrmals passiert, dass es PRs mit drei, fünf oder mehr Zustimmungen gibt, wahrscheinlich weil die Beschreibung ansprechend ist, aber wenn ich die PRs überprüfe, sind sie tatsächlich fehlerhaft, haben einen Bug, oder lösen das Problem nicht, welches sie behaupten, zu lösen. 😅
* Wenn der PR irgendwie vereinfacht werden kann, fragen Sie ruhig danach, aber seien Sie nicht zu wählerisch, es gibt viele subjektive Standpunkte (und ich habe auch meinen eigenen 🙈), also ist es besser, wenn man sich auf die wesentlichen Dinge konzentriert.
Daher ist es wirklich wichtig, dass Sie den Code wirklich lesen und ausführen und mir in den Kommentaren mitteilen, dass Sie dies getan haben. 🤓
### Tests
///
* Wenn der PR in irgendeiner Weise vereinfacht werden kann, können Sie danach fragen, aber es gibt keinen Grund, zu wählerisch zu sein. Es gibt viele subjektive Standpunkte (und ich habe auch meinen eigenen 🙈), also ist es besser, wenn man sich auf die grundlegenden Dinge konzentriert.
### Tests { #tests }
* Helfen Sie mir zu überprüfen, dass der PR **Tests** hat.
* Überprüfen Sie, dass diese Tests vor dem PR **fehlschlagen**. 🚨
* Überprüfen Sie, dass diese Tests nach dem PR **bestanden** werden. ✅
* Überprüfen Sie dann, dass diese Tests nach dem PR **bestanden** werden. ✅
* Viele PRs haben keine Tests. Sie können den Autor daran **erinnern**, Tests hinzuzufügen, oder Sie können sogar selbst einige Tests **vorschlagen**. Das ist eines der Dinge, die die meiste Zeit in Anspruch nehmen, und dabei können Sie viel helfen.
* Viele PRs haben keine Tests. Sie können den Autor daran **erinnern**, Tests hinzuzufügen, oder Sie können sogar selbst einige Tests **vorschlagen**. Das ist eines der Dinge, die am meisten Zeit in Anspruch nehmen, und Sie können dabei viel helfen.
* Kommentieren Sie auch hier anschließend, was Sie versucht haben, sodass ich weiß, dass Sie es überprüft haben. 🤓
## Einen Pull Request erstellen
## Einen Pull Request erstellen { #create-a-pull-request }
Sie können zum Quellcode mit Pull Requests [beitragen](contributing.md){.internal-link target=_blank}, zum Beispiel:
Sie können [zum Quellcode mit Pull Requests beitragen](contributing.md){.internal-link target=_blank}, zum Beispiel:
* Um einen Tippfehler zu beheben, den Sie in der Dokumentation gefunden haben.
* Um einen Artikel, ein Video oder einen Podcast über FastAPI zu teilen, den Sie erstellt oder gefunden haben, indem Sie <a href="https://github.com/tiangolo/fastapi/edit/master/docs/en/data/external_links.yml" class="external-link" target="_blank">diese Datei bearbeiten</a>.
* Um einen Artikel, ein Video oder einen Podcast über FastAPI zu teilen, den Sie erstellt oder gefunden haben, indem Sie <a href="https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml" class="external-link" target="_blank">diese Datei bearbeiten</a>.
* Stellen Sie sicher, dass Sie Ihren Link am Anfang des entsprechenden Abschnitts einfügen.
* Um zu helfen, [die Dokumentation in Ihre Sprache zu übersetzen](contributing.md#ubersetzungen){.internal-link target=_blank}.
* Um zu helfen, [die Dokumentation in Ihre Sprache zu übersetzen](contributing.md#translations){.internal-link target=_blank}.
* Sie können auch dabei helfen, die von anderen erstellten Übersetzungen zu überprüfen (Review).
* Um neue Dokumentationsabschnitte vorzuschlagen.
* Um ein bestehendes Problem / einen bestehenden Bug zu beheben.
* Um ein bestehendes Problem/Bug zu beheben.
* Stellen Sie sicher, dass Sie Tests hinzufügen.
* Um eine neue Funktionalität hinzuzufügen.
* Stellen Sie sicher, dass Sie Tests hinzufügen.
* Stellen Sie sicher, dass Sie Dokumentation hinzufügen, falls das notwendig ist.
## FastAPI pflegen
## FastAPI pflegen { #help-maintain-fastapi }
Helfen Sie mir, **FastAPI** instand zu halten! 🤓
Helfen Sie mir, **FastAPI** zu pflegen! 🤓
Es gibt viel zu tun, und das meiste davon können **SIE** tun.
Die Hauptaufgaben, die Sie jetzt erledigen können, sind:
* [Helfen Sie anderen bei Fragen auf GitHub](#anderen-bei-fragen-auf-github-helfen){.internal-link target=_blank} (siehe Abschnitt oben).
* [Prüfen Sie Pull Requests](#pull-requests-prufen){.internal-link target=_blank} (siehe Abschnitt oben).
* [Anderen bei Fragen auf GitHub helfen](#help-others-with-questions-in-github){.internal-link target=_blank} (siehe Abschnitt oben).
* [Pull Requests prüfen](#review-pull-requests){.internal-link target=_blank} (siehe Abschnitt oben).
Diese beiden Dinge sind es, die **die meiste Zeit in Anspruch nehmen**. Das ist die Hauptarbeit bei der Wartung von FastAPI.
Diese beiden Aufgaben sind die Dinge, die **am meisten Zeit verbrauchen**. Das ist die Hauptarbeit bei der Wartung von FastAPI.
Wenn Sie mir dabei helfen können, **helfen Sie mir, FastAPI am Laufen zu erhalten** und sorgen dafür, dass es weiterhin **schneller und besser voranschreitet**. 🚀
Wenn Sie mir dabei helfen können, **helfen Sie mir, FastAPI zu pflegen** und Sie stellen sicher, dass es weiterhin **schneller und besser voranschreitet**. 🚀
## Beim Chat mitmachen
## Am Chat teilnehmen { #join-the-chat }
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"
Wenn Sie Fragen haben, stellen Sie sie bei <a href="https://github.com/tiangolo/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.
/// tip | Tipp
Nutzen Sie den Chat nur für andere allgemeine Gespräche.
Bei Fragen stellen Sie sie in <a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">GitHub-Diskussionen</a>, dort besteht eine viel größere Chance, dass Sie Hilfe von den [FastAPI-Experten](fastapi-people.md#fastapi-experts){.internal-link target=_blank} erhalten.
### Den Chat nicht für Fragen verwenden
Nutzen Sie den Chat nur für andere allgemeine Gespräche.
Bedenken Sie, da Chats mehr „freie Konversation“ ermöglichen, dass es verlockend ist, Fragen zu stellen, die zu allgemein und schwierig zu beantworten sind, sodass Sie möglicherweise keine Antworten erhalten.
///
Auf GitHub hilft Ihnen die Vorlage dabei, die richtige Frage zu schreiben, sodass Sie leichter eine gute Antwort erhalten oder das Problem sogar selbst lösen können, noch bevor Sie fragen. Und auf GitHub kann ich sicherstellen, dass ich immer alles beantworte, auch wenn es einige Zeit dauert. Ich persönlich kann das mit den Chat-Systemen nicht machen. 😅
### Den Chat nicht für Fragen verwenden { #dont-use-the-chat-for-questions }
Unterhaltungen in den Chat-Systemen sind außerdem nicht so leicht durchsuchbar wie auf GitHub, sodass Fragen und Antworten möglicherweise im Gespräch verloren gehen. Und nur die auf GitHub machen einen [FastAPI-Experten](fastapi-people.md#experten){.internal-link target=_blank}, Sie werden also höchstwahrscheinlich mehr Aufmerksamkeit auf GitHub erhalten.
Bedenken Sie, dass Sie in Chats, die „freie Konversation“ erlauben, leicht Fragen stellen können, die zu allgemein und schwer zu beantworten sind, sodass Sie möglicherweise keine Antworten erhalten.
Auf GitHub hilft Ihnen die Vorlage dabei, die richtige Frage zu stellen, sodass Sie leichter eine gute Antwort erhalten können, oder sogar das Problem selbst lösen, bevor Sie überhaupt fragen. Und auf GitHub kann ich sicherstellen, dass ich immer alles beantworte, auch wenn es einige Zeit dauert. Persönlich kann ich das mit den Chat-Systemen nicht machen. 😅
Unterhaltungen in den Chat-Systemen sind auch nicht so leicht durchsuchbar wie auf GitHub, sodass Fragen und Antworten möglicherweise im Gespräch verloren gehen. Und nur die auf GitHub machen einen [FastAPI-Experten](fastapi-people.md#fastapi-experts){.internal-link target=_blank}, Sie werden also höchstwahrscheinlich mehr Aufmerksamkeit auf GitHub erhalten.
Auf der anderen Seite gibt es Tausende von Benutzern in den Chat-Systemen, sodass die Wahrscheinlichkeit hoch ist, dass Sie dort fast immer jemanden zum Reden finden. 😄
## Den Autor sponsern
## Den Autor sponsern { #sponsor-the-author }
Sie können den Autor (mich) auch über <a href="https://github.com/sponsors/tiangolo" class="external-link" target="_blank">GitHub-Sponsoren</a> finanziell unterstützen.
Dort könnten Sie mir als Dankeschön einen Kaffee spendieren ☕️. 😄
Und Sie können auch Silber- oder Gold-Sponsor für FastAPI werden. 🏅🎉
## Die Tools sponsern, die FastAPI unterstützen
Wie Sie in der Dokumentation gesehen haben, steht FastAPI auf den Schultern von Giganten, Starlette und Pydantic.
Sie können auch sponsern:
* <a href="https://github.com/sponsors/samuelcolvin" class="external-link" target="_blank">Samuel Colvin (Pydantic)</a>
* <a href="https://github.com/sponsors/encode" class="external-link" target="_blank">Encode (Starlette, Uvicorn)</a>
Wenn Ihr **Produkt/Firma** auf **FastAPI** angewiesen ist oder in Zusammenhang steht und Sie seine Benutzer erreichen möchten, können Sie den Autor (mich) über <a href="https://github.com/sponsors/tiangolo" class="external-link" target="_blank">GitHub-Sponsoren</a> unterstützen. Je nach Stufe können Sie einige zusätzliche Vorteile erhalten, wie z. B. ein Abzeichen in der Dokumentation. 🎁
---

View File

@@ -1,3 +0,0 @@
# Hilfe
Helfen und Hilfe erhalten, beitragen, mitmachen. 🤝

View File

@@ -1,12 +1,12 @@
# Geschichte, Design und Zukunft
# Geschichte, Design und Zukunft { #history-design-and-future }
Vor einiger Zeit fragte <a href="https://github.com/tiangolo/fastapi/issues/3#issuecomment-454956920" class="external-link" target="_blank">ein **FastAPI**-Benutzer</a>:
Vor einiger Zeit fragte <a href="https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920" class="external-link" target="_blank">ein **FastAPI**-Benutzer</a>:
> Was ist die Geschichte dieses Projekts? Es scheint, als wäre es in ein paar Wochen aus dem Nichts zu etwas Großartigem geworden [...]
> Was ist die Geschichte dieses Projekts? Es scheint aus dem Nichts in ein paar Wochen zu etwas Großartigem geworden zu sein [...]
Hier ist ein wenig über diese Geschichte.
## Alternativen
## Alternativen { #alternatives }
Ich habe seit mehreren Jahren APIs mit komplexen Anforderungen (maschinelles Lernen, verteilte Systeme, asynchrone Jobs, NoSQL-Datenbanken, usw.) erstellt und leitete mehrere Entwicklerteams.
@@ -28,7 +28,7 @@ Aber irgendwann gab es keine andere Möglichkeit, als etwas zu schaffen, das all
</blockquote>
## Investigation
## Untersuchung { #investigation }
Durch die Nutzung all dieser vorherigen Alternativen hatte ich die Möglichkeit, von allen zu lernen, Ideen aufzunehmen und sie auf die beste Weise zu kombinieren, die ich für mich und die Entwicklerteams, mit denen ich zusammengearbeitet habe, finden konnte.
@@ -38,13 +38,13 @@ Der beste Ansatz bestand außerdem darin, bereits bestehende Standards zu nutzen
Bevor ich also überhaupt angefangen habe, **FastAPI** zu schreiben, habe ich mehrere Monate damit verbracht, die Spezifikationen für OpenAPI, JSON Schema, OAuth2, usw. zu studieren und deren Beziehungen, Überschneidungen und Unterschiede zu verstehen.
## Design
## Design { #design }
Dann habe ich einige Zeit damit verbracht, die Entwickler-„API“ zu entwerfen, die ich als Benutzer haben wollte (als Entwickler, welcher FastAPI verwendet).
Ich habe mehrere Ideen in den beliebtesten Python-Editoren getestet: PyCharm, VS Code, Jedi-basierte Editoren.
Laut der letzten <a href="https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools" class="external-link" target="_blank">Python-Entwickler-Umfrage</a>, deckt das etwa 80 % der Benutzer ab.
Laut der letzten <a href="https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools" class="external-link" target="_blank">Python-Entwickler-Umfrage</a> deckt das etwa 80 % der Benutzer ab.
Das bedeutet, dass **FastAPI** speziell mit den Editoren getestet wurde, die von 80 % der Python-Entwickler verwendet werden. Und da die meisten anderen Editoren in der Regel ähnlich funktionieren, sollten alle diese Vorteile für praktisch alle Editoren funktionieren.
@@ -52,19 +52,19 @@ Auf diese Weise konnte ich die besten Möglichkeiten finden, die Codeverdoppelun
Alles auf eine Weise, die allen Entwicklern das beste Entwicklungserlebnis bot.
## Anforderungen
## Anforderungen { #requirements }
Nachdem ich mehrere Alternativen getestet hatte, entschied ich, dass ich <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">**Pydantic**</a> wegen seiner Vorteile verwenden würde.
Nachdem ich mehrere Alternativen getestet hatte, entschied ich, dass ich <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">**Pydantic**</a> wegen seiner Vorteile verwenden würde.
Dann habe ich zu dessen Code beigetragen, um es vollständig mit JSON Schema kompatibel zu machen, und so verschiedene Möglichkeiten zum Definieren von einschränkenden Deklarationen (Constraints) zu unterstützen, und die Editorunterstützung (Typprüfungen, Codevervollständigung) zu verbessern, basierend auf den Tests in mehreren Editoren.
Während der Entwicklung habe ich auch zu <a href="https://www.starlette.io/" class="external-link" target="_blank">**Starlette**</a> beigetragen, der anderen Schlüsselanforderung.
Während der Entwicklung habe ich auch zu <a href="https://www.starlette.dev/" class="external-link" target="_blank">**Starlette**</a> beigetragen, der anderen Schlüsselanforderung.
## Entwicklung
## Entwicklung { #development }
Als ich mit der Erstellung von **FastAPI** selbst begann, waren die meisten Teile bereits vorhanden, das Design definiert, die Anforderungen und Tools bereit und das Wissen über die Standards und Spezifikationen klar und frisch.
## Zukunft
## Zukunft { #future }
Zu diesem Zeitpunkt ist bereits klar, dass **FastAPI** mit seinen Ideen für viele Menschen nützlich ist.

View File

@@ -0,0 +1,17 @@
# Alte 403-Authentifizierungsfehler-Statuscodes verwenden { #use-old-403-authentication-error-status-codes }
Vor FastAPI-Version `0.122.0` verwendeten die integrierten Sicherheits-Utilities den HTTP-Statuscode `403 Forbidden`, wenn sie dem Client nach einer fehlgeschlagenen Authentifizierung einen Fehler zurückgaben.
Ab FastAPI-Version `0.122.0` verwenden sie den passenderen HTTP-Statuscode `401 Unauthorized` und geben in der Response einen sinnvollen `WWW-Authenticate`-Header zurück, gemäß den HTTP-Spezifikationen, <a href="https://datatracker.ietf.org/doc/html/rfc7235#section-3.1" class="external-link" target="_blank">RFC 7235</a>, <a href="https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized" class="external-link" target="_blank">RFC 9110</a>.
Aber falls Ihre Clients aus irgendeinem Grund vom alten Verhalten abhängen, können Sie darauf zurückgreifen, indem Sie in Ihren Sicherheitsklassen die Methode `make_not_authenticated_error` überschreiben.
Sie können beispielsweise eine Unterklasse von `HTTPBearer` erstellen, die einen Fehler `403 Forbidden` zurückgibt, statt des Default-`401 Unauthorized`-Fehlers:
{* ../../docs_src/authentication_error_status_code/tutorial001_an_py39.py hl[9:13] *}
/// tip | Tipp
Beachten Sie, dass die Funktion die Exception-Instanz zurückgibt; sie wirft sie nicht. Das Werfen erfolgt im restlichen internen Code.
///

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