diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml
index a5761361d..b3e53b91c 100644
--- a/.github/workflows/build-docs.yml
+++ b/.github/workflows/build-docs.yml
@@ -54,7 +54,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v6
+ uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
@@ -96,7 +96,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v6
+ uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml
index ee8bfafb4..7d5449c6a 100644
--- a/.github/workflows/contributors.yml
+++ b/.github/workflows/contributors.yml
@@ -30,7 +30,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v6
+ uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml
index 2c432da8c..0eb26cc4d 100644
--- a/.github/workflows/deploy-docs.yml
+++ b/.github/workflows/deploy-docs.yml
@@ -29,7 +29,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v6
+ uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/issue-manager.yml b/.github/workflows/issue-manager.yml
index 6a7e6143e..b587d15e6 100644
--- a/.github/workflows/issue-manager.yml
+++ b/.github/workflows/issue-manager.yml
@@ -27,7 +27,7 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- - uses: tiangolo/issue-manager@0.5.1
+ - uses: tiangolo/issue-manager@0.6.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
config: >
diff --git a/.github/workflows/label-approved.yml b/.github/workflows/label-approved.yml
index 76ac77298..e6ae3d963 100644
--- a/.github/workflows/label-approved.yml
+++ b/.github/workflows/label-approved.yml
@@ -26,7 +26,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v6
+ uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/notify-translations.yml b/.github/workflows/notify-translations.yml
index ef3990d31..04beeb64e 100644
--- a/.github/workflows/notify-translations.yml
+++ b/.github/workflows/notify-translations.yml
@@ -34,7 +34,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v6
+ uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/people.yml b/.github/workflows/people.yml
index e6e56bf04..f15b92137 100644
--- a/.github/workflows/people.yml
+++ b/.github/workflows/people.yml
@@ -30,7 +30,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v6
+ uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/smokeshow.yml b/.github/workflows/smokeshow.yml
index cde0ca308..e42d79723 100644
--- a/.github/workflows/smokeshow.yml
+++ b/.github/workflows/smokeshow.yml
@@ -26,7 +26,7 @@ jobs:
with:
python-version: '3.9'
- name: Setup uv
- uses: astral-sh/setup-uv@v6
+ uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/sponsors.yml b/.github/workflows/sponsors.yml
index 1e245346d..7d29469a5 100644
--- a/.github/workflows/sponsors.yml
+++ b/.github/workflows/sponsors.yml
@@ -30,7 +30,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v6
+ uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index b76afe01e..cbf1a8567 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -29,7 +29,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v6
+ uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
@@ -48,6 +48,7 @@ jobs:
strategy:
matrix:
python-version:
+ - "3.14"
- "3.13"
- "3.12"
- "3.11"
@@ -55,6 +56,9 @@ jobs:
- "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
@@ -67,7 +71,7 @@ jobs:
with:
python-version: ${{ matrix.python-version }}
- name: Setup uv
- uses: astral-sh/setup-uv@v6
+ uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
@@ -112,7 +116,7 @@ jobs:
with:
python-version: '3.8'
- name: Setup uv
- uses: astral-sh/setup-uv@v6
+ uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/topic-repos.yml b/.github/workflows/topic-repos.yml
index cb98698d3..22b37d59d 100644
--- a/.github/workflows/topic-repos.yml
+++ b/.github/workflows/topic-repos.yml
@@ -25,7 +25,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v6
+ uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
diff --git a/.github/workflows/translate.yml b/.github/workflows/translate.yml
index fa4e8f463..a7fcf84df 100644
--- a/.github/workflows/translate.yml
+++ b/.github/workflows/translate.yml
@@ -48,7 +48,7 @@ jobs:
with:
python-version: "3.11"
- name: Setup uv
- uses: astral-sh/setup-uv@v6
+ uses: astral-sh/setup-uv@v7
with:
version: "0.4.15"
enable-cache: true
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 8b24c8c0c..9c075f68e 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -14,7 +14,7 @@ repos:
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.13.1
+ rev: v0.13.3
hooks:
- id: ruff
args:
diff --git a/docs/de/docs/advanced/advanced-dependencies.md b/docs/de/docs/advanced/advanced-dependencies.md
index a153665cc..da5f28c7c 100644
--- a/docs/de/docs/advanced/advanced-dependencies.md
+++ b/docs/de/docs/advanced/advanced-dependencies.md
@@ -63,3 +63,91 @@ In den Kapiteln zum Thema Sicherheit gibt es Hilfsfunktionen, die auf die gleich
Wenn Sie das hier alles verstanden haben, wissen Sie bereits, wie diese Sicherheits-Hilfswerkzeuge unter der Haube funktionieren.
///
+
+## Abhängigkeiten mit `yield`, `HTTPException`, `except` und Hintergrundtasks { #dependencies-with-yield-httpexception-except-and-background-tasks }
+
+/// warning | Achtung
+
+Sie benötigen diese technischen Details höchstwahrscheinlich nicht.
+
+Diese Details sind hauptsächlich nützlich, wenn Sie eine FastAPI-Anwendung haben, die älter als 0.118.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 `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 GitHub-Diskussion-Frage 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](../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.
diff --git a/docs/de/docs/how-to/conditional-openapi.md b/docs/de/docs/how-to/conditional-openapi.md
index 0f0b2d297..f6a2fad3b 100644
--- a/docs/de/docs/how-to/conditional-openapi.md
+++ b/docs/de/docs/how-to/conditional-openapi.md
@@ -17,7 +17,7 @@ Wenn Sie Ihre API sichern möchten, gibt es mehrere bessere Dinge, die Sie tun k
* Stellen Sie sicher, dass Sie über gut definierte Pydantic-Modelle für Ihre Requestbodys und Responses verfügen.
* Konfigurieren Sie alle erforderlichen Berechtigungen und Rollen mithilfe von Abhängigkeiten.
* Speichern Sie niemals Klartext-Passwörter, sondern nur Passwort-Hashes.
-* Implementieren und verwenden Sie gängige kryptografische Tools wie Passlib und JWT-Tokens, usw.
+* Implementieren und verwenden Sie gängige kryptografische Tools wie pwdlib und JWT-Tokens, usw.
* Fügen Sie bei Bedarf detailliertere Berechtigungskontrollen mit OAuth2-Scopes hinzu.
* ... usw.
diff --git a/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md
index 178c2673e..e65b073a2 100644
--- a/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -1,6 +1,6 @@
# Abhängigkeiten mit `yield` { #dependencies-with-yield }
-FastAPI unterstützt Abhängigkeiten, die nach Abschluss einige zusätzliche Schritte ausführen.
+FastAPI unterstützt Abhängigkeiten, die nach Abschluss einige zusätzliche Schritte ausführen.
Verwenden Sie dazu `yield` statt `return` und schreiben Sie die zusätzlichen Schritte / den zusätzlichen Code danach.
@@ -35,7 +35,7 @@ Der ge`yield`ete Wert ist das, was in *Pfadoperationen* und andere Abhängigkeit
{* ../../docs_src/dependencies/tutorial007.py hl[4] *}
-Der auf die `yield`-Anweisung folgende Code wird ausgeführt, nachdem die Response erstellt wurde, aber bevor sie gesendet wird:
+Der auf die `yield`-Anweisung folgende Code wird nach der Response ausgeführt:
{* ../../docs_src/dependencies/tutorial007.py hl[5:6] *}
@@ -51,7 +51,7 @@ Sie können `async`- oder reguläre Funktionen verwenden.
Wenn Sie einen `try`-Block in einer Abhängigkeit mit `yield` verwenden, empfangen Sie alle Exceptions, die bei Verwendung der Abhängigkeit geworfen wurden.
-Wenn beispielsweise ein Code irgendwann in der Mitte, in einer anderen Abhängigkeit oder in einer *Pfadoperation*, ein „Rollback“ einer Datenbanktransaktion oder einen anderen Fehler verursacht, empfangen Sie die resultierende Exception in Ihrer Abhängigkeit.
+Wenn beispielsweise ein Code irgendwann in der Mitte, in einer anderen Abhängigkeit oder in einer *Pfadoperation*, ein „Rollback“ einer Datenbanktransaktion macht oder eine andere Exception verursacht, empfangen Sie die Exception in Ihrer Abhängigkeit.
Sie können also mit `except SomeException` diese bestimmte Exception innerhalb der Abhängigkeit handhaben.
@@ -95,9 +95,11 @@ Dieses funktioniert dank Pythons
```console
-$ pip install "passlib[bcrypt]"
+$ pip install "pwdlib[argon2]"
---> 100%
```
@@ -86,7 +86,7 @@ $ pip install "passlib[bcrypt]"
/// tip | Tipp
-Mit `passlib` können Sie sogar konfigurieren, Passwörter zu lesen, die von **Django**, einem **Flask**-Sicherheit-Plugin, oder vielen anderen erstellt wurden.
+Mit `pwdlib` können Sie sogar konfigurieren, Passwörter zu lesen, die von **Django**, einem **Flask**-Sicherheits-Plugin, oder vielen anderen erstellt wurden.
So könnten Sie beispielsweise die gleichen Daten aus einer Django-Anwendung in einer Datenbank mit einer FastAPI-Anwendung teilen. Oder schrittweise eine Django-Anwendung migrieren, während Sie dieselbe Datenbank verwenden.
@@ -96,15 +96,15 @@ Und Ihre Benutzer könnten sich gleichzeitig über Ihre Django-Anwendung oder Ih
## Die Passwörter hashen und überprüfen { #hash-and-verify-the-passwords }
-Importieren Sie die benötigten Tools aus `passlib`.
+Importieren Sie die benötigten Tools aus `pwdlib`.
-Erstellen Sie einen PassLib-„Kontext“. Der wird für das Hashen und Verifizieren von Passwörtern verwendet.
+Erstellen Sie eine PasswordHash-Instanz mit empfohlenen Einstellungen – sie wird für das Hashen und Verifizieren von Passwörtern verwendet.
/// tip | Tipp
-Der PassLib-Kontext kann auch andere Hashing-Algorithmen verwenden, einschließlich deprecateter Alter, um etwa nur eine Verifizierung usw. zu ermöglichen.
+pwdlib unterstützt auch den bcrypt-Hashing-Algorithmus, enthält jedoch keine Legacy-Algorithmen – für die Arbeit mit veralteten Hashes wird die Verwendung der Bibliothek passlib empfohlen.
-Sie könnten ihn beispielsweise verwenden, um von einem anderen System (wie Django) generierte Passwörter zu lesen und zu verifizieren, aber alle neuen Passwörter mit einem anderen Algorithmus wie Bcrypt zu hashen.
+Sie könnten sie beispielsweise verwenden, um von einem anderen System (wie Django) generierte Passwörter zu lesen und zu verifizieren, aber alle neuen Passwörter mit einem anderen Algorithmus wie Argon2 oder Bcrypt zu hashen.
Und mit allen gleichzeitig kompatibel sein.
@@ -120,7 +120,7 @@ Und noch eine, um einen Benutzer zu authentifizieren und zurückzugeben.
/// note | Hinweis
-Wenn Sie sich die neue (gefakte) Datenbank `fake_users_db` anschauen, sehen Sie, wie das gehashte Passwort jetzt aussieht: `"$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW"`.
+Wenn Sie sich die neue (gefakte) Datenbank `fake_users_db` anschauen, sehen Sie, wie das gehashte Passwort jetzt aussieht: `"$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc"`.
///
@@ -264,7 +264,7 @@ Viele Packages, die es stark vereinfachen, müssen viele Kompromisse beim Datenm
Es gibt Ihnen die volle Flexibilität, diejenigen auszuwählen, die am besten zu Ihrem Projekt passen.
-Und Sie können viele gut gepflegte und weit verbreitete Packages wie `passlib` und `PyJWT` direkt verwenden, da **FastAPI** keine komplexen Mechanismen zur Integration externer Pakete erfordert.
+Und Sie können viele gut gepflegte und weit verbreitete Packages wie `pwdlib` und `PyJWT` direkt verwenden, da **FastAPI** keine komplexen Mechanismen zur Integration externer Pakete erfordert.
Aber es bietet Ihnen die Werkzeuge, um den Prozess so weit wie möglich zu vereinfachen, ohne Kompromisse bei Flexibilität, Robustheit oder Sicherheit einzugehen.
diff --git a/docs/en/data/contributors.yml b/docs/en/data/contributors.yml
index ad2b25c6c..c892d8baf 100644
--- a/docs/en/data/contributors.yml
+++ b/docs/en/data/contributors.yml
@@ -1,21 +1,21 @@
tiangolo:
login: tiangolo
- count: 776
+ count: 782
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
url: https://github.com/tiangolo
dependabot:
login: dependabot
- count: 113
+ count: 117
avatarUrl: https://avatars.githubusercontent.com/in/29110?v=4
url: https://github.com/apps/dependabot
alejsdev:
login: alejsdev
- count: 48
- avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=638c65283ac9e9e2c3a0f9d1e3370db4b8a2c58d&v=4
+ count: 52
+ avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=447d12a1b347f466b35378bee4c7104cc9b2c571&v=4
url: https://github.com/alejsdev
pre-commit-ci:
login: pre-commit-ci
- count: 41
+ count: 45
avatarUrl: https://avatars.githubusercontent.com/in/68672?v=4
url: https://github.com/apps/pre-commit-ci
github-actions:
@@ -25,7 +25,7 @@ github-actions:
url: https://github.com/apps/github-actions
Kludex:
login: Kludex
- count: 23
+ count: 24
avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4
url: https://github.com/Kludex
dmontagu:
@@ -38,21 +38,31 @@ euri10:
count: 13
avatarUrl: https://avatars.githubusercontent.com/u/1104190?u=321a2e953e6645a7d09b732786c7a8061e0f8a8b&v=4
url: https://github.com/euri10
+nilslindemann:
+ login: nilslindemann
+ count: 13
+ avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
+ url: https://github.com/nilslindemann
kantandane:
login: kantandane
count: 13
avatarUrl: https://avatars.githubusercontent.com/u/3978368?u=cccc199291f991a73b1ebba5abc735a948e0bd16&v=4
url: https://github.com/kantandane
-nilslindemann:
- login: nilslindemann
+svlandeg:
+ login: svlandeg
count: 11
- avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
- url: https://github.com/nilslindemann
+ avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4
+ url: https://github.com/svlandeg
zhaohan-dong:
login: zhaohan-dong
count: 11
avatarUrl: https://avatars.githubusercontent.com/u/65422392?u=8260f8781f50248410ebfa4c9bf70e143fe5c9f2&v=4
url: https://github.com/zhaohan-dong
+YuriiMotov:
+ login: YuriiMotov
+ count: 10
+ avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=b9b13d598dddfab529a52d264df80a900bfe7060&v=4
+ url: https://github.com/YuriiMotov
mariacamilagl:
login: mariacamilagl
count: 9
@@ -68,21 +78,16 @@ vishnuvskvkl:
count: 8
avatarUrl: https://avatars.githubusercontent.com/u/84698110?u=8af5de0520dd4fa195f53c2850a26f57c0f6bc64&v=4
url: https://github.com/vishnuvskvkl
-svlandeg:
- login: svlandeg
- count: 7
- avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4
- url: https://github.com/svlandeg
alissadb:
login: alissadb
count: 6
avatarUrl: https://avatars.githubusercontent.com/u/96190409?u=be42d85938c241be781505a5a872575be28b2906&v=4
url: https://github.com/alissadb
-YuriiMotov:
- login: YuriiMotov
+alv2017:
+ login: alv2017
count: 6
- avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=b9b13d598dddfab529a52d264df80a900bfe7060&v=4
- url: https://github.com/YuriiMotov
+ avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
+ url: https://github.com/alv2017
wshayes:
login: wshayes
count: 5
@@ -103,11 +108,6 @@ krishnamadhavan:
count: 5
avatarUrl: https://avatars.githubusercontent.com/u/31798870?u=950693b28f3ae01105fd545c046e46ca3d31ab06&v=4
url: https://github.com/krishnamadhavan
-alv2017:
- login: alv2017
- count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
- url: https://github.com/alv2017
jekirl:
login: jekirl
count: 4
@@ -133,6 +133,11 @@ iudeen:
count: 4
avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=f09cdd745e5bf16138f29b42732dd57c7f02bee1&v=4
url: https://github.com/iudeen
+musicinmybrain:
+ login: musicinmybrain
+ count: 4
+ avatarUrl: https://avatars.githubusercontent.com/u/6898909?u=9010312053e7141383b9bdf538036c7f37fbaba0&v=4
+ url: https://github.com/musicinmybrain
philipokiokio:
login: philipokiokio
count: 4
@@ -186,7 +191,7 @@ Serrones:
uriyyo:
login: uriyyo
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/32038156?u=a27b65a9ec3420586a827a0facccbb8b6df1ffb3&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/32038156?u=0c68019beb28381ce5205a838937c61e0fe3fee2&v=4
url: https://github.com/uriyyo
andrew222651:
login: andrew222651
@@ -243,16 +248,11 @@ papb:
count: 3
avatarUrl: https://avatars.githubusercontent.com/u/20914054?u=890511fae7ea90d887e2a65ce44a1775abba38d5&v=4
url: https://github.com/papb
-musicinmybrain:
- login: musicinmybrain
- count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/6898909?u=9010312053e7141383b9bdf538036c7f37fbaba0&v=4
- url: https://github.com/musicinmybrain
-gitworkflows:
- login: gitworkflows
+tamird:
+ login: tamird
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/118260833?v=4
- url: https://github.com/gitworkflows
+ avatarUrl: https://avatars.githubusercontent.com/u/1535036?v=4
+ url: https://github.com/tamird
Nimitha-jagadeesha:
login: Nimitha-jagadeesha
count: 3
@@ -296,7 +296,7 @@ kabirkhan:
zamiramir:
login: zamiramir
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/40475662?u=e58ef61034e8d0d6a312cc956fb09b9c3332b449&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/40475662?v=4
url: https://github.com/zamiramir
trim21:
login: trim21
@@ -331,7 +331,7 @@ svalouch:
frankie567:
login: frankie567
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/1144727?u=c159fe047727aedecbbeeaa96a1b03ceb9d39add&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/1144727?u=f3e79acfe4ed207e15c2145161a8a9759925fcd2&v=4
url: https://github.com/frankie567
marier-nico:
login: marier-nico
@@ -486,7 +486,7 @@ nzig:
yezz123:
login: yezz123
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/52716203?u=d7062cbc6eb7671d5dc9cc0e32a24ae335e0f225&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/52716203?u=21b53ce4115062b1e20cb513e64ca0000c2ef127&v=4
url: https://github.com/yezz123
softwarebloat:
login: softwarebloat
@@ -518,11 +518,6 @@ estebanx64:
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=1900887aeed268699e5ea6f3fb7db614f7b77cd3&v=4
url: https://github.com/estebanx64
-tamird:
- login: tamird
- count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/1535036?v=4
- url: https://github.com/tamird
ndimares:
login: ndimares
count: 2
diff --git a/docs/en/data/external_links.yml b/docs/en/data/external_links.yml
index c1191b460..b8a5fdb3a 100644
--- a/docs/en/data/external_links.yml
+++ b/docs/en/data/external_links.yml
@@ -1,5 +1,9 @@
Articles:
English:
+ - author: Apitally
+ author_link: https://apitally.io
+ link: https://apitally.io/blog/getting-started-with-logging-in-fastapi
+ title: Getting started with logging in FastAPI
- author: Balthazar Rouberol
author_link: https://balthazar-rouberol.com
link: https://blog.balthazar-rouberol.com/how-to-profile-a-fastapi-asynchronous-request
diff --git a/docs/en/data/github_sponsors.yml b/docs/en/data/github_sponsors.yml
index 0daa96fb9..7b34719b6 100644
--- a/docs/en/data/github_sponsors.yml
+++ b/docs/en/data/github_sponsors.yml
@@ -80,18 +80,18 @@ sponsors:
- - login: primer-io
avatarUrl: https://avatars.githubusercontent.com/u/62146168?v=4
url: https://github.com/primer-io
-- - login: upciti
+- - login: nilslindemann
+ avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
+ url: https://github.com/nilslindemann
+ - login: upciti
avatarUrl: https://avatars.githubusercontent.com/u/43346262?v=4
url: https://github.com/upciti
- - login: giunio-prc
- avatarUrl: https://avatars.githubusercontent.com/u/59511892?u=b37c1f1e177a4ee0212d24fb1f15edc9b23fd132&v=4
- url: https://github.com/giunio-prc
+ - login: thisisfixer
+ avatarUrl: https://avatars.githubusercontent.com/u/14433035?u=076d52a5b7891c764904af9f462bfb45428e25df&v=4
+ url: https://github.com/thisisfixer
- - login: samuelcolvin
avatarUrl: https://avatars.githubusercontent.com/u/4039449?u=42eb3b833047c8c4b4f647a031eaef148c16d93f&v=4
url: https://github.com/samuelcolvin
- - login: vincentkoc
- avatarUrl: https://avatars.githubusercontent.com/u/25068?u=fbd5b2d51142daa4bdbc21e21953a3b8b8188a4a&v=4
- url: https://github.com/vincentkoc
- login: otosky
avatarUrl: https://avatars.githubusercontent.com/u/42260747?u=69d089387c743d89427aa4ad8740cfb34045a9e0&v=4
url: https://github.com/otosky
@@ -101,9 +101,6 @@ sponsors:
- login: roboflow
avatarUrl: https://avatars.githubusercontent.com/u/53104118?v=4
url: https://github.com/roboflow
- - login: RaamEEIL
- avatarUrl: https://avatars.githubusercontent.com/u/20320552?v=4
- url: https://github.com/RaamEEIL
- login: ehaca
avatarUrl: https://avatars.githubusercontent.com/u/25950317?u=cec1a3e0643b785288ae8260cc295a85ab344995&v=4
url: https://github.com/ehaca
@@ -116,9 +113,6 @@ sponsors:
- login: Leay15
avatarUrl: https://avatars.githubusercontent.com/u/32212558?u=c4aa9c1737e515959382a5515381757b1fd86c53&v=4
url: https://github.com/Leay15
- - login: chickenandstats
- avatarUrl: https://avatars.githubusercontent.com/u/79477966?u=ae2b894aa954070db1d7830dab99b49eba4e4567&v=4
- url: https://github.com/chickenandstats
- login: kaoru0310
avatarUrl: https://avatars.githubusercontent.com/u/80977929?u=1b61d10142b490e56af932ddf08a390fae8ee94f&v=4
url: https://github.com/kaoru0310
@@ -137,15 +131,15 @@ sponsors:
- login: patsatsia
avatarUrl: https://avatars.githubusercontent.com/u/61111267?u=3271b85f7a37b479c8d0ae0a235182e83c166edf&v=4
url: https://github.com/patsatsia
- - login: secrett2633
- avatarUrl: https://avatars.githubusercontent.com/u/65999962?v=4
- url: https://github.com/secrett2633
- login: anthonycepeda
avatarUrl: https://avatars.githubusercontent.com/u/72019805?u=60bdf46240cff8fca482ff0fc07d963fd5e1a27c&v=4
url: https://github.com/anthonycepeda
- login: patricioperezv
avatarUrl: https://avatars.githubusercontent.com/u/73832292?u=5f471f156e19ee7920e62ae0f4a47b95580e61cf&v=4
url: https://github.com/patricioperezv
+ - login: chickenandstats
+ avatarUrl: https://avatars.githubusercontent.com/u/79477966?u=ae2b894aa954070db1d7830dab99b49eba4e4567&v=4
+ url: https://github.com/chickenandstats
- login: dodo5522
avatarUrl: https://avatars.githubusercontent.com/u/1362607?u=9bf1e0e520cccc547c046610c468ce6115bbcf9f&v=4
url: https://github.com/dodo5522
@@ -176,18 +170,15 @@ sponsors:
- login: Ryandaydev
avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=679ff84cb7b988c5795a5fa583857f574a055763&v=4
url: https://github.com/Ryandaydev
- - login: jaredtrog
- avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4
- url: https://github.com/jaredtrog
+ - login: vincentkoc
+ avatarUrl: https://avatars.githubusercontent.com/u/25068?u=fbd5b2d51142daa4bdbc21e21953a3b8b8188a4a&v=4
+ url: https://github.com/vincentkoc
- login: jstanden
avatarUrl: https://avatars.githubusercontent.com/u/63288?u=c3658d57d2862c607a0e19c2101c3c51876e36ad&v=4
url: https://github.com/jstanden
- login: paulcwatts
avatarUrl: https://avatars.githubusercontent.com/u/150269?u=1819e145d573b44f0ad74b87206d21cd60331d4e&v=4
url: https://github.com/paulcwatts
- - login: andreaso
- avatarUrl: https://avatars.githubusercontent.com/u/285964?u=837265cc7562c0685f25b2d81cd9de0434fe107c&v=4
- url: https://github.com/andreaso
- login: robintw
avatarUrl: https://avatars.githubusercontent.com/u/296686?v=4
url: https://github.com/robintw
@@ -212,9 +203,6 @@ sponsors:
- login: jsoques
avatarUrl: https://avatars.githubusercontent.com/u/12414216?u=620921d94196546cc8b9eae2cc4cbc3f95bab42f&v=4
url: https://github.com/jsoques
- - login: joeds13
- avatarUrl: https://avatars.githubusercontent.com/u/13631604?u=628eb122e08bef43767b3738752b883e8e7f6259&v=4
- url: https://github.com/joeds13
- login: dannywade
avatarUrl: https://avatars.githubusercontent.com/u/13680237?u=418ee985bd41577b20fde81417fb2d901e875e8a&v=4
url: https://github.com/dannywade
@@ -227,6 +215,12 @@ sponsors:
- login: ashi-agrawal
avatarUrl: https://avatars.githubusercontent.com/u/17105294?u=99c7a854035e5398d8e7b674f2d42baae6c957f8&v=4
url: https://github.com/ashi-agrawal
+ - login: RaamEEIL
+ avatarUrl: https://avatars.githubusercontent.com/u/20320552?v=4
+ url: https://github.com/RaamEEIL
+ - login: jaredtrog
+ avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4
+ url: https://github.com/jaredtrog
- login: oliverxchen
avatarUrl: https://avatars.githubusercontent.com/u/4471774?u=534191f25e32eeaadda22dfab4b0a428733d5489&v=4
url: https://github.com/oliverxchen
@@ -251,9 +245,6 @@ sponsors:
- - login: pawamoy
avatarUrl: https://avatars.githubusercontent.com/u/3999221?u=b030e4c89df2f3a36bc4710b925bdeb6745c9856&v=4
url: https://github.com/pawamoy
- - login: petercool
- avatarUrl: https://avatars.githubusercontent.com/u/37613029?u=75aa8c6729e6e8f85a300561c4dbeef9d65c8797&v=4
- url: https://github.com/petercool
- login: siavashyj
avatarUrl: https://avatars.githubusercontent.com/u/43583410?u=562005ddc7901cd27a1219a118a2363817b14977&v=4
url: https://github.com/siavashyj
@@ -264,14 +255,11 @@ sponsors:
avatarUrl: https://avatars.githubusercontent.com/u/44609997?v=4
url: https://github.com/ArtyomVancyan
- login: caviri
- avatarUrl: https://avatars.githubusercontent.com/u/45425937?u=4e14bd64282bad8f385eafbdb004b5a279366d6e&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/45425937?u=5f3d66ea5edea94c028c51ebf1c0f3b37e6c3db5&v=4
url: https://github.com/caviri
- login: hgalytoby
avatarUrl: https://avatars.githubusercontent.com/u/50397689?u=6cc9028f3db63f8f60ad21c17b1ce4b88c4e2e60&v=4
url: https://github.com/hgalytoby
- - login: joshuatz
- avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4
- url: https://github.com/joshuatz
- login: nisutec
avatarUrl: https://avatars.githubusercontent.com/u/25281462?u=e562484c451fdfc59053163f64405f8eb262b8b0&v=4
url: https://github.com/nisutec
@@ -287,6 +275,12 @@ sponsors:
- login: bnkc
avatarUrl: https://avatars.githubusercontent.com/u/34930566?u=db5e6f4f87836cad26c2aa90ce390ce49041c5a9&v=4
url: https://github.com/bnkc
+ - login: petercool
+ avatarUrl: https://avatars.githubusercontent.com/u/37613029?u=75aa8c6729e6e8f85a300561c4dbeef9d65c8797&v=4
+ url: https://github.com/petercool
+ - login: JulioPeixoto
+ avatarUrl: https://avatars.githubusercontent.com/u/96303574?u=27d4614350cae33653f1be35cb47c92a12627ac9&v=4
+ url: https://github.com/JulioPeixoto
- login: johnl28
avatarUrl: https://avatars.githubusercontent.com/u/54412955?u=47dd06082d1c39caa90c752eb55566e4f3813957&v=4
url: https://github.com/johnl28
@@ -308,6 +302,9 @@ sponsors:
- login: Alisa-lisa
avatarUrl: https://avatars.githubusercontent.com/u/4137964?u=e7e393504f554f4ff15863a1e01a5746863ef9ce&v=4
url: https://github.com/Alisa-lisa
+ - login: moonape1226
+ avatarUrl: https://avatars.githubusercontent.com/u/8532038?u=d9f8b855a429fff9397c3833c2ff83849ebf989d&v=4
+ url: https://github.com/moonape1226
- login: ddanier
avatarUrl: https://avatars.githubusercontent.com/u/113563?u=ed1dc79de72f93bd78581f88ebc6952b62f472da&v=4
url: https://github.com/ddanier
@@ -323,9 +320,6 @@ sponsors:
- login: tochikuji
avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4
url: https://github.com/tochikuji
- - login: moonape1226
- avatarUrl: https://avatars.githubusercontent.com/u/8532038?u=d9f8b855a429fff9397c3833c2ff83849ebf989d&v=4
- url: https://github.com/moonape1226
- login: xncbf
avatarUrl: https://avatars.githubusercontent.com/u/9462045?u=a80a7bb349555b277645632ed66639ff43400614&v=4
url: https://github.com/xncbf
@@ -341,15 +335,15 @@ sponsors:
- login: mntolia
avatarUrl: https://avatars.githubusercontent.com/u/10390224?v=4
url: https://github.com/mntolia
- - login: pheanex
- avatarUrl: https://avatars.githubusercontent.com/u/10408624?u=5b6bab6ee174aa6e991333e06eb29f628741013d&v=4
- url: https://github.com/pheanex
- login: Zuzah
avatarUrl: https://avatars.githubusercontent.com/u/10934846?u=1ef43e075ddc87bd1178372bf4d95ee6175cae27&v=4
url: https://github.com/Zuzah
- login: TheR1D
avatarUrl: https://avatars.githubusercontent.com/u/16740832?u=b0dfdbdb27b79729430c71c6128962f77b7b53f7&v=4
url: https://github.com/TheR1D
+ - login: joshuatz
+ avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4
+ url: https://github.com/joshuatz
- login: danielunderwood
avatarUrl: https://avatars.githubusercontent.com/u/4472301?v=4
url: https://github.com/danielunderwood
@@ -359,9 +353,6 @@ sponsors:
- login: sdevkota
avatarUrl: https://avatars.githubusercontent.com/u/5250987?u=4ed9a120c89805a8aefda1cbdc0cf6512e64d1b4&v=4
url: https://github.com/sdevkota
- - login: brizzbuzz
- avatarUrl: https://avatars.githubusercontent.com/u/5607577?u=58d5aae33bc97e52f11f334d2702e8710314b5c1&v=4
- url: https://github.com/brizzbuzz
- login: Baghdady92
avatarUrl: https://avatars.githubusercontent.com/u/5708590?v=4
url: https://github.com/Baghdady92
@@ -374,10 +365,7 @@ sponsors:
- login: harsh183
avatarUrl: https://avatars.githubusercontent.com/u/7780198?v=4
url: https://github.com/harsh183
-- - login: andrecorumba
- avatarUrl: https://avatars.githubusercontent.com/u/37807517?u=9b9be3b41da9bda60957da9ef37b50dbf65baa61&v=4
- url: https://github.com/andrecorumba
- - login: KOZ39
+- - login: KOZ39
avatarUrl: https://avatars.githubusercontent.com/u/38822500?u=9dfc0a697df1c9628f08e20dc3fb17b1afc4e5a7&v=4
url: https://github.com/KOZ39
- login: rwxd
@@ -386,18 +374,27 @@ sponsors:
- login: morzan1001
avatarUrl: https://avatars.githubusercontent.com/u/47593005?u=c30ab7230f82a12a9b938dcb54f84a996931409a&v=4
url: https://github.com/morzan1001
+ - login: azharthegeek
+ avatarUrl: https://avatars.githubusercontent.com/u/51288109?u=0987b2a9f39c21ccb071b6bdce0fc60d8492f8e8&v=4
+ url: https://github.com/azharthegeek
- login: Olegt0rr
avatarUrl: https://avatars.githubusercontent.com/u/25399456?u=3e87b5239a2f4600975ba13be73054f8567c6060&v=4
url: https://github.com/Olegt0rr
- login: larsyngvelundin
avatarUrl: https://avatars.githubusercontent.com/u/34173819?u=74958599695bf83ac9f1addd935a51548a10c6b0&v=4
url: https://github.com/larsyngvelundin
- - login: henriquesebastiao
- avatarUrl: https://avatars.githubusercontent.com/u/85202803?u=1b31ff01127bd267a87c97ff6319c77d91be606f&v=4
- url: https://github.com/henriquesebastiao
- - login: olexkram
- avatarUrl: https://avatars.githubusercontent.com/u/148793576?v=4
- url: https://github.com/olexkram
+ - login: andrecorumba
+ avatarUrl: https://avatars.githubusercontent.com/u/37807517?u=9b9be3b41da9bda60957da9ef37b50dbf65baa61&v=4
+ url: https://github.com/andrecorumba
+ - login: ChenPu2002
+ avatarUrl: https://avatars.githubusercontent.com/u/113831763?v=4
+ url: https://github.com/ChenPu2002
+ - login: CoderDeltaLAN
+ avatarUrl: https://avatars.githubusercontent.com/u/152043745?u=4ff541efffb7d134e60c5fcf2dd1e343f90bb782&v=4
+ url: https://github.com/CoderDeltaLAN
+ - login: aghents
+ avatarUrl: https://avatars.githubusercontent.com/u/60949885?u=d8616ddf22cf998a712cdceefd6a0256a178fe9d&v=4
+ url: https://github.com/aghents
- login: 0ne-stone
avatarUrl: https://avatars.githubusercontent.com/u/62360849?u=746dd21c34e7e06eefb11b03e8bb01aaae3c2a4f&v=4
url: https://github.com/0ne-stone
@@ -410,9 +407,6 @@ sponsors:
- login: andreagrandi
avatarUrl: https://avatars.githubusercontent.com/u/636391?u=13d90cb8ec313593a5b71fbd4e33b78d6da736f5&v=4
url: https://github.com/andreagrandi
- - login: roboman-tech
- avatarUrl: https://avatars.githubusercontent.com/u/8183070?u=fdeaa2ed29f598eb7901693884c0ad32b16982e3&v=4
- url: https://github.com/roboman-tech
- login: msserpa
avatarUrl: https://avatars.githubusercontent.com/u/6334934?u=82c4489eb1559d88d2990d60001901b14f722bbb&v=4
url: https://github.com/msserpa
diff --git a/docs/en/data/topic_repos.yml b/docs/en/data/topic_repos.yml
index af5bb21d5..9d95fb8b1 100644
--- a/docs/en/data/topic_repos.yml
+++ b/docs/en/data/topic_repos.yml
@@ -1,495 +1,495 @@
- name: full-stack-fastapi-template
html_url: https://github.com/fastapi/full-stack-fastapi-template
- stars: 37341
+ stars: 38085
owner_login: fastapi
owner_html_url: https://github.com/fastapi
- name: Hello-Python
html_url: https://github.com/mouredev/Hello-Python
- stars: 31799
+ stars: 32243
owner_login: mouredev
owner_html_url: https://github.com/mouredev
- name: serve
html_url: https://github.com/jina-ai/serve
- stars: 21721
+ stars: 21754
owner_login: jina-ai
owner_html_url: https://github.com/jina-ai
- name: HivisionIDPhotos
html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos
- stars: 19114
+ stars: 19400
owner_login: Zeyi-Lin
owner_html_url: https://github.com/Zeyi-Lin
- name: sqlmodel
html_url: https://github.com/fastapi/sqlmodel
- stars: 16678
+ stars: 16859
owner_login: fastapi
owner_html_url: https://github.com/fastapi
- name: Douyin_TikTok_Download_API
html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API
- stars: 14126
+ stars: 14452
owner_login: Evil0ctal
owner_html_url: https://github.com/Evil0ctal
- name: fastapi-best-practices
html_url: https://github.com/zhanymkanov/fastapi-best-practices
- stars: 13189
+ stars: 13613
owner_login: zhanymkanov
owner_html_url: https://github.com/zhanymkanov
-- name: awesome-fastapi
- html_url: https://github.com/mjhea0/awesome-fastapi
- stars: 10264
- owner_login: mjhea0
- owner_html_url: https://github.com/mjhea0
- name: fastapi_mcp
html_url: https://github.com/tadata-org/fastapi_mcp
- stars: 9964
+ stars: 10624
owner_login: tadata-org
owner_html_url: https://github.com/tadata-org
+- name: awesome-fastapi
+ html_url: https://github.com/mjhea0/awesome-fastapi
+ stars: 10415
+ owner_login: mjhea0
+ owner_html_url: https://github.com/mjhea0
- name: FastUI
html_url: https://github.com/pydantic/FastUI
- stars: 8861
+ stars: 8879
owner_login: pydantic
owner_html_url: https://github.com/pydantic
- name: XHS-Downloader
html_url: https://github.com/JoeanAmier/XHS-Downloader
- stars: 8576
+ stars: 8824
owner_login: JoeanAmier
owner_html_url: https://github.com/JoeanAmier
- name: SurfSense
html_url: https://github.com/MODSetter/SurfSense
- stars: 7421
+ stars: 8257
owner_login: MODSetter
owner_html_url: https://github.com/MODSetter
- name: FileCodeBox
html_url: https://github.com/vastsa/FileCodeBox
- stars: 7179
+ stars: 7367
owner_login: vastsa
owner_html_url: https://github.com/vastsa
- name: polar
html_url: https://github.com/polarsource/polar
- stars: 7106
+ stars: 7291
owner_login: polarsource
owner_html_url: https://github.com/polarsource
- name: nonebot2
html_url: https://github.com/nonebot/nonebot2
- stars: 6998
+ stars: 7065
owner_login: nonebot
owner_html_url: https://github.com/nonebot
- name: hatchet
html_url: https://github.com/hatchet-dev/hatchet
- stars: 5978
+ stars: 6070
owner_login: hatchet-dev
owner_html_url: https://github.com/hatchet-dev
- name: serge
html_url: https://github.com/serge-chat/serge
- stars: 5751
+ stars: 5754
owner_login: serge-chat
owner_html_url: https://github.com/serge-chat
- name: fastapi-users
html_url: https://github.com/fastapi-users/fastapi-users
- stars: 5517
+ stars: 5599
owner_login: fastapi-users
owner_html_url: https://github.com/fastapi-users
- name: strawberry
html_url: https://github.com/strawberry-graphql/strawberry
- stars: 4392
+ stars: 4422
owner_login: strawberry-graphql
owner_html_url: https://github.com/strawberry-graphql
- name: chatgpt-web-share
html_url: https://github.com/chatpire/chatgpt-web-share
- stars: 4305
+ stars: 4301
owner_login: chatpire
owner_html_url: https://github.com/chatpire
- name: poem
html_url: https://github.com/poem-web/poem
- stars: 4157
+ stars: 4197
owner_login: poem-web
owner_html_url: https://github.com/poem-web
- name: dynaconf
html_url: https://github.com/dynaconf/dynaconf
- stars: 4112
+ stars: 4144
owner_login: dynaconf
owner_html_url: https://github.com/dynaconf
- name: atrilabs-engine
html_url: https://github.com/Atri-Labs/atrilabs-engine
- stars: 4104
+ stars: 4094
owner_login: Atri-Labs
owner_html_url: https://github.com/Atri-Labs
- name: Kokoro-FastAPI
html_url: https://github.com/remsky/Kokoro-FastAPI
- stars: 3569
+ stars: 3739
owner_login: remsky
owner_html_url: https://github.com/remsky
-- name: LitServe
- html_url: https://github.com/Lightning-AI/LitServe
- stars: 3531
- owner_login: Lightning-AI
- owner_html_url: https://github.com/Lightning-AI
- name: logfire
html_url: https://github.com/pydantic/logfire
- stars: 3510
+ stars: 3614
owner_login: pydantic
owner_html_url: https://github.com/pydantic
+- name: LitServe
+ html_url: https://github.com/Lightning-AI/LitServe
+ stars: 3578
+ owner_login: Lightning-AI
+ owner_html_url: https://github.com/Lightning-AI
- name: datamodel-code-generator
html_url: https://github.com/koxudaxi/datamodel-code-generator
- stars: 3425
+ stars: 3496
owner_login: koxudaxi
owner_html_url: https://github.com/koxudaxi
- name: farfalle
html_url: https://github.com/rashadphz/farfalle
- stars: 3420
+ stars: 3459
owner_login: rashadphz
owner_html_url: https://github.com/rashadphz
- name: fastapi-admin
html_url: https://github.com/fastapi-admin/fastapi-admin
- stars: 3417
+ stars: 3456
owner_login: fastapi-admin
owner_html_url: https://github.com/fastapi-admin
- name: huma
html_url: https://github.com/danielgtaylor/huma
- stars: 3351
+ stars: 3447
owner_login: danielgtaylor
owner_html_url: https://github.com/danielgtaylor
- name: tracecat
html_url: https://github.com/TracecatHQ/tracecat
- stars: 3213
+ stars: 3254
owner_login: TracecatHQ
owner_html_url: https://github.com/TracecatHQ
- name: opyrator
html_url: https://github.com/ml-tooling/opyrator
- stars: 3131
+ stars: 3134
owner_login: ml-tooling
owner_html_url: https://github.com/ml-tooling
- name: docarray
html_url: https://github.com/docarray/docarray
- stars: 3098
+ stars: 3107
owner_login: docarray
owner_html_url: https://github.com/docarray
- name: fastapi-realworld-example-app
html_url: https://github.com/nsidnev/fastapi-realworld-example-app
- stars: 2925
+ stars: 2936
owner_login: nsidnev
owner_html_url: https://github.com/nsidnev
- name: uvicorn-gunicorn-fastapi-docker
html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker
- stars: 2796
+ stars: 2804
owner_login: tiangolo
owner_html_url: https://github.com/tiangolo
- name: best-of-web-python
html_url: https://github.com/ml-tooling/best-of-web-python
- stars: 2583
+ stars: 2610
owner_login: ml-tooling
owner_html_url: https://github.com/ml-tooling
-- name: RasaGPT
- html_url: https://github.com/paulpierre/RasaGPT
- stars: 2438
- owner_login: paulpierre
- owner_html_url: https://github.com/paulpierre
+- name: mcp-context-forge
+ html_url: https://github.com/IBM/mcp-context-forge
+ stars: 2572
+ owner_login: IBM
+ owner_html_url: https://github.com/IBM
- name: fastapi-react
html_url: https://github.com/Buuntu/fastapi-react
- stars: 2432
+ stars: 2451
owner_login: Buuntu
owner_html_url: https://github.com/Buuntu
+- name: RasaGPT
+ html_url: https://github.com/paulpierre/RasaGPT
+ stars: 2441
+ owner_login: paulpierre
+ owner_html_url: https://github.com/paulpierre
- name: FastAPI-template
html_url: https://github.com/s3rius/FastAPI-template
- stars: 2388
+ stars: 2424
owner_login: s3rius
owner_html_url: https://github.com/s3rius
- name: sqladmin
html_url: https://github.com/aminalaee/sqladmin
- stars: 2323
+ stars: 2357
owner_login: aminalaee
owner_html_url: https://github.com/aminalaee
- name: nextpy
html_url: https://github.com/dot-agent/nextpy
- stars: 2314
+ stars: 2324
owner_login: dot-agent
owner_html_url: https://github.com/dot-agent
-- name: mcp-context-forge
- html_url: https://github.com/IBM/mcp-context-forge
+- name: supabase-py
+ html_url: https://github.com/supabase/supabase-py
stars: 2236
- owner_login: IBM
- owner_html_url: https://github.com/IBM
+ owner_login: supabase
+ owner_html_url: https://github.com/supabase
- name: 30-Days-of-Python
html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python
- stars: 2196
+ stars: 2210
owner_login: codingforentrepreneurs
owner_html_url: https://github.com/codingforentrepreneurs
-- name: supabase-py
- html_url: https://github.com/supabase/supabase-py
- stars: 2194
- owner_login: supabase
- owner_html_url: https://github.com/supabase
- name: langserve
html_url: https://github.com/langchain-ai/langserve
- stars: 2157
+ stars: 2171
owner_login: langchain-ai
owner_html_url: https://github.com/langchain-ai
- name: fastapi-utils
html_url: https://github.com/fastapiutils/fastapi-utils
- stars: 2155
+ stars: 2164
owner_login: fastapiutils
owner_html_url: https://github.com/fastapiutils
- name: solara
html_url: https://github.com/widgetti/solara
- stars: 2083
+ stars: 2102
owner_login: widgetti
owner_html_url: https://github.com/widgetti
-- name: mangum
- html_url: https://github.com/Kludex/mangum
- stars: 1969
- owner_login: Kludex
- owner_html_url: https://github.com/Kludex
- name: Yuxi-Know
html_url: https://github.com/xerrors/Yuxi-Know
- stars: 1849
+ stars: 1995
owner_login: xerrors
owner_html_url: https://github.com/xerrors
+- name: mangum
+ html_url: https://github.com/Kludex/mangum
+ stars: 1989
+ owner_login: Kludex
+ owner_html_url: https://github.com/Kludex
- name: python-week-2022
html_url: https://github.com/rochacbruno/python-week-2022
- stars: 1817
+ stars: 1816
owner_login: rochacbruno
owner_html_url: https://github.com/rochacbruno
- name: agentkit
html_url: https://github.com/BCG-X-Official/agentkit
- stars: 1779
+ stars: 1789
owner_login: BCG-X-Official
owner_html_url: https://github.com/BCG-X-Official
- name: manage-fastapi
html_url: https://github.com/ycd/manage-fastapi
- stars: 1770
+ stars: 1780
owner_login: ycd
owner_html_url: https://github.com/ycd
- name: ormar
html_url: https://github.com/collerek/ormar
- stars: 1766
+ stars: 1777
owner_login: collerek
owner_html_url: https://github.com/collerek
-- name: piccolo
- html_url: https://github.com/piccolo-orm/piccolo
- stars: 1673
- owner_login: piccolo-orm
- owner_html_url: https://github.com/piccolo-orm
- name: openapi-python-client
html_url: https://github.com/openapi-generators/openapi-python-client
- stars: 1667
+ stars: 1707
owner_login: openapi-generators
owner_html_url: https://github.com/openapi-generators
-- name: langchain-serve
- html_url: https://github.com/jina-ai/langchain-serve
- stars: 1632
- owner_login: jina-ai
- owner_html_url: https://github.com/jina-ai
+- name: piccolo
+ html_url: https://github.com/piccolo-orm/piccolo
+ stars: 1695
+ owner_login: piccolo-orm
+ owner_html_url: https://github.com/piccolo-orm
+- name: vue-fastapi-admin
+ html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin
+ stars: 1695
+ owner_login: mizhexiaoxiao
+ owner_html_url: https://github.com/mizhexiaoxiao
- name: fastapi-cache
html_url: https://github.com/long2ice/fastapi-cache
- stars: 1628
+ stars: 1653
owner_login: long2ice
owner_html_url: https://github.com/long2ice
+- name: langchain-serve
+ html_url: https://github.com/jina-ai/langchain-serve
+ stars: 1635
+ owner_login: jina-ai
+ owner_html_url: https://github.com/jina-ai
- name: termpair
html_url: https://github.com/cs01/termpair
- stars: 1622
+ stars: 1624
owner_login: cs01
owner_html_url: https://github.com/cs01
-- name: vue-fastapi-admin
- html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin
- stars: 1591
- owner_login: mizhexiaoxiao
- owner_html_url: https://github.com/mizhexiaoxiao
- name: slowapi
html_url: https://github.com/laurentS/slowapi
- stars: 1580
+ stars: 1620
owner_login: laurentS
owner_html_url: https://github.com/laurentS
- name: coronavirus-tracker-api
html_url: https://github.com/ExpDev07/coronavirus-tracker-api
- stars: 1578
+ stars: 1576
owner_login: ExpDev07
owner_html_url: https://github.com/ExpDev07
- name: fastapi-crudrouter
html_url: https://github.com/awtkns/fastapi-crudrouter
- stars: 1531
+ stars: 1546
owner_login: awtkns
owner_html_url: https://github.com/awtkns
-- name: awesome-fastapi-projects
- html_url: https://github.com/Kludex/awesome-fastapi-projects
- stars: 1473
- owner_login: Kludex
- owner_html_url: https://github.com/Kludex
- name: FastAPI-boilerplate
html_url: https://github.com/benavlabs/FastAPI-boilerplate
- stars: 1432
+ stars: 1516
owner_login: benavlabs
owner_html_url: https://github.com/benavlabs
+- name: awesome-fastapi-projects
+ html_url: https://github.com/Kludex/awesome-fastapi-projects
+ stars: 1481
+ owner_login: Kludex
+ owner_html_url: https://github.com/Kludex
- name: fastapi-pagination
html_url: https://github.com/uriyyo/fastapi-pagination
- stars: 1428
+ stars: 1453
owner_login: uriyyo
owner_html_url: https://github.com/uriyyo
+- name: bracket
+ html_url: https://github.com/evroon/bracket
+ stars: 1415
+ owner_login: evroon
+ owner_html_url: https://github.com/evroon
- name: awesome-python-resources
html_url: https://github.com/DjangoEx/awesome-python-resources
stars: 1413
owner_login: DjangoEx
owner_html_url: https://github.com/DjangoEx
-- name: bracket
- html_url: https://github.com/evroon/bracket
- stars: 1393
- owner_login: evroon
- owner_html_url: https://github.com/evroon
- name: fastapi-boilerplate
html_url: https://github.com/teamhide/fastapi-boilerplate
- stars: 1385
+ stars: 1406
owner_login: teamhide
owner_html_url: https://github.com/teamhide
- name: budgetml
html_url: https://github.com/ebhy/budgetml
- stars: 1345
+ stars: 1346
owner_login: ebhy
owner_html_url: https://github.com/ebhy
- name: fastapi-amis-admin
html_url: https://github.com/amisadmin/fastapi-amis-admin
- stars: 1327
+ stars: 1342
owner_login: amisadmin
owner_html_url: https://github.com/amisadmin
+- name: fastapi-langgraph-agent-production-ready-template
+ html_url: https://github.com/wassim249/fastapi-langgraph-agent-production-ready-template
+ stars: 1334
+ owner_login: wassim249
+ owner_html_url: https://github.com/wassim249
- name: fastapi-tutorial
html_url: https://github.com/liaogx/fastapi-tutorial
- stars: 1297
+ stars: 1303
owner_login: liaogx
owner_html_url: https://github.com/liaogx
- name: fastapi_best_architecture
html_url: https://github.com/fastapi-practices/fastapi_best_architecture
- stars: 1242
+ stars: 1276
owner_login: fastapi-practices
owner_html_url: https://github.com/fastapi-practices
-- name: fastapi-code-generator
- html_url: https://github.com/koxudaxi/fastapi-code-generator
- stars: 1241
- owner_login: koxudaxi
- owner_html_url: https://github.com/koxudaxi
- name: fastcrud
html_url: https://github.com/benavlabs/fastcrud
- stars: 1236
+ stars: 1272
owner_login: benavlabs
owner_html_url: https://github.com/benavlabs
+- name: fastapi-code-generator
+ html_url: https://github.com/koxudaxi/fastapi-code-generator
+ stars: 1253
+ owner_login: koxudaxi
+ owner_html_url: https://github.com/koxudaxi
- name: prometheus-fastapi-instrumentator
html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator
- stars: 1217
+ stars: 1246
owner_login: trallnag
owner_html_url: https://github.com/trallnag
- name: bolt-python
html_url: https://github.com/slackapi/bolt-python
- stars: 1209
+ stars: 1221
owner_login: slackapi
owner_html_url: https://github.com/slackapi
- name: bedrock-chat
html_url: https://github.com/aws-samples/bedrock-chat
- stars: 1199
+ stars: 1220
owner_login: aws-samples
owner_html_url: https://github.com/aws-samples
- name: fastapi_production_template
html_url: https://github.com/zhanymkanov/fastapi_production_template
- stars: 1182
+ stars: 1202
owner_login: zhanymkanov
owner_html_url: https://github.com/zhanymkanov
+- name: fastapi-scaff
+ html_url: https://github.com/atpuxiner/fastapi-scaff
+ stars: 1193
+ owner_login: atpuxiner
+ owner_html_url: https://github.com/atpuxiner
- name: langchain-extract
html_url: https://github.com/langchain-ai/langchain-extract
- stars: 1162
+ stars: 1164
owner_login: langchain-ai
owner_html_url: https://github.com/langchain-ai
-- name: fastapi-langgraph-agent-production-ready-template
- html_url: https://github.com/wassim249/fastapi-langgraph-agent-production-ready-template
- stars: 1150
- owner_login: wassim249
- owner_html_url: https://github.com/wassim249
- name: fastapi-alembic-sqlmodel-async
html_url: https://github.com/jonra1993/fastapi-alembic-sqlmodel-async
- stars: 1145
+ stars: 1149
owner_login: jonra1993
owner_html_url: https://github.com/jonra1993
- name: odmantic
html_url: https://github.com/art049/odmantic
- stars: 1130
+ stars: 1133
owner_login: art049
owner_html_url: https://github.com/art049
- name: restish
html_url: https://github.com/rest-sh/restish
- stars: 1107
+ stars: 1122
owner_login: rest-sh
owner_html_url: https://github.com/rest-sh
-- name: fastapi-scaff
- html_url: https://github.com/atpuxiner/fastapi-scaff
- stars: 1052
- owner_login: atpuxiner
- owner_html_url: https://github.com/atpuxiner
- name: runhouse
html_url: https://github.com/run-house/runhouse
- stars: 1043
+ stars: 1047
owner_login: run-house
owner_html_url: https://github.com/run-house
- name: flock
html_url: https://github.com/Onelevenvy/flock
- stars: 1010
+ stars: 1027
owner_login: Onelevenvy
owner_html_url: https://github.com/Onelevenvy
+- name: authx
+ html_url: https://github.com/yezz123/authx
+ stars: 999
+ owner_login: yezz123
+ owner_html_url: https://github.com/yezz123
- name: autollm
html_url: https://github.com/viddexa/autollm
- stars: 995
+ stars: 999
owner_login: viddexa
owner_html_url: https://github.com/viddexa
- name: lanarky
html_url: https://github.com/ajndkr/lanarky
- stars: 994
+ stars: 995
owner_login: ajndkr
owner_html_url: https://github.com/ajndkr
-- name: authx
- html_url: https://github.com/yezz123/authx
- stars: 978
- owner_login: yezz123
- owner_html_url: https://github.com/yezz123
-- name: secure
- html_url: https://github.com/TypeError/secure
- stars: 942
- owner_login: TypeError
- owner_html_url: https://github.com/TypeError
- name: titiler
html_url: https://github.com/developmentseed/titiler
- stars: 940
+ stars: 952
owner_login: developmentseed
owner_html_url: https://github.com/developmentseed
- name: energy-forecasting
html_url: https://github.com/iusztinpaul/energy-forecasting
- stars: 937
+ stars: 946
owner_login: iusztinpaul
owner_html_url: https://github.com/iusztinpaul
+- name: secure
+ html_url: https://github.com/TypeError/secure
+ stars: 944
+ owner_login: TypeError
+ owner_html_url: https://github.com/TypeError
- name: langcorn
html_url: https://github.com/msoedov/langcorn
- stars: 933
+ stars: 934
owner_login: msoedov
owner_html_url: https://github.com/msoedov
-- name: fastapi-do-zero
- html_url: https://github.com/dunossauro/fastapi-do-zero
- stars: 892
- owner_login: dunossauro
- owner_html_url: https://github.com/dunossauro
-- name: marker-api
- html_url: https://github.com/adithya-s-k/marker-api
- stars: 890
- owner_login: adithya-s-k
- owner_html_url: https://github.com/adithya-s-k
- name: RuoYi-Vue3-FastAPI
html_url: https://github.com/insistence/RuoYi-Vue3-FastAPI
- stars: 884
+ stars: 930
owner_login: insistence
owner_html_url: https://github.com/insistence
- name: aktools
html_url: https://github.com/akfamily/aktools
- stars: 880
+ stars: 916
owner_login: akfamily
owner_html_url: https://github.com/akfamily
+- name: every-pdf
+ html_url: https://github.com/DDULDDUCK/every-pdf
+ stars: 907
+ owner_login: DDULDDUCK
+ owner_html_url: https://github.com/DDULDDUCK
+- name: marker-api
+ html_url: https://github.com/adithya-s-k/marker-api
+ stars: 903
+ owner_login: adithya-s-k
+ owner_html_url: https://github.com/adithya-s-k
- name: fastapi-observability
html_url: https://github.com/blueswen/fastapi-observability
- stars: 880
+ stars: 902
owner_login: blueswen
owner_html_url: https://github.com/blueswen
-- name: httpdbg
- html_url: https://github.com/cle-b/httpdbg
- stars: 876
- owner_login: cle-b
- owner_html_url: https://github.com/cle-b
+- name: fastapi-do-zero
+ html_url: https://github.com/dunossauro/fastapi-do-zero
+ stars: 900
+ owner_login: dunossauro
+ owner_html_url: https://github.com/dunossauro
diff --git a/docs/en/data/translation_reviewers.yml b/docs/en/data/translation_reviewers.yml
index efcf81c9d..68ef01f6d 100644
--- a/docs/en/data/translation_reviewers.yml
+++ b/docs/en/data/translation_reviewers.yml
@@ -63,6 +63,11 @@ cassiobotaro:
count: 62
avatarUrl: https://avatars.githubusercontent.com/u/3127847?u=a08022b191ddbd0a6159b2981d9d878b6d5bb71f&v=4
url: https://github.com/cassiobotaro
+nilslindemann:
+ login: nilslindemann
+ count: 59
+ avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
+ url: https://github.com/nilslindemann
mattwang44:
login: mattwang44
count: 59
@@ -70,7 +75,7 @@ mattwang44:
url: https://github.com/mattwang44
tiangolo:
login: tiangolo
- count: 53
+ count: 55
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
url: https://github.com/tiangolo
Laineyzhang55:
@@ -108,16 +113,16 @@ Rishat-F:
count: 42
avatarUrl: https://avatars.githubusercontent.com/u/66554797?v=4
url: https://github.com/Rishat-F
-nilslindemann:
- login: nilslindemann
- count: 41
- avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
- url: https://github.com/nilslindemann
Winand:
login: Winand
count: 40
avatarUrl: https://avatars.githubusercontent.com/u/53390?u=bb0e71a2fc3910a8e0ee66da67c33de40ea695f8&v=4
url: https://github.com/Winand
+YuriiMotov:
+ login: YuriiMotov
+ count: 40
+ avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=b9b13d598dddfab529a52d264df80a900bfe7060&v=4
+ url: https://github.com/YuriiMotov
solomein-sv:
login: solomein-sv
count: 38
@@ -131,7 +136,7 @@ JavierSanchezCastro:
alejsdev:
login: alejsdev
count: 37
- avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=638c65283ac9e9e2c3a0f9d1e3370db4b8a2c58d&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=447d12a1b347f466b35378bee4c7104cc9b2c571&v=4
url: https://github.com/alejsdev
stlucasgarcia:
login: stlucasgarcia
@@ -173,11 +178,6 @@ romashevchenko:
count: 32
avatarUrl: https://avatars.githubusercontent.com/u/132477732?v=4
url: https://github.com/romashevchenko
-YuriiMotov:
- login: YuriiMotov
- count: 31
- avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=b9b13d598dddfab529a52d264df80a900bfe7060&v=4
- url: https://github.com/YuriiMotov
LorhanSohaky:
login: LorhanSohaky
count: 30
@@ -606,7 +606,7 @@ socket-socket:
nick-cjyx9:
login: nick-cjyx9
count: 10
- avatarUrl: https://avatars.githubusercontent.com/u/119087246?u=c35aab03f082430be8a1edd80f5625b44819a0d8&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/119087246?u=7227a2de948c68fb8396d5beff1ee5b0e057c42e&v=4
url: https://github.com/nick-cjyx9
lucasbalieiro:
login: lucasbalieiro
@@ -986,7 +986,7 @@ esrefzeki:
dtleal:
login: dtleal
count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/31096951?v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/31096951?u=704664ec74ab655485e5c909b25de3fa09a922ba&v=4
url: https://github.com/dtleal
art3xa:
login: art3xa
@@ -1023,11 +1023,6 @@ devluisrodrigues:
count: 5
avatarUrl: https://avatars.githubusercontent.com/u/21125286?v=4
url: https://github.com/11kkw
-soroushgh1:
- login: soroushgh1
- count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/178516095?u=5e26f6a5f66cdb32d7b56e6ab362bf18ba7858b9&v=4
- url: https://github.com/soroushgh1
lpdswing:
login: lpdswing
count: 4
@@ -1166,7 +1161,7 @@ cookie-byte217:
AbolfazlKameli:
login: AbolfazlKameli
count: 4
- avatarUrl: https://avatars.githubusercontent.com/u/120686133?u=ad99cb0adb4a2091f552f9d7281ced334150f9c2&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/120686133?u=e41743da3c1820efafc59c5870cacd4f4425334c&v=4
url: https://github.com/AbolfazlKameli
tyronedamasceno:
login: tyronedamasceno
diff --git a/docs/en/data/translators.yml b/docs/en/data/translators.yml
index b0f570e5c..cf61eee8e 100644
--- a/docs/en/data/translators.yml
+++ b/docs/en/data/translators.yml
@@ -1,6 +1,6 @@
nilslindemann:
login: nilslindemann
- count: 120
+ count: 122
avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
url: https://github.com/nilslindemann
jaystone776:
@@ -118,6 +118,11 @@ batlopes:
count: 6
avatarUrl: https://avatars.githubusercontent.com/u/33462923?u=0fb3d7acb316764616f11e4947faf080e49ad8d9&v=4
url: https://github.com/batlopes
+tiangolo:
+ login: tiangolo
+ count: 6
+ avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
+ url: https://github.com/tiangolo
lucasbalieiro:
login: lucasbalieiro
count: 6
@@ -143,11 +148,6 @@ Attsun1031:
count: 5
avatarUrl: https://avatars.githubusercontent.com/u/1175560?v=4
url: https://github.com/Attsun1031
-tiangolo:
- login: tiangolo
- count: 5
- avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
- url: https://github.com/tiangolo
rostik1410:
login: rostik1410
count: 5
@@ -286,7 +286,7 @@ hsuanchi:
alejsdev:
login: alejsdev
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=638c65283ac9e9e2c3a0f9d1e3370db4b8a2c58d&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=447d12a1b347f466b35378bee4c7104cc9b2c571&v=4
url: https://github.com/alejsdev
riroan:
login: riroan
@@ -471,7 +471,7 @@ emrhnsyts:
vusallyv:
login: vusallyv
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/85983771?u=53a7b755cb338d9313966dbf2e4e68b512565186&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/85983771?u=6fb8e2f876bca06e9f846606423c8f18fb46ad06&v=4
url: https://github.com/vusallyv
jackleeio:
login: jackleeio
@@ -543,3 +543,8 @@ EdmilsonRodrigues:
count: 2
avatarUrl: https://avatars.githubusercontent.com/u/62777025?u=217d6f3cd6cc750bb8818a3af7726c8d74eb7c2d&v=4
url: https://github.com/EdmilsonRodrigues
+YuriiMotov:
+ login: YuriiMotov
+ count: 2
+ avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=b9b13d598dddfab529a52d264df80a900bfe7060&v=4
+ url: https://github.com/YuriiMotov
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index 4eb7dd9ae..55a941535 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -7,14 +7,54 @@ hide:
## Latest Changes
+## 0.118.3
+
+### Upgrades
+
+* ⬆️ Add support for Python 3.14. PR [#14165](https://github.com/fastapi/fastapi/pull/14165) by [@svlandeg](https://github.com/svlandeg).
+
+## 0.118.2
+
+### Fixes
+
+* 🐛 Fix tagged discriminated union not recognized as body field. PR [#12942](https://github.com/fastapi/fastapi/pull/12942) by [@frankie567](https://github.com/frankie567).
+
+### Internal
+
+* ⬆ Bump astral-sh/setup-uv from 6 to 7. PR [#14167](https://github.com/fastapi/fastapi/pull/14167) by [@dependabot[bot]](https://github.com/apps/dependabot).
+
+## 0.118.1
+
+### Upgrades
+
+* 👽️ Ensure compatibility with Pydantic 2.12.0. PR [#14036](https://github.com/fastapi/fastapi/pull/14036) by [@cjwatson](https://github.com/cjwatson).
+
+### Docs
+
+* 📝 Add External Link: Getting started with logging in FastAPI. PR [#14152](https://github.com/fastapi/fastapi/pull/14152) by [@itssimon](https://github.com/itssimon).
+
### Translations
+* 🔨 Add Russian translations LLM prompt. PR [#13936](https://github.com/fastapi/fastapi/pull/13936) by [@tiangolo](https://github.com/tiangolo).
+* 🌐 Sync German docs. PR [#14149](https://github.com/fastapi/fastapi/pull/14149) by [@nilslindemann](https://github.com/nilslindemann).
* 🌐 Add Russian translations for missing pages (LLM-generated). PR [#14135](https://github.com/fastapi/fastapi/pull/14135) by [@YuriiMotov](https://github.com/YuriiMotov).
* 🌐 Update Russian translations for existing pages (LLM-generated). PR [#14123](https://github.com/fastapi/fastapi/pull/14123) by [@YuriiMotov](https://github.com/YuriiMotov).
* 🌐 Remove configuration files for inactive translations. PR [#14130](https://github.com/fastapi/fastapi/pull/14130) by [@tiangolo](https://github.com/tiangolo).
### Internal
+* 🔨 Move local coverage logic to its own script. PR [#14166](https://github.com/fastapi/fastapi/pull/14166) by [@tiangolo](https://github.com/tiangolo).
+* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#14161](https://github.com/fastapi/fastapi/pull/14161) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+* ⬆ Bump griffe-typingdoc from 0.2.8 to 0.2.9. PR [#14144](https://github.com/fastapi/fastapi/pull/14144) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* ⬆ Bump mkdocs-macros-plugin from 1.3.9 to 1.4.0. PR [#14145](https://github.com/fastapi/fastapi/pull/14145) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* ⬆ Bump markdown-include-variants from 0.0.4 to 0.0.5. PR [#14146](https://github.com/fastapi/fastapi/pull/14146) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#14126](https://github.com/fastapi/fastapi/pull/14126) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
+* 👥 Update FastAPI GitHub topic repositories. PR [#14150](https://github.com/fastapi/fastapi/pull/14150) by [@tiangolo](https://github.com/tiangolo).
+* 👥 Update FastAPI People - Sponsors. PR [#14139](https://github.com/fastapi/fastapi/pull/14139) by [@tiangolo](https://github.com/tiangolo).
+* 👥 Update FastAPI People - Contributors and Translators. PR [#14138](https://github.com/fastapi/fastapi/pull/14138) by [@tiangolo](https://github.com/tiangolo).
+* ⬆ Bump ruff from 0.12.7 to 0.13.2. PR [#14147](https://github.com/fastapi/fastapi/pull/14147) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* ⬆ Bump sqlmodel from 0.0.24 to 0.0.25. PR [#14143](https://github.com/fastapi/fastapi/pull/14143) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* ⬆ Bump tiangolo/issue-manager from 0.5.1 to 0.6.0. PR [#14148](https://github.com/fastapi/fastapi/pull/14148) by [@dependabot[bot]](https://github.com/apps/dependabot).
* 👷 Update docs previews comment, single comment, add failure status. PR [#14129](https://github.com/fastapi/fastapi/pull/14129) by [@tiangolo](https://github.com/tiangolo).
* 🔨 Modify `mkdocs_hooks.py` to add `title` to page's metadata (remove permalinks in social cards). PR [#14125](https://github.com/fastapi/fastapi/pull/14125) by [@YuriiMotov](https://github.com/YuriiMotov).
diff --git a/docs/ru/llm-prompt.md b/docs/ru/llm-prompt.md
new file mode 100644
index 000000000..6a437bdd1
--- /dev/null
+++ b/docs/ru/llm-prompt.md
@@ -0,0 +1,94 @@
+Translate to Russian (русский язык).
+
+Language code: ru.
+
+---
+
+Use a neutral tone (not overly formal or informal).
+
+Use correct Russian grammar — appropriate cases, suffixes, and endings depending on context.
+
+For the following technical terms, use these specific translations to ensure consistency and clarity across the documentation:
+
+* production (meaning production software or environment): продакшн (do not change the ending, for example, translate `in production` as `в продакшн` (not `в продакшене`))
+* completion (meaning code auto-completion): автозавершение
+* editor (meaning component of IDE): редактор кода
+* adopt (meaning start to use): использовать (or `начать использовать`)
+* headers (meaning HTTP-headers): HTTP-заголовки
+* cookie sessions: сессии с использованием cookie
+* tested (adjective): протестированный
+* middleware: middleware (don't translate, but add `промежуточный слой` if clarification is needed)
+* path operation: операция пути (optionally clarify as `обработчик пути`)
+* path operation function: функция-обработчик пути (or `функция обработки пути`)
+* proprietary: проприетарный
+* benchmark: бенчмарк (add (`тест производительности`) if clarification is needed or use just `тест производительности`)
+* ASGI server: ASGI-сервер
+* In a hurry? : Нет времени?
+* response status code: статус-код ответа
+* HTTP status code: HTTP статус-код
+* issue (meaning GitHub issue): Issue (add `тикет\обращение` if clarification is needed)
+* PR (meaning GitHub pull request): пулл-реквест (add `запрос на изменение` if clarification is needed)
+* run (meaning run the code): запустить (or `прогнать` if it's about testing the program)
+* to reach users: донести до пользователей (or `привлечь внимание пользователей` in the promotion context)
+* body (meaning HTTP request body): тело запроса
+* body (meaning HTTP response body): тело ответа
+* body parameter : body-параметр (or `параметр тела запроса`)
+* validate: валидировать (or `выполнить валидацию`)
+* requirements (meaning dependencies): зависимости
+* auto-reload: авто-перезагрузка (or `перезагрузить автоматически` if used as a verb)
+* show (meaning show on the screen): отобразить
+* parsing (noun): парсинг
+* origin (in web development): origin (add `источник` if clarification is needed)
+* include: включать (add `в себя` if it's appropriate, or use `содержать` as an alternative)
+* virtual environment: виртуальное окружение
+* framework: фреймворк
+* path paremeter: path-параметр
+* path (as in URL path): путь
+* form (as in HTML form): форма
+* media type: тип содержимого (or `медиа-тип`)
+* request: HTTP-запрос
+* response: HTTP-ответ
+* type hints: аннотации типов
+* type annotations: аннотации типов
+* context manager: менеджер контекста
+* code base: кодовая база
+* instantiate: создать экземпляр (avoid "инстанцировать")
+* load balancer: балансировщик нагрузки
+* load balance: балансировка нагрузки
+* worker process: воркер-процесс (or `процесс воркера`)
+* worker: воркер
+* lifespan: lifespan (do not translate when it's about lifespan events, but translate as `жизненный цикл` or `срок жизни` in other cases)
+* mount (verb): монтировать
+* mount (noun): точка монтирования / mount (keep in English if it's a FastAPI keyword)
+* plugin: плагин
+* plug-in: плагин
+* full stack: full stack (do not translate)
+* full-stack: full-stack (do not translate)
+* loop (as in async loop): цикл событий
+* Machine Learning: Машинное обучение
+* Deep Learning: Глубокое обучение
+* callback hell: callback hell (clarify as `ад обратных вызовов`)
+* on the fly: на лету
+* scratch the surface: поверхностно ознакомиться
+* tip: совет (or `подсказка` depending on context)
+* Pydantic model: Pydantic-модель (`модель Pydantic` and `Pydantic модель` are also fine)
+* declare: объявить
+* have the next best performance, after: быть на следующем месте по производительности после
+* timing attack: тайминговая атака (clarify `атака по времени` if needed)
+* OAuth2 scope: OAuth2 scope (clarify `область` if needed)
+* TLS Termination Proxy: прокси-сервер TSL-терминации
+* utilize (resources): использовать
+* сontent: содержимое (or `контент`)
+* raise exception: вызвать исключение (also possible to use `сгенерировать исключение` or `выбросить исключение`)
+* password flow: password flow (clarify as `аутентификация по паролю` if needed)
+* tutorial: руководство (or `учебник`)
+* too long; didn't read: слишком длинно; не читал
+* proxy with a stripped path prefix: прокси с функцией удаления префикса пути
+* nerd: умник
+* sub application: подприложение
+* webhook request: вебхук-запрос
+* serve (meaning providing access to something): «отдавать» (or `предоставлять доступ к`)
+* recap (noun): резюме
+* utility function: вспомогательная функция
+
+Do not add whitespace in `т.д.`, `т.п.`.
diff --git a/fastapi/__init__.py b/fastapi/__init__.py
index 03a5aaad5..297d993d6 100644
--- a/fastapi/__init__.py
+++ b/fastapi/__init__.py
@@ -1,6 +1,6 @@
"""FastAPI framework, high performance, easy to learn, fast to code, ready for production"""
-__version__ = "0.118.0"
+__version__ = "0.118.3"
from starlette import status as status
diff --git a/fastapi/_compat.py b/fastapi/_compat.py
index 26b6638c8..21ea1a237 100644
--- a/fastapi/_compat.py
+++ b/fastapi/_compat.py
@@ -1,3 +1,4 @@
+import warnings
from collections import deque
from copy import copy
from dataclasses import dataclass, is_dataclass
@@ -109,9 +110,20 @@ if PYDANTIC_V2:
return self.field_info.annotation
def __post_init__(self) -> None:
- self._type_adapter: TypeAdapter[Any] = TypeAdapter(
- Annotated[self.field_info.annotation, self.field_info]
- )
+ with warnings.catch_warnings():
+ # Pydantic >= 2.12.0 warns about field specific metadata that is unused
+ # (e.g. `TypeAdapter(Annotated[int, Field(alias='b')])`). In some cases, we
+ # end up building the type adapter from a model field annotation so we
+ # need to ignore the warning:
+ if PYDANTIC_VERSION_MINOR_TUPLE >= (2, 12):
+ from pydantic.warnings import UnsupportedFieldAttributeWarning
+
+ warnings.simplefilter(
+ "ignore", category=UnsupportedFieldAttributeWarning
+ )
+ self._type_adapter: TypeAdapter[Any] = TypeAdapter(
+ Annotated[self.field_info.annotation, self.field_info]
+ )
def get_default(self) -> Any:
if self.field_info.is_required():
@@ -578,6 +590,9 @@ def field_annotation_is_complex(annotation: Union[Type[Any], None]) -> bool:
if origin is Union or origin is UnionType:
return any(field_annotation_is_complex(arg) for arg in get_args(annotation))
+ if origin is Annotated:
+ return field_annotation_is_complex(get_args(annotation)[0])
+
return (
_annotation_is_complex(annotation)
or _annotation_is_complex(origin)
diff --git a/fastapi/params.py b/fastapi/params.py
index 8f5601dd3..e85375018 100644
--- a/fastapi/params.py
+++ b/fastapi/params.py
@@ -22,7 +22,7 @@ class ParamTypes(Enum):
cookie = "cookie"
-class Param(FieldInfo):
+class Param(FieldInfo): # type: ignore[misc]
in_: ParamTypes
def __init__(
@@ -136,7 +136,7 @@ class Param(FieldInfo):
return f"{self.__class__.__name__}({self.default})"
-class Path(Param):
+class Path(Param): # type: ignore[misc]
in_ = ParamTypes.path
def __init__(
@@ -222,7 +222,7 @@ class Path(Param):
)
-class Query(Param):
+class Query(Param): # type: ignore[misc]
in_ = ParamTypes.query
def __init__(
@@ -306,7 +306,7 @@ class Query(Param):
)
-class Header(Param):
+class Header(Param): # type: ignore[misc]
in_ = ParamTypes.header
def __init__(
@@ -392,7 +392,7 @@ class Header(Param):
)
-class Cookie(Param):
+class Cookie(Param): # type: ignore[misc]
in_ = ParamTypes.cookie
def __init__(
@@ -476,7 +476,7 @@ class Cookie(Param):
)
-class Body(FieldInfo):
+class Body(FieldInfo): # type: ignore[misc]
def __init__(
self,
default: Any = Undefined,
@@ -593,7 +593,7 @@ class Body(FieldInfo):
return f"{self.__class__.__name__}({self.default})"
-class Form(Body):
+class Form(Body): # type: ignore[misc]
def __init__(
self,
default: Any = Undefined,
@@ -677,7 +677,7 @@ class Form(Body):
)
-class File(Form):
+class File(Form): # type: ignore[misc]
def __init__(
self,
default: Any = Undefined,
diff --git a/pyproject.toml b/pyproject.toml
index 41ef1eb76..cac8059f4 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -39,6 +39,7 @@ classifiers = [
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
+ "Programming Language :: Python :: 3.14",
"Topic :: Internet :: WWW/HTTP :: HTTP Servers",
"Topic :: Internet :: WWW/HTTP",
]
diff --git a/requirements-docs-tests.txt b/requirements-docs-tests.txt
index c1107b9b0..a909d0eef 100644
--- a/requirements-docs-tests.txt
+++ b/requirements-docs-tests.txt
@@ -1,4 +1,4 @@
# For mkdocstrings and tests
httpx >=0.23.0,<1.0.0
# For linting and generating docs versions
-ruff ==0.12.7
+ruff ==0.13.2
diff --git a/requirements-docs.txt b/requirements-docs.txt
index 24b79236c..0013f9f79 100644
--- a/requirements-docs.txt
+++ b/requirements-docs.txt
@@ -12,8 +12,8 @@ pillow==11.3.0
# For image processing by Material for MkDocs
cairosvg==2.8.2
mkdocstrings[python]==0.26.1
-griffe-typingdoc==0.2.8
+griffe-typingdoc==0.2.9
# For griffe, it formats with black
black==25.1.0
-mkdocs-macros-plugin==1.3.9
-markdown-include-variants==0.0.4
+mkdocs-macros-plugin==1.4.0
+markdown-include-variants==0.0.5
diff --git a/requirements-tests.txt b/requirements-tests.txt
index 53ec28d2e..c5de4157e 100644
--- a/requirements-tests.txt
+++ b/requirements-tests.txt
@@ -4,7 +4,7 @@ pytest >=7.1.3,<9.0.0
coverage[toml] >= 6.5.0,< 8.0
mypy ==1.14.1
dirty-equals ==0.9.0
-sqlmodel==0.0.24
+sqlmodel==0.0.27
flask >=1.1.2,<4.0.0
anyio[trio] >=3.2.1,<5.0.0
PyJWT==2.9.0
diff --git a/scripts/coverage.sh b/scripts/coverage.sh
new file mode 100755
index 000000000..e07b51ec5
--- /dev/null
+++ b/scripts/coverage.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+set -e
+set -x
+
+coverage combine
+coverage report
+coverage html
diff --git a/scripts/test-cov-html.sh b/scripts/test-cov-html.sh
index 517ac6422..f87f906dc 100755
--- a/scripts/test-cov-html.sh
+++ b/scripts/test-cov-html.sh
@@ -4,6 +4,4 @@ set -e
set -x
bash scripts/test.sh ${@}
-coverage combine
-coverage report
-coverage html
+bash scripts/coverage.sh
diff --git a/tests/test_multi_body_errors.py b/tests/test_multi_body_errors.py
index 0102f0f1a..33304827a 100644
--- a/tests/test_multi_body_errors.py
+++ b/tests/test_multi_body_errors.py
@@ -185,7 +185,15 @@ def test_openapi_schema():
"title": "Age",
"anyOf": [
{"exclusiveMinimum": 0.0, "type": "number"},
- {"type": "string"},
+ IsOneOf(
+ # pydantic < 2.12.0
+ {"type": "string"},
+ # pydantic >= 2.12.0
+ {
+ "type": "string",
+ "pattern": r"^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$",
+ },
+ ),
],
}
)
diff --git a/tests/test_tutorial/test_sql_databases/test_tutorial001.py b/tests/test_tutorial/test_sql_databases/test_tutorial001.py
index cc7e590df..6604a2fd3 100644
--- a/tests/test_tutorial/test_sql_databases/test_tutorial001.py
+++ b/tests/test_tutorial/test_sql_databases/test_tutorial001.py
@@ -45,6 +45,8 @@ def get_client(request: pytest.FixtureRequest):
with TestClient(mod.app) as c:
yield c
+ # Clean up connection explicitely to avoid resource warning
+ mod.engine.dispose()
def test_crud_app(client: TestClient):
diff --git a/tests/test_tutorial/test_sql_databases/test_tutorial002.py b/tests/test_tutorial/test_sql_databases/test_tutorial002.py
index 8a98f9a2d..2c4e0988c 100644
--- a/tests/test_tutorial/test_sql_databases/test_tutorial002.py
+++ b/tests/test_tutorial/test_sql_databases/test_tutorial002.py
@@ -45,6 +45,8 @@ def get_client(request: pytest.FixtureRequest):
with TestClient(mod.app) as c:
yield c
+ # Clean up connection explicitely to avoid resource warning
+ mod.engine.dispose()
def test_crud_app(client: TestClient):
diff --git a/tests/test_union_body_discriminator.py b/tests/test_union_body_discriminator.py
new file mode 100644
index 000000000..6af9e1d22
--- /dev/null
+++ b/tests/test_union_body_discriminator.py
@@ -0,0 +1,188 @@
+from typing import Any, Dict, Union
+
+from dirty_equals import IsDict
+from fastapi import FastAPI
+from fastapi.testclient import TestClient
+from inline_snapshot import snapshot
+from pydantic import BaseModel, Field
+from typing_extensions import Annotated, Literal
+
+from .utils import needs_pydanticv2
+
+
+@needs_pydanticv2
+def test_discriminator_pydantic_v2() -> None:
+ from pydantic import Tag
+
+ app = FastAPI()
+
+ class FirstItem(BaseModel):
+ value: Literal["first"]
+ price: int
+
+ class OtherItem(BaseModel):
+ value: Literal["other"]
+ price: float
+
+ Item = Annotated[
+ Union[Annotated[FirstItem, Tag("first")], Annotated[OtherItem, Tag("other")]],
+ Field(discriminator="value"),
+ ]
+
+ @app.post("/items/")
+ def save_union_body_discriminator(
+ item: Item, q: Annotated[str, Field(description="Query string")]
+ ) -> Dict[str, Any]:
+ return {"item": item}
+
+ client = TestClient(app)
+ response = client.post("/items/?q=first", json={"value": "first", "price": 100})
+ assert response.status_code == 200, response.text
+ assert response.json() == {"item": {"value": "first", "price": 100}}
+
+ response = client.post("/items/?q=other", json={"value": "other", "price": 100.5})
+ assert response.status_code == 200, response.text
+ assert response.json() == {"item": {"value": "other", "price": 100.5}}
+
+ response = client.get("/openapi.json")
+ assert response.status_code == 200, response.text
+ assert response.json() == snapshot(
+ {
+ "openapi": "3.1.0",
+ "info": {"title": "FastAPI", "version": "0.1.0"},
+ "paths": {
+ "/items/": {
+ "post": {
+ "summary": "Save Union Body Discriminator",
+ "operationId": "save_union_body_discriminator_items__post",
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "required": True,
+ "schema": {
+ "type": "string",
+ "description": "Query string",
+ "title": "Q",
+ },
+ }
+ ],
+ "requestBody": {
+ "required": True,
+ "content": {
+ "application/json": {
+ "schema": {
+ "oneOf": [
+ {"$ref": "#/components/schemas/FirstItem"},
+ {"$ref": "#/components/schemas/OtherItem"},
+ ],
+ "discriminator": {
+ "propertyName": "value",
+ "mapping": {
+ "first": "#/components/schemas/FirstItem",
+ "other": "#/components/schemas/OtherItem",
+ },
+ },
+ "title": "Item",
+ }
+ }
+ },
+ },
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": IsDict(
+ {
+ # Pydantic 2.10, in Python 3.8
+ # TODO: remove when dropping support for Python 3.8
+ "type": "object",
+ "title": "Response Save Union Body Discriminator Items Post",
+ }
+ )
+ | IsDict(
+ {
+ "type": "object",
+ "additionalProperties": True,
+ "title": "Response Save Union Body Discriminator Items Post",
+ }
+ )
+ }
+ },
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ },
+ },
+ },
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "FirstItem": {
+ "properties": {
+ "value": {
+ "type": "string",
+ "const": "first",
+ "title": "Value",
+ },
+ "price": {"type": "integer", "title": "Price"},
+ },
+ "type": "object",
+ "required": ["value", "price"],
+ "title": "FirstItem",
+ },
+ "HTTPValidationError": {
+ "properties": {
+ "detail": {
+ "items": {
+ "$ref": "#/components/schemas/ValidationError"
+ },
+ "type": "array",
+ "title": "Detail",
+ }
+ },
+ "type": "object",
+ "title": "HTTPValidationError",
+ },
+ "OtherItem": {
+ "properties": {
+ "value": {
+ "type": "string",
+ "const": "other",
+ "title": "Value",
+ },
+ "price": {"type": "number", "title": "Price"},
+ },
+ "type": "object",
+ "required": ["value", "price"],
+ "title": "OtherItem",
+ },
+ "ValidationError": {
+ "properties": {
+ "loc": {
+ "items": {
+ "anyOf": [{"type": "string"}, {"type": "integer"}]
+ },
+ "type": "array",
+ "title": "Location",
+ },
+ "msg": {"type": "string", "title": "Message"},
+ "type": {"type": "string", "title": "Error Type"},
+ },
+ "type": "object",
+ "required": ["loc", "msg", "type"],
+ "title": "ValidationError",
+ },
+ }
+ },
+ }
+ )