869 changed files with 20620 additions and 18595 deletions
+2 -2
View File
@@ -4,8 +4,8 @@ This is a mirror of the Fastapi repository.
**Synced from:** https://github.com/tiangolo/fastapi.git **Synced from:** https://github.com/tiangolo/fastapi.git
**Branch:** master **Branch:** master
**Commit:** 7cb06f360dd44efac059848df1a9beee7643b018 **Commit:** 50113da16fec53b66b80d75e80a89296de4fa5a5
**Sync Date:** 2026-07-11 **Sync Date:** 2026-09-11
**Content:** Paths: docs, docs_src **Content:** Paths: docs, docs_src
--- ---
@@ -18,7 +18,7 @@ Für diese zusätzlichen Responses müssen Sie jedoch sicherstellen, dass Sie ei
Sie können Ihren *Pfadoperation-Dekoratoren* einen Parameter `responses` übergeben. Sie können Ihren *Pfadoperation-Dekoratoren* einen Parameter `responses` übergeben.
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. 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`. Jedes dieser Response-`dict`s kann einen Schlüssel `model` haben, welcher ein Pydantic-Modell enthält, genau wie `response_model`.
@@ -185,7 +185,7 @@ Beachten Sie, dass Sie das Bild direkt mit einer `FileResponse` zurückgeben mü
/// note | Hinweis /// note | Hinweis
Sofern Sie in Ihrem Parameter `responses` nicht explizit einen anderen Medientyp angeben, geht FastAPI davon aus, dass die Response denselben Medientyp wie die Haupt-Response-Klasse hat (Standardmäßig `application/json`). Sofern Sie in Ihrem Parameter `responses` nicht explizit einen anderen Medientyp angeben, geht FastAPI davon aus, dass die Response denselben Medientyp wie die Haupt-Response-Klasse hat (standardmäßig `application/json`).
Wenn Sie jedoch eine benutzerdefinierte Response-Klasse mit `None` als Medientyp angegeben haben, verwendet FastAPI `application/json` für jede zusätzliche Response, die über ein zugehöriges Modell verfügt. Wenn Sie jedoch eine benutzerdefinierte Response-Klasse mit `None` als Medientyp angegeben haben, verwendet FastAPI `application/json` für jede zusätzliche Response, die über ein zugehöriges Modell verfügt.
@@ -195,7 +195,7 @@ Wenn Sie jedoch eine benutzerdefinierte Response-Klasse mit `None` als Medientyp
Sie können auch Response-Informationen von mehreren Stellen kombinieren, einschließlich der Parameter `response_model`, `status_code` und `responses`. Sie können auch Response-Informationen von mehreren Stellen kombinieren, einschließlich der Parameter `response_model`, `status_code` und `responses`.
Sie können ein `response_model` deklarieren, indem Sie den Standardstatuscode `200` (oder bei Bedarf einen benutzerdefinierten) verwenden und dann zusätzliche Informationen für dieselbe Response in `responses` direkt im OpenAPI-Schema deklarieren. Sie können ein `response_model` deklarieren, indem Sie den Defaultstatuscode `200` (oder bei Bedarf einen benutzerdefinierten) verwenden und dann zusätzliche Informationen für dieselbe Response in `responses` direkt im OpenAPI-Schema deklarieren.
**FastAPI** behält die zusätzlichen Informationen aus `responses` und kombiniert sie mit dem JSON-Schema aus Ihrem Modell. **FastAPI** behält die zusätzlichen Informationen aus `responses` und kombiniert sie mit dem JSON-Schema aus Ihrem Modell.
@@ -243,5 +243,5 @@ Zum Beispiel:
Um zu sehen, was genau Sie in die Responses aufnehmen können, können Sie die folgenden Abschnitte in der OpenAPI-Spezifikation überprüfen: Um zu sehen, was genau Sie in die Responses aufnehmen können, können Sie die folgenden Abschnitte in der OpenAPI-Spezifikation überprüfen:
* [OpenAPI Responses Object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responses-object), enthält das `Response Object`. * [OpenAPI Responses Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#responses-object), enthält das `Response Object`.
* [OpenAPI Response Object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#response-object), 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`. * [OpenAPI Response Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#response-object), Sie können alles davon direkt in jede Response innerhalb Ihres `responses`-Parameters einfügen. Einschließlich `description`, `headers`, `content` (darin deklarieren Sie verschiedene Medientypen und JSON-Schemas) und `links`.
+1 -1
View File
@@ -45,7 +45,7 @@ Sie können Ihre Tests wie gewohnt ausführen mit:
<div class="termy"> <div class="termy">
```console ```console
$ pytest $ uv run pytest
---> 100% ---> 100%
``` ```
+9 -9
View File
@@ -6,7 +6,7 @@ Diese Proxys könnten HTTPS-Zertifikate und andere Dinge handhaben.
## Proxy-<abbr title="weitergeleitete Header">Forwarded-Header</abbr> { #proxy-forwarded-headers } ## 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. Ein **Proxy** vor Ihrer Anwendung würde normalerweise einige Header on-the-fly setzen, bevor er die Requests an Ihren **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. 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.
@@ -33,7 +33,7 @@ Wenn Ihr **Server** hinter einem vertrauenswürdigen **Proxy** sitzt und nur der
<div class="termy"> <div class="termy">
```console ```console
$ fastapi run --forwarded-allow-ips="*" $ uv run 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) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
@@ -82,7 +82,7 @@ sequenceDiagram
Note over Server: Server interpretiert die Header<br/>(wenn --forwarded-allow-ips gesetzt ist) Note over Server: Server interpretiert die Header<br/>(wenn --forwarded-allow-ips gesetzt ist)
Server->>Proxy: HTTP-Response<br/>mit correkten HTTPS-URLs Server->>Proxy: HTTP-Response<br/>mit korrekten HTTPS-URLs
Proxy->>Client: HTTPS-Response Proxy->>Client: HTTPS-Response
``` ```
@@ -170,7 +170,7 @@ Um dies zu erreichen, können Sie die Kommandozeilenoption `--root-path` wie fol
<div class="termy"> <div class="termy">
```console ```console
$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 $ uv run 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) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
@@ -200,7 +200,7 @@ Wenn Sie Uvicorn dann starten mit:
<div class="termy"> <div class="termy">
```console ```console
$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 $ uv run 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) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
@@ -253,7 +253,7 @@ In einem solchen Fall (ohne ein abgetrenntes Pfadpräfix) würde der Proxy auf e
Sie können das Experiment mit einem abgetrennten Pfadpräfix einfach lokal ausführen, indem Sie [Traefik](https://docs.traefik.io/) verwenden. Sie können das Experiment mit einem abgetrennten Pfadpräfix einfach lokal ausführen, indem Sie [Traefik](https://docs.traefik.io/) verwenden.
[Laden Sie Traefik herunter](https://github.com/containous/traefik/releases), es ist eine einzelne Binärdatei, Sie können die komprimierte Datei extrahieren und sie direkt vom Terminal aus ausführen. [Laden Sie Traefik herunter](https://github.com/traefik/traefik/releases), es ist eine einzelne Binärdatei, Sie können die komprimierte Datei extrahieren und sie direkt vom Terminal aus ausführen.
Dann erstellen Sie eine Datei `traefik.toml` mit: Dann erstellen Sie eine Datei `traefik.toml` mit:
@@ -316,12 +316,12 @@ INFO[0000] Configuration loaded from file: /home/user/awesomeapi/traefik.toml
</div> </div>
Und jetzt starten Sie Ihre Anwendung mit Uvicorn, indem Sie die Option `--root-path` verwenden: Und jetzt starten Sie Ihre Anwendung, indem Sie die Option `--root-path` verwenden:
<div class="termy"> <div class="termy">
```console ```console
$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 $ uv run 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) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
@@ -461,6 +461,6 @@ Dann wird er nicht in das OpenAPI-Schema aufgenommen.
## Mounten einer Unteranwendung { #mounting-a-sub-application } ## Mounten einer Unteranwendung { #mounting-a-sub-application }
Wenn Sie gleichzeitig eine Unteranwendung mounten (wie beschrieben in [Unteranwendungen Mounts](sub-applications.md)) und einen Proxy mit `root_path` verwenden wollen, können Sie das normal tun, wie Sie es erwarten würden. Wenn Sie eine Unteranwendung mounten müssen (wie beschrieben in [Unteranwendungen Mounts](sub-applications.md)) und dabei auch einen Proxy mit `root_path` verwenden, können Sie das normal tun, wie Sie es erwarten würden.
FastAPI verwendet intern den `root_path` auf intelligente Weise, sodass es einfach funktioniert. ✨ FastAPI verwendet intern den `root_path` auf intelligente Weise, sodass es einfach funktioniert. ✨
+5 -6
View File
@@ -1,13 +1,12 @@
# Datenklassen verwenden { #using-dataclasses } # Datenklassen verwenden { #using-dataclasses }
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. 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 [`dataclasses`](https://docs.python.org/3/library/dataclasses.html): Aber FastAPI unterstützt auf die gleiche Weise auch die Verwendung von [`dataclasses`](https://docs.python.org/3/library/dataclasses.html):
{* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *} {* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *}
Das ist dank **Pydantic** ebenfalls möglich, da es [„`dataclasses` intern unterstützt“](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel). Das ist dank **Pydantic** ebenfalls möglich, da es [interne Unterstützung für `dataclasses`](https://pydantic.dev/docs/validation/latest/concepts/dataclasses/#usage-of-stdlib-dataclasses-with-basemodel) bietet.
Auch wenn im obigen 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.
@@ -65,7 +64,7 @@ In diesem Fall können Sie einfach die Standard-`dataclasses` durch `pydantic.da
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. 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 <dfn title="Konvertieren der Daten in ein übertragbares Format">Serialisieren</dfn>. FastAPI ist weiterhin in der Lage, die Daten nach JSON zu <dfn title="die Daten in ein übertragbares Format konvertieren">serialisieren</dfn>.
7. Hier verwendet das `response_model` als Typannotation eine Liste von `Author`-Datenklassen. 7. Hier verwendet das `response_model` als Typannotation eine Liste von `Author`-Datenklassen.
@@ -75,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. 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-a-hurry). 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).
9. Diese *Pfadoperation-Funktion* gibt keine Datenklassen zurück (obwohl dies möglich wäre), sondern eine Liste von Dictionarys mit internen Daten. 9. Diese *Pfadoperation-Funktion* gibt keine Datenklassen zurück (obwohl dies möglich wäre), sondern eine Liste von Dictionarys mit internen Daten.
@@ -83,13 +82,13 @@ In diesem Fall können Sie einfach die Standard-`dataclasses` durch `pydantic.da
Sie können `dataclasses` mit anderen Typannotationen auf vielfältige Weise kombinieren, um komplexe Datenstrukturen zu bilden. Sie können `dataclasses` mit anderen Typannotationen auf vielfältige Weise kombinieren, um komplexe Datenstrukturen zu bilden.
Weitere Einzelheiten finden Sie in den Bemerkungen im Quellcode oben. Weitere spezifische Details finden Sie in den Annotationstipps im Code oben.
## Mehr erfahren { #learn-more } ## Mehr erfahren { #learn-more }
Sie können `dataclasses` auch mit anderen Pydantic-Modellen kombinieren, von ihnen erben, sie in Ihre eigenen Modelle einbinden, usw. 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 [Pydantic-Dokumentation zu Datenklassen](https://docs.pydantic.dev/latest/concepts/dataclasses/). Weitere Informationen finden Sie in der [Pydantic-Dokumentation zu Datenklassen](https://pydantic.dev/docs/validation/latest/concepts/dataclasses/).
## Version { #version } ## Version { #version }
+4 -4
View File
@@ -32,7 +32,7 @@ Wir erstellen eine asynchrone Funktion `lifespan()` mit `yield` wie folgt:
{* ../../docs_src/events/tutorial003_py310.py hl[16,19] *} {* ../../docs_src/events/tutorial003_py310.py hl[16,19] *}
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*. Hier simulieren wir den aufwendigen *Startup*-Vorgang des Ladens 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 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. 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.
@@ -140,7 +140,7 @@ Daher deklarieren wir die Eventhandler-Funktion mit Standard-`def` statt mit `as
### `startup` und `shutdown` zusammen { #startup-and-shutdown-together } ### `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. 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 belegen 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. 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.
@@ -154,9 +154,9 @@ In der technischen ASGI-Spezifikation ist dies Teil des [Lifespan-Protokolls](ht
/// note | Hinweis /// note | Hinweis
Weitere Informationen zu Starlettes `lifespan`-Handlern finden Sie in [Starlettes Lifespan-Dokumentation](https://www.starlette.dev/lifespan/). Weitere Informationen zu Starlettes `lifespan`-Handlern finden Sie in [Starlettes Lifespan-Dokumentation](https://starlette.dev/lifespan/).
Einschließlich, wie man Lifespan-Zustand handhabt, der in anderen Bereichen Ihres Codes verwendet werden kann. Einschließlich, wie Sie Lifespan-Zustand handhaben, der in anderen Bereichen Ihres Codes verwendet werden kann.
/// ///
+3 -3
View File
@@ -6,13 +6,13 @@ Dies vereinfacht es, aktuelle **Dokumentation** und Client-Bibliotheken (<abbr t
In diesem Leitfaden erfahren Sie, wie Sie ein **TypeScript-SDK** für Ihr FastAPI-Backend generieren. In diesem Leitfaden erfahren Sie, wie Sie ein **TypeScript-SDK** für Ihr FastAPI-Backend generieren.
## Open Source SDK-Generatoren { #open-source-sdk-generators } ## Open-Source-SDK-Generatoren { #open-source-sdk-generators }
Eine vielseitige Möglichkeit ist der [OpenAPI Generator](https://openapi-generator.tech/), der **viele Programmiersprachen** unterstützt und SDKs aus Ihrer OpenAPI-Spezifikation generieren kann. Eine vielseitige Möglichkeit ist der [OpenAPI Generator](https://openapi-generator.tech/), der **viele Programmiersprachen** unterstützt und SDKs aus Ihrer OpenAPI-Spezifikation generieren kann.
Für **TypeScript-Clients** ist [Hey API](https://heyapi.dev/) eine speziell entwickelte Lösung, die ein optimiertes Erlebnis für das TypeScript-Ökosystem bietet. Für **TypeScript-Clients** ist [Hey API](https://heyapi.dev/) eine speziell entwickelte Lösung, die ein optimiertes Erlebnis für das TypeScript-Ökosystem bietet.
Weitere SDK-Generatoren finden Sie auf [OpenAPI.Tools](https://openapi.tools/#sdk). Weitere SDK-Generatoren finden Sie auf [OpenAPI.Tools](https://openapi.tools/categories/sdk-generators).
/// tip | Tipp /// tip | Tipp
@@ -50,7 +50,7 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client
Dies generiert ein TypeScript-SDK in `./src/client`. Dies generiert ein TypeScript-SDK in `./src/client`.
Sie können lernen, wie man [`@hey-api/openapi-ts` installiert](https://heyapi.dev/openapi-ts/get-started) und über die [erzeugte Ausgabe](https://heyapi.dev/openapi-ts/output) auf deren Website lesen. Sie können lernen, wie Sie [`@hey-api/openapi-ts` installieren](https://heyapi.dev/openapi-ts/get-started) und über die [erzeugte Ausgabe](https://heyapi.dev/openapi-ts/output) auf deren Website lesen.
### Das SDK verwenden { #using-the-sdk } ### Das SDK verwenden { #using-the-sdk }
+6 -6
View File
@@ -2,9 +2,9 @@
Im Haupttutorial haben Sie gelesen, wie Sie Ihrer Anwendung [benutzerdefinierte Middleware](../tutorial/middleware.md) hinzufügen können. Im Haupttutorial haben Sie gelesen, wie Sie Ihrer Anwendung [benutzerdefinierte Middleware](../tutorial/middleware.md) hinzufügen können.
Und dann auch, wie man [CORS mittels der `CORSMiddleware`](../tutorial/cors.md) handhabt. Und dann haben Sie auch gelesen, wie Sie [CORS mittels der `CORSMiddleware`](../tutorial/cors.md) handhaben.
In diesem Abschnitt werden wir sehen, wie man andere Middlewares verwendet. In diesem Abschnitt werden wir sehen, wie Sie andere Middlewares verwenden.
## ASGI-Middleware hinzufügen { #adding-asgi-middlewares } ## ASGI-Middleware hinzufügen { #adding-asgi-middlewares }
@@ -41,7 +41,7 @@ app.add_middleware(UnicornMiddleware, some_config="rainbow")
## Integrierte Middleware { #integrated-middlewares } ## 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. **FastAPI** enthält mehrere Middlewares für gängige Anwendungsfälle. Wir werden als Nächstes sehen, wie Sie sie verwenden.
/// note | Technische Details /// note | Technische Details
@@ -74,7 +74,7 @@ Wenn ein eingehender Request nicht korrekt validiert wird, wird eine `400`-<abbr
## `GZipMiddleware` { #gzipmiddleware } ## `GZipMiddleware` { #gzipmiddleware }
Verarbeitet GZip-Responses für alle Requests, die gzip im `Accept-Encoding`-Header enthalten. Verarbeitet GZip-Responses für alle Requests, die `"gzip"` im `Accept-Encoding`-Header enthalten.
Diese Middleware verarbeitet sowohl Standard- als auch Streaming-Responses. Diese Middleware verarbeitet sowohl Standard- als auch Streaming-Responses.
@@ -91,7 +91,7 @@ Es gibt viele andere ASGI-Middlewares.
Zum Beispiel: Zum Beispiel:
* [Uvicorns `ProxyHeadersMiddleware`](https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py) * [Uvicorns `ProxyHeadersMiddleware`](https://github.com/Kludex/uvicorn/blob/main/uvicorn/middleware/proxy_headers.py)
* [MessagePack](https://github.com/florimondmanca/msgpack-asgi) * [MessagePack](https://github.com/florimondmanca/msgpack-asgi)
Um mehr über weitere verfügbare Middlewares herauszufinden, besuchen Sie [Starlettes Middleware-Dokumentation](https://www.starlette.dev/middleware/) und die [ASGI Awesome List](https://github.com/florimondmanca/awesome-asgi). Um mehr über weitere verfügbare Middlewares herauszufinden, besuchen Sie [Starlettes Middleware-Dokumentation](https://starlette.dev/middleware/) und die [ASGI Awesome List](https://github.com/florimondmanca/awesome-asgi).
+3 -3
View File
@@ -35,7 +35,7 @@ Dieser Teil ist ziemlich normal, der größte Teil des Codes ist Ihnen wahrschei
/// tip | Tipp /// tip | Tipp
Der Query-Parameter `callback_url` verwendet einen Pydantic-[Url](https://docs.pydantic.dev/latest/api/networks/)-Typ. Der Query-Parameter `callback_url` verwendet einen Pydantic-[Url](https://pydantic.dev/docs/validation/latest/api/pydantic/networks/)-Typ.
/// ///
@@ -106,11 +106,11 @@ Sie sollte wie eine normale FastAPI-*Pfadoperation* aussehen:
Es gibt zwei Hauptunterschiede zu einer normalen *Pfadoperation*: 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. * 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 [OpenAPI-3-Ausdruck](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) 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 *Pfad* kann einen [OpenAPI-3-Ausdruck](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#key-expression) 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 { #the-callback-path-expression } ### Der Callback-Pfadausdruck { #the-callback-path-expression }
Der Callback-*Pfad* kann einen [OpenAPI-3-Ausdruck](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) enthalten, welcher Teile des ursprünglichen Requests enthalten kann, der an *Ihre API* gesendet wurde. Der Callback-*Pfad* kann einen [OpenAPI-3-Ausdruck](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#key-expression) enthalten, welcher Teile des ursprünglichen Requests enthalten kann, der an *Ihre API* gesendet wurde.
In diesem Fall ist es der `str`: In diesem Fall ist es der `str`:
+1 -2
View File
@@ -1,6 +1,5 @@
# Response-Cookies { #response-cookies } # Response-Cookies { #response-cookies }
## Einen `Response`-Parameter verwenden { #use-a-response-parameter } ## Einen `Response`-Parameter verwenden { #use-a-response-parameter }
Sie können einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion* deklarieren. Sie können einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion* deklarieren.
@@ -49,4 +48,4 @@ Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird,
/// ///
Um alle verfügbaren Parameter und Optionen anzuzeigen, sehen Sie sich deren [Dokumentation in Starlette](https://www.starlette.dev/responses/#set-cookie) an. Um alle verfügbaren Parameter und Optionen anzuzeigen, sehen Sie sich deren [Dokumentation in Starlette](https://starlette.dev/responses/#set-cookie) an.
+1 -1
View File
@@ -38,4 +38,4 @@ Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird,
Beachten Sie, dass benutzerdefinierte proprietäre Header [mit dem Präfix `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) hinzugefügt werden können. Beachten Sie, dass benutzerdefinierte proprietäre Header [mit dem Präfix `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) 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)), unter Verwendung des Parameters `expose_headers`, dokumentiert in [Starlettes CORS-Dokumentation](https://www.starlette.dev/middleware/#corsmiddleware). 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)), unter Verwendung des Parameters `expose_headers`, dokumentiert in [Starlettes CORS-Dokumentation](https://starlette.dev/middleware/#corsmiddleware).
+37 -13
View File
@@ -2,45 +2,49 @@
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. 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.
Die meisten dieser Einstellungen sind variabel (können sich ändern), wie z. B. Datenbank-URLs. Und vieles könnten schützenswerte, geheime Daten sein. Die meisten dieser Einstellungen sind variabel (können sich ändern), wie z. B. Datenbank-URLs. Und viele könnten schützenswerte, geheime Daten sein.
Aus diesem Grund werden diese üblicherweise in Umgebungsvariablen bereitgestellt, die von der Anwendung gelesen werden. Aus diesem Grund werden diese üblicherweise in Umgebungsvariablen bereitgestellt, die von der Anwendung gelesen werden.
Eine **Umgebungsvariable** (auch bekannt als **Env-Var**) ist ein Wert, der außerhalb des Python-Codes, im Betriebssystem, existiert und von Ihrer Anwendung und anderen Programmen gelesen werden kann.
Sie können eine Umgebungsvariable für einen Befehl erstellen, wenn Sie ihn ausführen. Sie werden unten die plattformspezifischen Befehle sehen.
/// tip | Tipp /// tip | Tipp
Um Umgebungsvariablen zu verstehen, können Sie [Umgebungsvariablen](../environment-variables.md) lesen. Lesen Sie den [Leitfaden zu Umgebungsvariablen](https://tiangolo.com/guides/environment-variables/) für eine detaillierte Erklärung, wie Umgebungsvariablen funktionieren.
/// ///
## Typen und Validierung { #types-and-validation } ## Typen und Validierung { #types-and-validation }
Diese Umgebungsvariablen können nur Text-Strings verarbeiten, da sie außerhalb von Python liegen und mit anderen Programmen und dem Rest des Systems (und sogar mit verschiedenen Betriebssystemen wie Linux, Windows, macOS) kompatibel sein müssen. Diese Umgebungsvariablen können nur Text-Strings 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 und 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. 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` { #pydantic-settings }
Glücklicherweise bietet Pydantic ein großartiges Werkzeug zur Verarbeitung dieser Einstellungen, die von Umgebungsvariablen stammen, mit [Pydantic: Settings-Verwaltung](https://docs.pydantic.dev/latest/concepts/pydantic_settings/). Glücklicherweise bietet Pydantic ein großartiges Werkzeug zur Verarbeitung dieser Einstellungen, die von Umgebungsvariablen stammen, mit [Pydantic: Settings-Verwaltung](https://pydantic.dev/docs/validation/latest/concepts/pydantic_settings/).
### `pydantic-settings` installieren { #install-pydantic-settings } ### `pydantic-settings` installieren { #install-pydantic-settings }
Stellen Sie zunächst sicher, dass Sie Ihre [virtuelle Umgebung](../virtual-environments.md) erstellt und aktiviert haben, und installieren Sie dann das Package `pydantic-settings`: Fügen Sie Ihrem Projekt das Package `pydantic-settings` hinzu:
<div class="termy"> <div class="termy">
```console ```console
$ pip install pydantic-settings $ uv add pydantic-settings
---> 100% ---> 100%
``` ```
</div> </div>
Es ist bereits enthalten, wenn Sie die `all`-Extras installiert haben, mit: Es ist auch enthalten, wenn Sie die `all`-Extras installieren mit:
<div class="termy"> <div class="termy">
```console ```console
$ pip install "fastapi[all]" $ uv add "fastapi[all]"
---> 100% ---> 100%
``` ```
@@ -76,19 +80,39 @@ Dann können Sie das neue `settings`-Objekt in Ihrer Anwendung verwenden:
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: 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:
//// tab | Linux, macOS, Windows Bash
<div class="termy"> <div class="termy">
```console ```console
$ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.py $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" uv run fastapi run main.py
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
</div> </div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ $Env:ADMIN_EMAIL = "deadpool@example.com"
$ $Env:APP_NAME = "ChimichangApp"
$ uv run 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 /// 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. In Bash trennen Sie, um mehrere Umgebungsvariablen für einen einzelnen Befehl festzulegen, diese durch ein Leerzeichen und fügen sie alle vor dem Befehl ein.
/// ///
@@ -172,11 +196,11 @@ 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 [Pydantic Settings: Dotenv (.env)-Unterstützung](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support). Pydantic unterstützt das Lesen dieser Dateitypen mithilfe einer externen Bibliothek. Weitere Informationen finden Sie unter [Pydantic Settings: Dotenv (.env)-Unterstützung](https://pydantic.dev/docs/validation/latest/concepts/pydantic_settings/#dotenv-env-support).
/// tip | Tipp /// tip | Tipp
Damit das funktioniert, müssen Sie `pip install python-dotenv` ausführen. Damit das funktioniert, fügen Sie Ihrem Projekt `python-dotenv` mit `uv add python-dotenv` hinzu.
/// ///
@@ -197,7 +221,7 @@ Und dann aktualisieren Sie Ihre `config.py` mit:
/// tip | Tipp /// tip | Tipp
Das Attribut `model_config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter [Pydantic: Konzepte: Konfiguration](https://docs.pydantic.dev/latest/concepts/config/). Das Attribut `model_config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter [Pydantic: Konzepte: Konfiguration](https://pydantic.dev/docs/validation/latest/concepts/config/).
/// ///
+4 -4
View File
@@ -4,11 +4,11 @@ Wenn Sie zwei unabhängige FastAPI-Anwendungen mit deren eigenen unabhängigen O
## Eine **FastAPI**-Anwendung mounten { #mounting-a-fastapi-application } ## 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. „Mounten“ 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 { #top-level-application } ### Top-Level-Anwendung { #top-level-application }
Erstellen Sie zunächst die Hauptanwendung **FastAPI** und deren *Pfadoperationen*: Erstellen Sie zunächst die Haupt-, Top-Level-**FastAPI**-Anwendung und deren *Pfadoperationen*:
{* ../../docs_src/sub_applications/tutorial001_py310.py hl[3, 6:8] *} {* ../../docs_src/sub_applications/tutorial001_py310.py hl[3, 6:8] *}
@@ -35,7 +35,7 @@ Führen Sie nun den Befehl `fastapi` aus:
<div class="termy"> <div class="termy">
```console ```console
$ fastapi dev $ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
+4 -4
View File
@@ -8,12 +8,12 @@ Es gibt Werkzeuge zur einfachen Konfiguration, die Sie direkt in Ihrer **FastAPI
## Abhängigkeiten installieren { #install-dependencies } ## Abhängigkeiten installieren { #install-dependencies }
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md) erstellen, sie aktivieren und `jinja2` installieren: Fügen Sie `jinja2` Ihrem Projekt hinzu:
<div class="termy"> <div class="termy">
```console ```console
$ pip install jinja2 $ uv add jinja2
---> 100% ---> 100%
``` ```
@@ -53,7 +53,7 @@ Sie können auch `from starlette.templating import Jinja2Templates` verwenden.
## Templates erstellen { #writing-templates } ## Templates erstellen { #writing-templates }
Dann können Sie unter `templates/item.html` ein Template erstellen, mit z. B. folgendem Inhalt: Dann können Sie unter `templates/item.html` ein Template erstellen, mit z. B.:
```jinja hl_lines="7" ```jinja hl_lines="7"
{!../../docs_src/templates/templates/item.html!} {!../../docs_src/templates/templates/item.html!}
@@ -123,4 +123,4 @@ Und da Sie `StaticFiles` verwenden, wird diese CSS-Datei automatisch von Ihrer *
## Mehr Details { #more-details } ## Mehr Details { #more-details }
Weitere Informationen, einschließlich, wie man Templates testet, finden Sie in [Starlettes Dokumentation zu Templates](https://www.starlette.dev/templates/). Weitere Informationen, einschließlich, wie man Templates testet, finden Sie in [Starlettes Dokumentation zu Templates](https://starlette.dev/templates/).
+1 -1
View File
@@ -5,7 +5,7 @@ Wenn Sie `lifespan` in Ihren Tests ausführen müssen, können Sie den `TestClie
{* ../../docs_src/app_testing/tutorial004_py310.py hl[9:15,18,27:28,30:32,41:43] *} {* ../../docs_src/app_testing/tutorial004_py310.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. Sie können mehr Details unter [„Lifespan in Tests ausführen auf der offiziellen Starlette-Dokumentationswebsite.“](https://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: Für die deprecateten Events <abbr title="Hochfahren">`startup`</abbr> und <abbr title="Herunterfahren">`shutdown`</abbr> können Sie den `TestClient` wie folgt verwenden:
+1 -1
View File
@@ -8,6 +8,6 @@ Dazu verwenden Sie den `TestClient` in einer `with`-Anweisung, eine Verbindung z
/// note | Hinweis /// note | Hinweis
Weitere Informationen finden Sie in Starlettes Dokumentation zum [Testen von WebSockets](https://www.starlette.dev/testclient/#testing-websocket-sessions). Weitere Informationen finden Sie in Starlettes Dokumentation zum [Testen von WebSockets](https://starlette.dev/testclient/#testing-websocket-sessions).
/// ///
@@ -15,7 +15,7 @@ Es gibt jedoch Situationen, in denen Sie möglicherweise direkt auf das `Request
## Details zum `Request`-Objekt { #details-about-the-request-object } ## 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 Starlettes [`Request`](https://www.starlette.dev/requests/)-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 [`Request`](https://starlette.dev/requests/)-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). 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).
@@ -45,7 +45,7 @@ Auf die gleiche Weise können Sie wie gewohnt jeden anderen Parameter deklariere
## `Request`-Dokumentation { #request-documentation } ## `Request`-Dokumentation { #request-documentation }
Weitere Details zum [`Request`-Objekt auf der offiziellen Starlette-Dokumentationsseite](https://www.starlette.dev/requests/). Weitere Details zum [`Request`-Objekt auf der offiziellen Starlette-Dokumentationsseite](https://starlette.dev/requests/).
/// note | Technische Details /// note | Technische Details
+7 -7
View File
@@ -4,12 +4,12 @@ Sie können [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSoc
## `websockets` installieren { #install-websockets } ## `websockets` installieren { #install-websockets }
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md) erstellen, sie aktivieren und `websockets` installieren (eine Python-Bibliothek, die die Verwendung des „WebSocket“-Protokolls erleichtert): Fügen Sie `websockets` (eine Python-Bibliothek, die die Verwendung des „WebSocket“-Protokolls erleichtert) zu Ihrem Projekt hinzu:
<div class="termy"> <div class="termy">
```console ```console
$ pip install websockets $ uv add websockets
---> 100% ---> 100%
``` ```
@@ -69,7 +69,7 @@ Legen Sie Ihren Code in einer Datei `main.py` ab und führen Sie dann Ihre Anwen
<div class="termy"> <div class="termy">
```console ```console
$ fastapi dev $ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
@@ -96,7 +96,7 @@ Sie können viele Nachrichten senden (und empfangen):
Und alle verwenden dieselbe WebSocket-Verbindung. Und alle verwenden dieselbe WebSocket-Verbindung.
## Verwendung von `Depends` und anderen { #using-depends-and-others } ## `Depends` und andere verwenden { #using-depends-and-others }
In WebSocket-Endpunkten können Sie Folgendes aus `fastapi` importieren und verwenden: In WebSocket-Endpunkten können Sie Folgendes aus `fastapi` importieren und verwenden:
@@ -126,7 +126,7 @@ Führen Sie Ihre Anwendung aus:
<div class="termy"> <div class="termy">
```console ```console
$ fastapi dev $ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
@@ -182,5 +182,5 @@ Wenn Sie etwas benötigen, das sich leicht in FastAPI integrieren lässt, aber r
Weitere Informationen zu Optionen finden Sie in der Dokumentation von Starlette: Weitere Informationen zu Optionen finden Sie in der Dokumentation von Starlette:
* [Die `WebSocket`-Klasse](https://www.starlette.dev/websockets/). * [Die `WebSocket`-Klasse](https://starlette.dev/websockets/).
* [Klassen-basierte Handhabung von WebSockets](https://www.starlette.dev/endpoints/#websocketendpoint). * [Klassen-basierte Handhabung von WebSockets](https://starlette.dev/endpoints/#websocketendpoint).
+2 -2
View File
@@ -9,13 +9,13 @@ Dazu können Sie die `WSGIMiddleware` verwenden und damit Ihre WSGI-Anwendung wr
/// note | Hinweis /// note | Hinweis
Dafür muss `a2wsgi` installiert sein, z. B. mit `pip install a2wsgi`. Dafür muss `a2wsgi` zu Ihrem Projekt hinzugefügt werden, z. B. mit `uv add a2wsgi`.
/// ///
Sie müssen `WSGIMiddleware` aus `a2wsgi` importieren. Sie müssen `WSGIMiddleware` aus `a2wsgi` importieren.
Wrappen Sie dann die WSGI-Anwendung (z. B. Flask) mit der Middleware. Wrappen Sie dann die WSGI-App (z. B. Flask) mit der Middleware.
Und dann mounten Sie das auf einem Pfad. Und dann mounten Sie das auf einem Pfad.
+7 -7
View File
@@ -125,7 +125,7 @@ Einen offenen Standard für API-Spezifikationen zu übernehmen und zu verwenden,
Und Standard-basierte Tools für die Oberfläche zu integrieren: Und Standard-basierte Tools für die Oberfläche zu integrieren:
* [Swagger UI](https://github.com/swagger-api/swagger-ui) * [Swagger UI](https://github.com/swagger-api/swagger-ui)
* [ReDoc](https://github.com/Rebilly/ReDoc) * [ReDoc](https://github.com/Redocly/redoc)
Diese beiden wurden ausgewählt, weil sie ziemlich beliebt und stabil sind, aber bei einer schnellen Suche könnten Sie Dutzende alternativer Benutzeroberflächen für OpenAPI finden (welche Sie mit **FastAPI** verwenden können). Diese beiden wurden ausgewählt, weil sie ziemlich beliebt und stabil sind, aber bei einer schnellen Suche könnten Sie Dutzende alternativer Benutzeroberflächen für OpenAPI finden (welche Sie mit **FastAPI** verwenden können).
@@ -137,7 +137,7 @@ Es gibt mehrere Flask REST Frameworks, aber nachdem ich die Zeit und Arbeit inve
### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow } ### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow }
Eine der von API-Systemen benötigten Hauptfunktionen ist die Daten-<dfn title="auch genannt: Marshalling, Konvertierung">Serialisierung</dfn>, 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-<dfn title="auch genannt: Marshalling, Konvertierung">Serialisierung</dfn>, 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. 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.
@@ -237,7 +237,7 @@ Das OpenAPI-Schema automatisch zu generieren, aus demselben Code, welcher die Se
/// ///
### [NestJS](https://nestjs.com/) (und [Angular](https://angular.io/)) { #nestjs-and-angular } ### [NestJS](https://nestjs.com/) (und [Angular](https://angular.dev/)) { #nestjs-and-angular }
Dies ist nicht einmal Python, NestJS ist ein von Angular inspiriertes JavaScript (TypeScript) NodeJS Framework. Dies ist nicht einmal Python, NestJS ist ein von Angular inspiriertes JavaScript (TypeScript) NodeJS Framework.
@@ -337,7 +337,7 @@ Da es auf dem bisherigen Standard für synchrone Python-Webframeworks (WSGI) bas
/// note | Hinweis /// note | Hinweis
Hug wurde von Timothy Crosley erstellt, demselben Schöpfer von [`isort`](https://github.com/timothycrosley/isort), einem großartigen Tool zum automatischen Sortieren von Importen in Python-Dateien. Hug wurde von Timothy Crosley erstellt, demselben Schöpfer von [`isort`](https://github.com/PyCQA/isort), einem großartigen Tool zum automatischen Sortieren von Importen in Python-Dateien.
/// ///
@@ -401,7 +401,7 @@ Ich betrachte **FastAPI** als einen „spirituellen Nachfolger“ von APIStar, w
## Verwendet von **FastAPI** { #used-by-fastapi } ## Verwendet von **FastAPI** { #used-by-fastapi }
### [Pydantic](https://docs.pydantic.dev/) { #pydantic } ### [Pydantic](https://pydantic.dev/docs/) { #pydantic }
Pydantic ist eine Bibliothek zum Definieren von Datenvalidierung, Serialisierung und Dokumentation (unter Verwendung von JSON Schema) basierend auf Python-Typhinweisen. Pydantic ist eine Bibliothek zum Definieren von Datenvalidierung, Serialisierung und Dokumentation (unter Verwendung von JSON Schema) basierend auf Python-Typhinweisen.
@@ -417,7 +417,7 @@ Die gesamte Datenvalidierung, Datenserialisierung und automatische Modelldokumen
/// ///
### [Starlette](https://www.starlette.dev/) { #starlette } ### [Starlette](https://starlette.dev/) { #starlette }
Starlette ist ein leichtgewichtiges <dfn title="Der neue Standard für die Erstellung asynchroner Python-Webanwendungen">ASGI</dfn>-Framework/Toolkit, welches sich ideal für die Erstellung hochperformanter asynchroner Dienste eignet. Starlette ist ein leichtgewichtiges <dfn title="Der neue Standard für die Erstellung asynchroner Python-Webanwendungen">ASGI</dfn>-Framework/Toolkit, welches sich ideal für die Erstellung hochperformanter asynchroner Dienste eignet.
@@ -462,7 +462,7 @@ Alles, was Sie also mit Starlette machen können, können Sie direkt mit **FastA
/// ///
### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn } ### [Uvicorn](https://uvicorn.dev) { #uvicorn }
Uvicorn ist ein blitzschneller ASGI-Server, der auf uvloop und httptools basiert. Uvicorn ist ein blitzschneller ASGI-Server, der auf uvloop und httptools basiert.
+16 -20
View File
@@ -105,36 +105,32 @@ Das ist, was Sie in **den meisten Fällen** tun möchten, zum Beispiel:
### Paketanforderungen { #package-requirements } ### Paketanforderungen { #package-requirements }
Normalerweise befinden sich die **Paketanforderungen** für Ihre Anwendung in einer Datei. Wenn Sie Ihr Projekt mit `uv` verwalten, werden dessen direkte Abhängigkeiten in `pyproject.toml` deklariert und die exakt aufgelösten Versionen in `uv.lock` gespeichert.
Dies hängt hauptsächlich von dem Tool ab, mit dem Sie diese Anforderungen **installieren**. Sie können die Packages, die Ihre Anwendung benötigt, hinzufügen mit:
Die gebräuchlichste Methode besteht darin, eine Datei `requirements.txt` mit den Namen der Packages und deren Versionen zu erstellen, eine pro Zeile.
Sie würden natürlich die gleichen Ideen verwenden, die Sie in [Über FastAPI-Versionen](versions.md) gelesen haben, um die Versionsbereiche festzulegen.
Ihre `requirements.txt` könnte beispielsweise so aussehen:
```
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:
<div class="termy"> <div class="termy">
```console ```console
$ pip install -r requirements.txt $ uv add "fastapi[standard]" pydantic
---> 100% ---> 100%
Successfully installed fastapi pydantic
``` ```
</div> </div>
/// note | Hinweis /// note | Hinweis
Es gibt andere Formate und Tools zum Definieren und Installieren von Paketabhängigkeiten. Das Dockerfile unten verwendet `pip` innerhalb des Containers. Sie können die gelockten Abhängigkeiten aus Ihrem uv-Projekt in das erwartete Format `requirements.txt` exportieren:
<div class="termy">
```console
$ uv export --format requirements-txt --no-dev --no-emit-project --output-file requirements.txt
```
</div>
Die generierte `requirements.txt` ist ein Export für den Container-Build. Verwalten Sie Abhängigkeiten weiterhin mit `uv add` und generieren Sie sie neu, wenn sich `uv.lock` ändert.
/// ///
@@ -372,7 +368,7 @@ Sie sehen die automatische interaktive API-Dokumentation (bereitgestellt von [Sw
Sie können auch auf [http://192.168.99.100/redoc](http://192.168.99.100/redoc) oder [http://127.0.0.1/redoc](http://127.0.0.1/redoc) gehen (oder ähnlich, unter Verwendung Ihres Docker-Hosts). Sie können auch auf [http://192.168.99.100/redoc](http://192.168.99.100/redoc) oder [http://127.0.0.1/redoc](http://127.0.0.1/redoc) gehen (oder ähnlich, unter Verwendung Ihres Docker-Hosts).
Sie sehen die alternative automatische Dokumentation (bereitgestellt von [ReDoc](https://github.com/Rebilly/ReDoc)): Sie sehen die alternative automatische Dokumentation (bereitgestellt von [ReDoc](https://github.com/Redocly/redoc)):
![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
@@ -529,7 +525,7 @@ Dann möchten Sie vielleicht **einen einzelnen Container** mit einem **Prozessma
--- ---
Der Hauptpunkt ist, dass **keine** dieser Regeln **in Stein gemeißelt** ist, der man blind folgen muss. Sie können diese Ideen verwenden, um **I Ihren eigenen Anwendungsfall zu evaluieren**, zu entscheiden, welcher Ansatz für Ihr System am besten geeignet ist und herauszufinden, wie Sie folgende Konzepte verwalten: 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:
* Sicherheit HTTPS * Sicherheit HTTPS
* Beim Hochfahren ausführen * Beim Hochfahren ausführen
+1 -1
View File
@@ -5,7 +5,7 @@ Sie können Ihre FastAPI-App in der [FastAPI Cloud](https://fastapicloud.com) mi
<div class="termy"> <div class="termy">
```console ```console
$ fastapi deploy $ uv run fastapi deploy
Deploying to FastAPI Cloud... Deploying to FastAPI Cloud...
+5 -5
View File
@@ -52,7 +52,7 @@ Das Wichtigste, was Sie benötigen, um eine **FastAPI**-Anwendung (oder eine and
Es gibt mehrere Alternativen, einschließlich: Es gibt mehrere Alternativen, einschließlich:
* [Uvicorn](https://www.uvicorn.dev/): ein hochperformanter ASGI-Server. * [Uvicorn](https://uvicorn.dev): ein hochperformanter ASGI-Server.
* [Hypercorn](https://hypercorn.readthedocs.io/): ein ASGI-Server, der unter anderem kompatibel mit HTTP/2 und Trio ist. * [Hypercorn](https://hypercorn.readthedocs.io/): ein ASGI-Server, der unter anderem kompatibel mit HTTP/2 und Trio ist.
* [Daphne](https://github.com/django/daphne): der für Django Channels entwickelte ASGI-Server. * [Daphne](https://github.com/django/daphne): der für Django Channels entwickelte ASGI-Server.
* [Granian](https://github.com/emmett-framework/granian): Ein Rust-HTTP-Server für Python-Anwendungen. * [Granian](https://github.com/emmett-framework/granian): Ein Rust-HTTP-Server für Python-Anwendungen.
@@ -73,14 +73,14 @@ Wenn Sie FastAPI installieren, wird es mit einem Produktionsserver, Uvicorn, gel
Aber Sie können auch ein ASGI-Serverprogramm manuell installieren. Aber Sie können auch ein ASGI-Serverprogramm manuell installieren.
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md) erstellen, sie aktivieren und dann die Serveranwendung installieren. Fügen Sie die Serveranwendung Ihrem Projekt hinzu.
Zum Beispiel, um Uvicorn zu installieren: Zum Beispiel, um Uvicorn zu installieren:
<div class="termy"> <div class="termy">
```console ```console
$ pip install "uvicorn[standard]" $ uv add "uvicorn[standard]"
---> 100% ---> 100%
``` ```
@@ -95,7 +95,7 @@ Durch das Hinzufügen von `standard` installiert und verwendet Uvicorn einige em
Dazu gehört `uvloop`, der hochperformante Drop-in-Ersatz für `asyncio`, der den großen Nebenläufigkeits-Leistungsschub bietet. Dazu gehört `uvloop`, der hochperformante Drop-in-Ersatz für `asyncio`, der den großen Nebenläufigkeits-Leistungsschub bietet.
Wenn Sie FastAPI mit etwas wie `pip install "fastapi[standard]"` installieren, erhalten Sie auch `uvicorn[standard]`. Wenn Sie FastAPI mit etwas wie `uv add "fastapi[standard]"` hinzufügen, erhalten Sie auch bereits `uvicorn[standard]`.
/// ///
@@ -106,7 +106,7 @@ Wenn Sie einen ASGI-Server manuell installiert haben, müssen Sie normalerweise
<div class="termy"> <div class="termy">
```console ```console
$ uvicorn main:app --host 0.0.0.0 --port 80 $ uv run uvicorn main:app --host 0.0.0.0 --port 80
<span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
``` ```
+1 -1
View File
@@ -86,7 +86,7 @@ Wenn Sie den `uvicorn`-Befehl direkt verwenden möchten:
<div class="termy"> <div class="termy">
```console ```console
$ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4 $ uv run uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
<font color="#A6E22E">INFO</font>: Uvicorn running on <b>http://0.0.0.0:8080</b> (Press CTRL+C to quit) <font color="#A6E22E">INFO</font>: Uvicorn running on <b>http://0.0.0.0:8080</b> (Press CTRL+C to quit)
<font color="#A6E22E">INFO</font>: Started parent process [<font color="#A1EFE4"><b>27365</b></font>] <font color="#A6E22E">INFO</font>: Started parent process [<font color="#A1EFE4"><b>27365</b></font>]
<font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27368</font>] <font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27368</font>]
+5 -292
View File
@@ -1,298 +1,11 @@
# Umgebungsvariablen { #environment-variables } # Umgebungsvariablen { #environment-variables }
/// tip | Tipp Eine **Umgebungsvariable** (auch bekannt als **env var**) ist ein Wert, der außerhalb Ihres Python-Codes im Betriebssystem existiert und von Ihrer Anwendung und anderen Programmen gelesen werden kann.
Wenn Sie bereits wissen, was „Umgebungsvariablen“ sind und wie man sie verwendet, können Sie dies überspringen. FastAPI-Anwendungen verwenden häufig Umgebungsvariablen für Konfigurationen wie Datenbank-URLs, E-Mail-Zugangsdaten und Secret-Keys.
/// Sie werden lernen, wie Sie sie für Anwendungskonfigurationen verwenden, in [Einstellungen und Umgebungsvariablen](advanced/settings.md).
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. ## Mehr erfahren { #learn-more }
Umgebungsvariablen können nützlich sein, um **Einstellungen** der Anwendung zu handhaben, als Teil der **Installation** von Python usw. Lesen Sie den [Leitfaden zu Umgebungsvariablen](https://tiangolo.com/guides/environment-variables/) für eine detaillierte, plattformübergreifende Erklärung, einschließlich der Erstellung und des Lesens von Umgebungsvariablen und wie die `PATH`-Umgebungsvariable funktioniert.
## 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 [`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) 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 [The Twelve-Factor App: Config](https://12factor.net/config).
///
## 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 Umgebungsvariablen 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).
## `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) 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 [Wikipedia zu Umgebungsvariablen](https://en.wikipedia.org/wiki/Environment_variable) 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.
+8 -4
View File
@@ -2,7 +2,7 @@
**FastAPI <abbr title="command line interface - Kommandozeileninterface">CLI</abbr>** ist ein Kommandozeilenprogramm, mit dem Sie Ihre FastAPI-App bereitstellen, Ihr FastAPI-Projekt verwalten und mehr. **FastAPI <abbr title="command line interface - Kommandozeileninterface">CLI</abbr>** 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]"`), erhalten Sie ein Kommandozeilenprogramm, das Sie im Terminal ausführen können. Wenn Sie FastAPI zu Ihrem Projekt hinzufügen (z. B. mit `uv add "fastapi[standard]"`), erhalten Sie ein Kommandozeilenprogramm, das Sie im Terminal ausführen können.
Um Ihre FastAPI-App für die Entwicklung auszuführen, können Sie den Befehl `fastapi dev` verwenden: Um Ihre FastAPI-App für die Entwicklung auszuführen, können Sie den Befehl `fastapi dev` verwenden:
@@ -52,7 +52,7 @@ Für die Produktion würden Sie statt `fastapi dev` `fastapi run` verwenden.
/// ///
Intern verwendet das **FastAPI CLI** [Uvicorn](https://www.uvicorn.dev), einen leistungsstarken, produktionsreifen, ASGI-Server. 😎 Intern verwendet das **FastAPI CLI** [Uvicorn](https://uvicorn.dev), einen leistungsstarken, produktionsreifen, ASGI-Server. 😎
Das `fastapi`-CLI versucht automatisch, die auszuführende FastAPI-App zu erkennen, und geht davon aus, dass es sich um ein Objekt namens `app` in einer Datei `main.py` handelt (oder ein paar weitere Varianten). Das `fastapi`-CLI versucht automatisch, die auszuführende FastAPI-App zu erkennen, und geht davon aus, dass es sich um ein Objekt namens `app` in einer Datei `main.py` handelt (oder ein paar weitere Varianten).
@@ -100,13 +100,13 @@ from backend.main import app
Sie können auch den Dateipfad an den Befehl `fastapi dev` übergeben, dann wird das zu verwendende FastAPI-App-Objekt erraten: Sie können auch den Dateipfad an den Befehl `fastapi dev` übergeben, dann wird das zu verwendende FastAPI-App-Objekt erraten:
```console ```console
$ fastapi dev main.py $ uv run fastapi dev main.py
``` ```
Oder Sie können auch die Option `--entrypoint` an den Befehl `fastapi dev` übergeben: Oder Sie können auch die Option `--entrypoint` an den Befehl `fastapi dev` übergeben:
```console ```console
$ fastapi dev --entrypoint main:app $ uv run fastapi dev --entrypoint main:app
``` ```
Aber Sie müssten sich merken, bei jedem Aufruf des `fastapi`-Befehls den korrekten Pfad\entrypoint zu übergeben. Aber Sie müssten sich merken, bei jedem Aufruf des `fastapi`-Befehls den korrekten Pfad\entrypoint zu übergeben.
@@ -119,6 +119,10 @@ 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`). 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`).
Vor dem Importieren Ihrer App setzt `fastapi dev` die Umgebungsvariable `FASTAPI_ENV` auf `development`. Wenn `FASTAPI_ENV` bereits gesetzt ist, bleibt der vorhandene Wert erhalten. Dadurch kann App-Startup-Code entwicklungsfreundliches Verhalten wählen, während Sie eine app-spezifische Umgebung wie `staging` bereitstellen können.
Die konventionellen `FASTAPI_ENV`-Werte sind `development` und `production`. `fastapi run` lässt `FASTAPI_ENV` derzeit unverändert, setzen Sie es also explizit, wenn Ihre App den Produktionsmodus erkennen muss.
## `fastapi run` { #fastapi-run } ## `fastapi run` { #fastapi-run }
Das Ausführen von `fastapi run` startet FastAPI im Produktionsmodus. Das Ausführen von `fastapi run` startet FastAPI im Produktionsmodus.
+9 -9
View File
@@ -19,15 +19,15 @@ Interaktive API-Dokumentation und erkundbare Web-Benutzeroberflächen. Da das Fr
![Swagger UI Interaktion](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) ![Swagger UI Interaktion](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png)
* Alternative API-Dokumentation mit [**ReDoc**](https://github.com/Rebilly/ReDoc). * Alternative API-Dokumentation mit [**ReDoc**](https://github.com/Redocly/redoc).
![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png)
### Nur modernes Python { #just-modern-python } ### Nur modernes Python { #just-modern-python }
Alles basiert auf Standard-**Python-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 modernes Standard-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). 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: [Python-Typen](python-types.md).
Sie schreiben Standard-Python mit Typen: Sie schreiben Standard-Python mit Typen:
@@ -140,7 +140,7 @@ FastAPI enthält ein extrem einfach zu verwendendes, aber extrem mächtiges <dfn
* Selbst Abhängigkeiten können Abhängigkeiten haben, woraus eine Hierarchie oder ein **„Graph“ von Abhängigkeiten** entsteht. * Selbst Abhängigkeiten können Abhängigkeiten haben, woraus eine Hierarchie oder ein **„Graph“ von Abhängigkeiten** entsteht.
* Alles **automatisch gehandhabt** durch das Framework. * Alles **automatisch gehandhabt** durch das Framework.
* Alle Abhängigkeiten können Daten von Requests anfordern und die Einschränkungen der **Pfadoperationen** sowie die automatische Dokumentation **erweitern**. * Alle Abhängigkeiten können Daten von Requests anfordern und die Einschränkungen der **Pfadoperation** sowie die automatische Dokumentation **erweitern**.
* **Automatische Validierung** selbst für solche Parameter von *Pfadoperationen*, welche in Abhängigkeiten definiert sind. * **Automatische Validierung** selbst für solche Parameter von *Pfadoperationen*, welche in Abhängigkeiten definiert sind.
* Unterstützung für komplexe Benutzerauthentifizierungssysteme, **Datenbankverbindungen**, usw. * Unterstützung für komplexe Benutzerauthentifizierungssysteme, **Datenbankverbindungen**, usw.
* **Keine Kompromisse** bei Datenbanken, Frontends, usw., sondern einfache Integration mit allen. * **Keine Kompromisse** bei Datenbanken, Frontends, usw., sondern einfache Integration mit allen.
@@ -159,7 +159,7 @@ Jede Integration wurde so entworfen, dass sie so einfach zu nutzen ist (mit Abh
## Starlette-Merkmale { #starlette-features } ## Starlette-Merkmale { #starlette-features }
**FastAPI** ist vollkommen kompatibel (und basiert auf) [**Starlette**](https://www.starlette.dev/). Das bedeutet, wenn Sie eigenen Starlette-Quellcode haben, funktioniert dieser auch. **FastAPI** ist vollkommen kompatibel (und basiert auf) [**Starlette**](https://starlette.dev/). Das bedeutet, wenn Sie eigenen Starlette-Quellcode haben, funktioniert dieser auch.
`FastAPI` ist tatsächlich eine Unterklasse von `Starlette`. Wenn Sie also bereits Starlette kennen oder benutzen, das meiste funktioniert genau so. `FastAPI` ist tatsächlich eine Unterklasse von `Starlette`. Wenn Sie also bereits Starlette kennen oder benutzen, das meiste funktioniert genau so.
@@ -177,13 +177,13 @@ Mit **FastAPI** bekommen Sie alles von **Starlette** (da FastAPI nur Starlette a
## Pydantic-Merkmale { #pydantic-features } ## Pydantic-Merkmale { #pydantic-features }
**FastAPI** ist vollkommen kompatibel (und basiert auf) [**Pydantic**](https://docs.pydantic.dev/). Das bedeutet, wenn Sie eigenen Pydantic-Quellcode haben, funktioniert dieser auch. **FastAPI** ist vollkommen kompatibel (und basiert auf) [**Pydantic**](https://pydantic.dev/docs/). Das bedeutet, wenn Sie eigenen Pydantic-Quellcode haben, funktioniert dieser auch.
Inklusive externer Bibliotheken, die auf Pydantic basieren, wie <abbr title="Object-Relational Mapper - Objektrelationaler Mapper">ORM</abbr>s, <abbr title="Object-Document Mapper - Objekt-Dokument-Mapper">ODM</abbr>s für Datenbanken. Inklusive externer Bibliotheken, die auf Pydantic basieren, wie <abbr title="Object-Relational Mapper - Objektrelationaler Mapper">ORM</abbr>s und <abbr title="Object-Document Mapper - Objekt-Dokument-Mapper">ODM</abbr>s für Datenbanken.
Daher können Sie in vielen Fällen das Objekt eines Requests **direkt zur Datenbank** schicken, weil alles automatisch validiert wird. Das bedeutet auch, dass Sie in vielen Fällen dasselbe Objekt, das Sie von einem Request erhalten, **direkt an die Datenbank** übergeben können, da 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** senden. Das Gleiche gilt auch umgekehrt: In vielen Fällen können Sie einfach das Objekt, das Sie aus der Datenbank erhalten, **direkt an den Client** übergeben.
Mit **FastAPI** bekommen Sie alle Funktionen von **Pydantic** (da FastAPI für die gesamte Datenverarbeitung Pydantic nutzt): Mit **FastAPI** bekommen Sie alle Funktionen von **Pydantic** (da FastAPI für die gesamte Datenverarbeitung Pydantic nutzt):
+7 -15
View File
@@ -46,20 +46,6 @@ Sie können [mir (Sebastián Ramírez / `tiangolo`)](https://tiangolo.com), dem
* [@tiangolo.com auf **Bluesky**](https://bsky.app/profile/tiangolo.com) * [@tiangolo.com auf **Bluesky**](https://bsky.app/profile/tiangolo.com)
* [@tiangolo auf **LinkedIn**](https://www.linkedin.com/in/tiangolo/). * [@tiangolo auf **LinkedIn**](https://www.linkedin.com/in/tiangolo/).
## Anderen bei Fragen auf GitHub helfen { #help-others-with-questions-in-github }
Sie können versuchen, anderen bei ihren Fragen in [GitHub-Diskussionen](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered) zu helfen.
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#fastapi-experts). 🎉
Denken Sie daran, der wichtigste Punkt ist: Versuchen Sie, freundlich zu sein. 🤗
### So helfen { #how-to-help }
Folgen Sie der [Anleitung, wie Sie helfen können](https://tiangolo.com/open-source/help/#help-others-with-questions-in-github) hier.
## Fragen stellen { #ask-questions } ## Fragen stellen { #ask-questions }
Sie können im GitHub-Repository [eine neue Frage erstellen](https://github.com/fastapi/fastapi/discussions/new?category=questions), zum Beispiel um: Sie können im GitHub-Repository [eine neue Frage erstellen](https://github.com/fastapi/fastapi/discussions/new?category=questions), zum Beispiel um:
@@ -69,7 +55,7 @@ Sie können im GitHub-Repository [eine neue Frage erstellen](https://github.com/
## Am Chat teilnehmen { #join-the-chat } ## Am Chat teilnehmen { #join-the-chat }
Treten Sie dem 👥 [Discord-Chatserver](https://discord.gg/VQjSZaeJmf) 👥 bei und treffen Sie sich mit anderen Mitgliedern der FastAPI-Community. Treten Sie dem 👥 [Discord-Chatserver](https://discord.com/invite/VQjSZaeJmf) 👥 bei und treffen Sie sich mit anderen Mitgliedern der FastAPI-Community.
/// tip | Tipp /// tip | Tipp
@@ -86,3 +72,9 @@ Bedenken Sie, dass Sie in Chats, die „freie Konversation“ erlauben, leicht F
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. 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.
Unterhaltungen in den Chat-Systemen sind auch nicht so leicht durchsuchbar wie auf GitHub, sie gehen verloren. Unterhaltungen in den Chat-Systemen sind auch nicht so leicht durchsuchbar wie auf GitHub, sie gehen verloren.
## FastAPI Cloud ausprobieren { #try-fastapi-cloud }
Die Hauptfinanzierung für FastAPI und Freunde kommt von [**FastAPI Cloud**](https://fastapicloud.com), einer Plattform, um FastAPI-Anwendungen auf einfache und schnelle Weise zu deployen, mit einem einzigen Kommando, `fastapi deploy`.
FastAPI Cloud wird vom selben Team hinter FastAPI entwickelt. Sie können es ausprobieren und für Ihre Projekte in Betracht ziehen.
+2 -2
View File
@@ -54,11 +54,11 @@ Alles auf eine Weise, die allen Entwicklern das beste Entwicklungserlebnis bot.
## Anforderungen { #requirements } ## Anforderungen { #requirements }
Nachdem ich mehrere Alternativen getestet hatte, entschied ich, dass ich [**Pydantic**](https://docs.pydantic.dev/) wegen seiner Vorteile verwenden würde. Nachdem ich mehrere Alternativen getestet hatte, entschied ich, dass ich [**Pydantic**](https://pydantic.dev/docs/) 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. 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 [**Starlette**](https://www.starlette.dev/) beigetragen, die andere Schlüsselanforderung. Während der Entwicklung habe ich auch zu [**Starlette**](https://starlette.dev/) beigetragen, die andere Schlüsselanforderung.
## Entwicklung { #development } ## Entwicklung { #development }
@@ -1,6 +1,5 @@
# Benutzerdefinierte Request- und APIRoute-Klasse { #custom-request-and-apiroute-class } # Benutzerdefinierte Request- und APIRoute-Klasse { #custom-request-and-apiroute-class }
In einigen Fällen möchten Sie möglicherweise die von den Klassen `Request` und `APIRoute` verwendete Logik überschreiben. In einigen Fällen möchten Sie möglicherweise die von den Klassen `Request` und `APIRoute` verwendete Logik überschreiben.
Das kann insbesondere eine gute Alternative zur Logik in einer Middleware sein. Das kann insbesondere eine gute Alternative zur Logik in einer Middleware sein.
@@ -67,7 +66,7 @@ Das `scope`-`dict` und die `receive`-Funktion sind beide Teil der ASGI-Spezifika
Und diese beiden Dinge, `scope` und `receive`, werden benötigt, um eine neue `Request`-Instanz zu erstellen. Und diese beiden Dinge, `scope` und `receive`, werden benötigt, um eine neue `Request`-Instanz zu erstellen.
Um mehr über den `Request` zu erfahren, schauen Sie sich [Starlettes Dokumentation zu Requests](https://www.starlette.dev/requests/) an. Um mehr über den `Request` zu erfahren, schauen Sie sich [Starlettes Dokumentation zu Requests](https://starlette.dev/requests/) an.
/// ///
+1 -1
View File
@@ -45,7 +45,7 @@ Der Parameter `summary` ist in OpenAPI 3.1.0 und höher verfügbar und wird von
Mithilfe der oben genannten Informationen können Sie dieselbe Hilfsfunktion verwenden, um das OpenAPI-Schema zu generieren und jeden benötigten Teil zu überschreiben. Mithilfe der oben genannten Informationen können Sie dieselbe Hilfsfunktion verwenden, um das OpenAPI-Schema zu generieren und jeden benötigten Teil zu überschreiben.
Fügen wir beispielsweise [ReDocs OpenAPI-Erweiterung zum Einbinden eines benutzerdefinierten Logos](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo) hinzu. Fügen wir beispielsweise [ReDocs OpenAPI-Erweiterung zum Einbinden eines benutzerdefinierten Logos](https://github.com/Redocly/redoc/blob/main/docs/redoc-vendor-extensions.md#x-logo) hinzu.
### Normales **FastAPI** { #normal-fastapi } ### Normales **FastAPI** { #normal-fastapi }
+1 -1
View File
@@ -22,7 +22,7 @@ Hier sind einige der **GraphQL**-Bibliotheken, die **ASGI**-Unterstützung haben
* [Strawberry](https://strawberry.rocks/) 🍓 * [Strawberry](https://strawberry.rocks/) 🍓
* Mit [Dokumentation für FastAPI](https://strawberry.rocks/docs/integrations/fastapi) * Mit [Dokumentation für FastAPI](https://strawberry.rocks/docs/integrations/fastapi)
* [Ariadne](https://ariadnegraphql.org/) * [Ariadne](https://ariadnegraphql.org/)
* Mit [Dokumentation für FastAPI](https://ariadnegraphql.org/docs/fastapi-integration) * Mit [Dokumentation für FastAPI](https://ariadnegraphql.org/server/Integrations/fastapi-integration)
* [Tartiflette](https://tartiflette.io/) * [Tartiflette](https://tartiflette.io/)
* Mit [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) für ASGI-Integration * Mit [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) für ASGI-Integration
* [Graphene](https://graphene-python.org/) * [Graphene](https://graphene-python.org/)
@@ -24,7 +24,7 @@ Wenn Sie eine ältere FastAPI-App mit Pydantic v1 haben, zeige ich Ihnen hier, w
## Offizieller Leitfaden { #official-guide } ## Offizieller Leitfaden { #official-guide }
Pydantic hat einen offiziellen [Migrationsleitfaden](https://docs.pydantic.dev/latest/migration/) von v1 zu v2. Pydantic hat einen offiziellen [Migrationsleitfaden](https://pydantic.dev/docs/validation/latest/get-started/migration/) von v1 zu v2.
Er enthält auch, was sich geändert hat, wie Validierungen nun korrekter und strikter sind, mögliche Stolpersteine, usw. Er enthält auch, was sich geändert hat, wie Validierungen nun korrekter und strikter sind, mögliche Stolpersteine, usw.
+21 -25
View File
@@ -110,7 +110,7 @@ Seine Schlüssel-Merkmale sind:
</div> </div>
<div class="fastapi-opinions__panel" id="fo-panel-uber" role="tabpanel" aria-labelledby="fo-tab-uber" tabindex="0" hidden> <div class="fastapi-opinions__panel" id="fo-panel-uber" role="tabpanel" aria-labelledby="fo-tab-uber" tabindex="0" hidden>
<blockquote class="fastapi-opinions__quote">„Wir haben die <strong>FastAPI</strong>-Bibliothek übernommen, um einen <strong>REST</strong>-Server zu erstellen, der für <strong>Vorhersagen</strong> abgefragt werden kann.“ <em>[für Ludwig]</em></blockquote> <blockquote class="fastapi-opinions__quote">„Wir haben die <strong>FastAPI</strong>-Bibliothek übernommen, um einen <strong>REST</strong>-Server zu erstellen, der für <strong>Vorhersagen</strong> abgefragt werden kann.“ <em>[für Ludwig]</em></blockquote>
<div class="fastapi-opinions__attr">— Piero Molino, Yaroslav Dudin, Sai Sumanth Miryala, <strong>Uber</strong> <a href="https://eng.uber.com/ludwig-v0-2/">(Ref.)</a></div> <div class="fastapi-opinions__attr">— Piero Molino, Yaroslav Dudin, Sai Sumanth Miryala, <strong>Uber</strong> <a href="https://www.uber.com/us/en/blog/ludwig-v0-2/">(Ref.)</a></div>
</div> </div>
<div class="fastapi-opinions__panel" id="fo-panel-netflix" role="tabpanel" aria-labelledby="fo-tab-netflix" tabindex="0" hidden> <div class="fastapi-opinions__panel" id="fo-panel-netflix" role="tabpanel" aria-labelledby="fo-tab-netflix" tabindex="0" hidden>
<blockquote class="fastapi-opinions__quote">„<strong>Netflix</strong> freut sich, die Open-Source-Veröffentlichung unseres <strong>Krisenmanagement</strong>-Orchestrierungsframeworks bekannt zu geben: <strong>Dispatch</strong>!“ <em>[erstellt mit FastAPI]</em></blockquote> <blockquote class="fastapi-opinions__quote">„<strong>Netflix</strong> freut sich, die Open-Source-Veröffentlichung unseres <strong>Krisenmanagement</strong>-Orchestrierungsframeworks bekannt zu geben: <strong>Dispatch</strong>!“ <em>[erstellt mit FastAPI]</em></blockquote>
@@ -133,7 +133,7 @@ Seine Schlüssel-Merkmale sind:
„_Wir haben die **FastAPI**-Bibliothek übernommen, um einen **REST**-Server zu erstellen, der für **Vorhersagen** abgefragt werden kann. [für Ludwig]_“ „_Wir haben die **FastAPI**-Bibliothek übernommen, um einen **REST**-Server zu erstellen, der für **Vorhersagen** abgefragt werden kann. [für Ludwig]_“
<div style="text-align: right; margin-right: 10%;">Piero Molino, Yaroslav Dudin, und Sai Sumanth Miryala <strong>Uber</strong> <a href="https://eng.uber.com/ludwig-v0-2/"><small>(Ref.)</small></a></div> <div style="text-align: right; margin-right: 10%;">Piero Molino, Yaroslav Dudin, und Sai Sumanth Miryala <strong>Uber</strong> <a href="https://www.uber.com/us/en/blog/ludwig-v0-2/"><small>(Ref.)</small></a></div>
--- ---
@@ -151,12 +151,6 @@ Seine Schlüssel-Merkmale sind:
</div> </div>
## FastAPI Conf { #fastapi-conf }
[**FastAPI Conf 26**](https://fastapiconf.com) findet am **28. Oktober 2026** in **Amsterdam, NL** statt. Alles über FastAPI, direkt von der Quelle. 🎤
<a class="fastapi-feature-banner" href="https://fastapiconf.com"><img src="https://fastapi.tiangolo.com/img/fastapi-conf.jpeg" alt="FastAPI Conf 26 - 28. Oktober 2026 - Amsterdam, NL"></a>
## FastAPI Mini-Dokumentarfilm { #fastapi-mini-documentary } ## FastAPI Mini-Dokumentarfilm { #fastapi-mini-documentary }
Es gibt einen [FastAPI-Mini-Dokumentarfilm](https://www.youtube.com/watch?v=mpR8ngthqiE), veröffentlicht Ende 2025, Sie können ihn online ansehen: Es gibt einen [FastAPI-Mini-Dokumentarfilm](https://www.youtube.com/watch?v=mpR8ngthqiE), veröffentlicht Ende 2025, Sie können ihn online ansehen:
@@ -175,28 +169,30 @@ Wenn Sie eine <abbr title="Command Line Interface - Kommandozeileninterface">CLI
FastAPI steht auf den Schultern von Giganten: FastAPI steht auf den Schultern von Giganten:
* [Starlette](https://www.starlette.dev/) für die Webanteile. * [Starlette](https://starlette.dev/) für die Webanteile.
* [Pydantic](https://docs.pydantic.dev/) für die Datenanteile. * [Pydantic](https://pydantic.dev/docs/) für die Datenanteile.
## Installation { #installation } ## Installation { #installation }
Erstellen und aktivieren Sie eine [virtuelle Umgebung](https://fastapi.tiangolo.com/de/virtual-environments/) und installieren Sie dann FastAPI: Installieren Sie zuerst [`uv`](https://docs.astral.sh/uv/getting-started/installation/) und fügen Sie dann FastAPI zu Ihrem Projekt hinzu:
<div class="termy"> <div class="termy">
```console ```console
$ pip install "fastapi[standard]" $ uv add "fastapi[standard]"
---> 100% ---> 100%
``` ```
</div> </div>
**Hinweis**: Stellen Sie sicher, dass Sie fastapi[standard] in Anführungszeichen setzen, damit es in allen Terminals funktioniert. **Hinweis**: Stellen Sie sicher, dass Sie `"fastapi[standard]"` in Anführungszeichen setzen, damit es in allen Terminals funktioniert.
Wenn Sie lieber `pip` verwenden, installieren Sie `fastapi[standard]` innerhalb einer virtuellen Umgebung. Siehe die [Installationsanleitung](tutorial/#install-fastapi) für die alternativen Schritte.
## Beispiel { #example } ## Beispiel { #example }
### Erstellung { #create-it } ### Erstellen { #create-it }
Erstellen Sie eine Datei `main.py` mit: Erstellen Sie eine Datei `main.py` mit:
@@ -250,7 +246,7 @@ Starten Sie den Server mit:
<div class="termy"> <div class="termy">
```console ```console
$ fastapi dev $ uv run fastapi dev
╭────────── FastAPI CLI - Development mode ───────────╮ ╭────────── FastAPI CLI - Development mode ───────────╮
│ │ │ │
@@ -277,7 +273,7 @@ INFO: Application startup complete.
<details markdown="1"> <details markdown="1">
<summary>Über den Befehl <code>fastapi dev</code> ...</summary> <summary>Über den Befehl <code>fastapi dev</code> ...</summary>
Der Befehl `fastapi dev` liest Ihre `main.py`-Datei, erkennt die **FastAPI**-App darin und startet einen Server mit [Uvicorn](https://www.uvicorn.dev). Der Befehl `fastapi dev` liest Ihre `main.py`-Datei automatisch, erkennt die **FastAPI**-App darin und startet einen Server mit [Uvicorn](https://uvicorn.dev).
Standardmäßig wird `fastapi dev` mit aktiviertem Auto-Reload für die lokale Entwicklung gestartet. Standardmäßig wird `fastapi dev` mit aktiviertem Auto-Reload für die lokale Entwicklung gestartet.
@@ -314,7 +310,7 @@ Sie sehen die automatische interaktive API-Dokumentation (bereitgestellt von [Sw
Und jetzt gehen Sie auf [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). Und jetzt gehen Sie auf [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc).
Sie sehen die alternative automatische Dokumentation (bereitgestellt von [ReDoc](https://github.com/Rebilly/ReDoc)): Sie sehen die alternative automatische Dokumentation (bereitgestellt von [ReDoc](https://github.com/Redocly/redoc)):
![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
@@ -497,7 +493,7 @@ Optional können Sie Ihre FastAPI-App mit einem einzigen Befehl in die [FastAPI
<div class="termy"> <div class="termy">
```console ```console
$ fastapi deploy $ uv run fastapi deploy
Deploying to FastAPI Cloud... Deploying to FastAPI Cloud...
@@ -540,7 +536,7 @@ FastAPI hängt von Pydantic und Starlette ab.
### `standard`-Abhängigkeiten { #standard-dependencies } ### `standard`-Abhängigkeiten { #standard-dependencies }
Wenn Sie FastAPI mit `pip install "fastapi[standard]"` installieren, kommt es mit der `standard`-Gruppe optionaler Abhängigkeiten: Wenn Sie FastAPI mit `uv add "fastapi[standard]"` installieren, kommt es mit der `standard`-Gruppe optionaler Abhängigkeiten:
Verwendet von Pydantic: Verwendet von Pydantic:
@@ -554,17 +550,17 @@ Verwendet von Starlette:
Verwendet von FastAPI: Verwendet von FastAPI:
* [`uvicorn`](https://www.uvicorn.dev) für den Server, der Ihre Anwendung lädt und bereitstellt. Dies umfasst `uvicorn[standard]`, das einige Abhängigkeiten (z. B. `uvloop`) beinhaltet, die für eine Bereitstellung mit hoher Performanz benötigt werden. * [`uvicorn`](https://uvicorn.dev) für den Server, der Ihre Anwendung lädt und bereitstellt. Dies umfasst `uvicorn[standard]`, das einige Abhängigkeiten (z. B. `uvloop`) beinhaltet, die für eine Bereitstellung mit hoher Performanz benötigt werden.
* `fastapi-cli[standard]` um den `fastapi`-Befehl bereitzustellen. * `fastapi-cli[standard]` um den `fastapi`-Befehl bereitzustellen.
* Dies beinhaltet `fastapi-cloud-cli`, das es Ihnen ermöglicht, Ihre FastAPI-Anwendung auf [FastAPI Cloud](https://fastapicloud.com) bereitzustellen. * Dies beinhaltet `fastapi-cloud-cli`, das es Ihnen ermöglicht, Ihre FastAPI-Anwendung auf [FastAPI Cloud](https://fastapicloud.com) bereitzustellen.
### Ohne `standard`-Abhängigkeiten { #without-standard-dependencies } ### Ohne `standard`-Abhängigkeiten { #without-standard-dependencies }
Wenn Sie die `standard` optionalen Abhängigkeiten nicht einschließen möchten, können Sie mit `pip install fastapi` statt `pip install "fastapi[standard]"` installieren. Wenn Sie die `standard` optionalen Abhängigkeiten nicht einschließen möchten, können Sie mit `uv add fastapi` statt `uv add "fastapi[standard]"` installieren.
### Ohne `fastapi-cloud-cli` { #without-fastapi-cloud-cli } ### Ohne `fastapi-cloud-cli` { #without-fastapi-cloud-cli }
Wenn Sie FastAPI mit den Standardabhängigkeiten, aber ohne das `fastapi-cloud-cli` installieren möchten, können Sie mit `pip install "fastapi[standard-no-fastapi-cloud-cli]"` installieren. Wenn Sie FastAPI mit den Standardabhängigkeiten, aber ohne das `fastapi-cloud-cli` installieren möchten, können Sie mit `uv add "fastapi[standard-no-fastapi-cloud-cli]"` installieren.
### Zusätzliche optionale Abhängigkeiten { #additional-optional-dependencies } ### Zusätzliche optionale Abhängigkeiten { #additional-optional-dependencies }
@@ -572,13 +568,13 @@ Es gibt einige zusätzliche Abhängigkeiten, die Sie installieren möchten.
Zusätzliche optionale Pydantic-Abhängigkeiten: Zusätzliche optionale Pydantic-Abhängigkeiten:
* [`pydantic-settings`](https://docs.pydantic.dev/latest/usage/pydantic_settings/) für die Verwaltung von Einstellungen. * [`pydantic-settings`](https://pydantic.dev/docs/validation/latest/concepts/pydantic_settings/) für die Verwaltung von Einstellungen.
* [`pydantic-extra-types`](https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/) für zusätzliche Typen zur Verwendung mit Pydantic. * [`pydantic-extra-types`](https://github.com/pydantic/pydantic-extra-types) für zusätzliche Typen zur Verwendung mit Pydantic.
Zusätzliche optionale FastAPI-Abhängigkeiten: Zusätzliche optionale FastAPI-Abhängigkeiten:
* [`orjson`](https://github.com/ijl/orjson) erforderlich, wenn Sie `ORJSONResponse` verwenden möchten. * [`orjson`](https://github.com/ijl/orjson) erforderlich, wenn Sie `ORJSONResponse` verwenden möchten.
* [`ujson`](https://github.com/esnme/ultrajson) erforderlich, wenn Sie `UJSONResponse` verwenden möchten. * [`ujson`](https://github.com/ultrajson/ultrajson) erforderlich, wenn Sie `UJSONResponse` verwenden möchten.
## Lizenz { #license } ## Lizenz { #license }
+2 -2
View File
@@ -4,13 +4,13 @@ Vorlagen, die normalerweise mit einem bestimmten Setup geliefert werden, sind so
Sie können diese Vorlage verwenden, um loszulegen, da sie bereits vieles der anfänglichen Einrichtung, Sicherheit, Datenbank und einige API-Endpunkte für Sie eingerichtet hat. Sie können diese Vorlage verwenden, um loszulegen, da sie bereits vieles der anfänglichen Einrichtung, Sicherheit, Datenbank und einige API-Endpunkte für Sie eingerichtet hat.
GitHub-Repository: [Full Stack FastAPI Template](https://github.com/tiangolo/full-stack-fastapi-template) GitHub-Repository: [Full Stack FastAPI Template](https://github.com/fastapi/full-stack-fastapi-template)
## Full Stack FastAPI Template Technologiestack und Funktionen { #full-stack-fastapi-template-technology-stack-and-features } ## Full Stack FastAPI Template Technologiestack und Funktionen { #full-stack-fastapi-template-technology-stack-and-features }
- ⚡ [**FastAPI**](https://fastapi.tiangolo.com/de) für die Python-Backend-API. - ⚡ [**FastAPI**](https://fastapi.tiangolo.com/de) für die Python-Backend-API.
- 🧰 [SQLModel](https://sqlmodel.tiangolo.com) für die Interaktion mit der Python-SQL-Datenbank (ORM). - 🧰 [SQLModel](https://sqlmodel.tiangolo.com) für die Interaktion mit der Python-SQL-Datenbank (ORM).
- 🔍 [Pydantic](https://docs.pydantic.dev), verwendet von FastAPI, für die Datenvalidierung und das Einstellungsmanagement. - 🔍 [Pydantic](https://pydantic.dev/docs/), verwendet von FastAPI, für die Datenvalidierung und das Einstellungsmanagement.
- 💾 [PostgreSQL](https://www.postgresql.org) als SQL-Datenbank. - 💾 [PostgreSQL](https://www.postgresql.org) als SQL-Datenbank.
- 🚀 [React](https://react.dev) für das Frontend. - 🚀 [React](https://react.dev) für das Frontend.
- 💃 Verwendung von TypeScript, Hooks, Vite und anderen Teilen eines modernen Frontend-Stacks. - 💃 Verwendung von TypeScript, Hooks, Vite und anderen Teilen eines modernen Frontend-Stacks.
+2 -2
View File
@@ -269,7 +269,7 @@ Es bedeutet nicht: „`one_person` ist die **Klasse** namens `Person`“.
## Pydantic-Modelle { #pydantic-models } ## Pydantic-Modelle { #pydantic-models }
[Pydantic](https://docs.pydantic.dev/) ist eine Python-Bibliothek für die Validierung von Daten. [Pydantic](https://pydantic.dev/docs/) ist eine Python-Bibliothek für die Validierung von Daten.
Sie deklarieren die „Form“ der Daten als Klassen mit Attributen. Sie deklarieren die „Form“ der Daten als Klassen mit Attributen.
@@ -285,7 +285,7 @@ Ein Beispiel aus der offiziellen Pydantic-Dokumentation:
/// note | Hinweis /// note | Hinweis
Um mehr über [Pydantic zu erfahren, schauen Sie sich dessen Dokumentation an](https://docs.pydantic.dev/). Um mehr über [Pydantic zu erfahren, schauen Sie sich dessen Dokumentation an](https://pydantic.dev/docs/).
/// ///
+2 -2
View File
@@ -63,7 +63,7 @@ Und dann schreibt ein weiterer Hintergrundtask, der in der *Pfadoperation-Funkti
## Technische Details { #technical-details } ## Technische Details { #technical-details }
Die Klasse `BackgroundTasks` stammt direkt von [`starlette.background`](https://www.starlette.dev/background/). Die Klasse `BackgroundTasks` stammt direkt von [`starlette.background`](https://starlette.dev/background/).
Sie wird direkt in FastAPI importiert/inkludiert, sodass Sie sie von `fastapi` importieren können und vermeiden, versehentlich das alternative `BackgroundTask` (ohne das `s` am Ende) von `starlette.background` zu importieren. Sie wird direkt in FastAPI importiert/inkludiert, sodass Sie sie von `fastapi` importieren können und vermeiden, versehentlich das alternative `BackgroundTask` (ohne das `s` am Ende) von `starlette.background` zu importieren.
@@ -71,7 +71,7 @@ Indem Sie nur `BackgroundTasks` (und nicht `BackgroundTask`) verwenden, ist es d
Es ist immer noch möglich, `BackgroundTask` allein in FastAPI zu verwenden, aber Sie müssen das Objekt in Ihrem Code erstellen und eine Starlette-`Response` zurückgeben, die es enthält. Es ist immer noch möglich, `BackgroundTask` allein in FastAPI zu verwenden, aber Sie müssen das Objekt in Ihrem Code erstellen und eine Starlette-`Response` zurückgeben, die es enthält.
Weitere Details finden Sie in [Starlettes offizieller Dokumentation für Hintergrundtasks](https://www.starlette.dev/background/). Weitere Details finden Sie in [Starlettes offizieller Dokumentation für Hintergrundtasks](https://starlette.dev/background/).
## Vorbehalt { #caveat } ## Vorbehalt { #caveat }
+2 -2
View File
@@ -487,7 +487,7 @@ Auf diese Weise weiß der `fastapi`-Befehl, wo er Ihre App findet.
Sie könnten auch den Pfad an den Befehl übergeben, etwa: Sie könnten auch den Pfad an den Befehl übergeben, etwa:
```console ```console
$ fastapi dev app/main.py $ uv run fastapi dev app/main.py
``` ```
Aber dann müssten Sie sich jedes Mal, wenn Sie den `fastapi`-Befehl aufrufen, an den korrekten Pfad erinnern. Aber dann müssten Sie sich jedes Mal, wenn Sie den `fastapi`-Befehl aufrufen, an den korrekten Pfad erinnern.
@@ -503,7 +503,7 @@ Führen Sie nun Ihre App aus:
<div class="termy"> <div class="termy">
```console ```console
$ fastapi dev $ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
+1 -1
View File
@@ -96,7 +96,7 @@ Wiederum, nur mit dieser Deklaration erhalten Sie mit **FastAPI**:
Abgesehen von normalen einfachen Typen wie `str`, `int`, `float`, usw. können Sie komplexere einfache Typen verwenden, die von `str` erben. Abgesehen von normalen einfachen Typen wie `str`, `int`, `float`, usw. können Sie komplexere einfache Typen verwenden, die von `str` erben.
Um alle Optionen kennenzulernen, die Sie haben, schauen Sie sich [Pydantics Typübersicht](https://docs.pydantic.dev/latest/concepts/types/) an. Sie werden einige Beispiele im nächsten Kapitel kennenlernen. Um alle Optionen kennenzulernen, die Sie haben, schauen Sie sich [Pydantics Typübersicht](https://pydantic.dev/docs/validation/latest/concepts/types/) an. Sie werden einige Beispiele im nächsten Kapitel kennenlernen.
Zum Beispiel, da wir im `Image`-Modell ein Feld `url` haben, können wir deklarieren, dass das eine Instanz von Pydantics `HttpUrl` sein soll, anstelle eines `str`: Zum Beispiel, da wir im `Image`-Modell ein Feld `url` haben, können wir deklarieren, dass das eine Instanz von Pydantics `HttpUrl` sein soll, anstelle eines `str`:
+1 -1
View File
@@ -6,7 +6,7 @@ Ein <abbr title="Anfragekörper">**Request**body</abbr> sind Daten, die vom Clie
Ihre API muss fast immer einen **Response**body senden. Aber Clients müssen nicht unbedingt immer **Requestbodys** senden, manchmal fordern sie nur einen Pfad an, vielleicht mit einigen Query-Parametern, aber senden keinen Body. Ihre API muss fast immer einen **Response**body senden. Aber Clients müssen nicht unbedingt immer **Requestbodys** senden, manchmal fordern sie nur einen Pfad an, vielleicht mit einigen Query-Parametern, aber senden keinen Body.
Um einen **Request**body zu deklarieren, verwenden Sie [Pydantic](https://docs.pydantic.dev/)-Modelle mit all deren Fähigkeiten und Vorzügen. Um einen **Request**body zu deklarieren, verwenden Sie [Pydantic](https://pydantic.dev/docs/)-Modelle mit all deren Fähigkeiten und Vorzügen.
/// note | Hinweis /// note | Hinweis
+3 -3
View File
@@ -15,7 +15,7 @@ Der Hauptzweck von `__name__ == "__main__"` ist, dass Code ausgeführt wird, wen
<div class="termy"> <div class="termy">
```console ```console
$ python myapp.py $ uv run python myapp.py
``` ```
</div> </div>
@@ -35,7 +35,7 @@ Wenn Sie sie mit folgendem Befehl ausführen:
<div class="termy"> <div class="termy">
```console ```console
$ python myapp.py $ uv run python myapp.py
``` ```
</div> </div>
@@ -88,7 +88,7 @@ Zum Beispiel können Sie in Visual Studio Code:
* Zum „Debug“-Panel gehen. * Zum „Debug“-Panel gehen.
* „Konfiguration hinzufügen ...“ auswählen. * „Konfiguration hinzufügen ...“ auswählen.
* „Python“ auswählen. * „Python“ auswählen
* Den Debugger mit der Option „`Python: Current File (Integrated Terminal)`“ ausführen. * Den Debugger mit der Option „`Python: Current File (Integrated Terminal)`“ ausführen.
Der Server wird dann mit Ihrem **FastAPI**-Code gestartet, an Ihren Haltepunkten angehalten, usw. Der Server wird dann mit Ihrem **FastAPI**-Code gestartet, an Ihren Haltepunkten angehalten, usw.
+2 -3
View File
@@ -1,6 +1,5 @@
# Zusätzliche Datentypen { #extra-data-types } # Zusätzliche Datentypen { #extra-data-types }
Bisher haben Sie gängige Datentypen verwendet, wie zum Beispiel: Bisher haben Sie gängige Datentypen verwendet, wie zum Beispiel:
* `int` * `int`
@@ -37,7 +36,7 @@ Hier sind einige der zusätzlichen Datentypen, die Sie verwenden können:
* `datetime.timedelta`: * `datetime.timedelta`:
* Ein Python-`datetime.timedelta`. * Ein Python-`datetime.timedelta`.
* Wird in Requests und Responses als `float` der Gesamtsekunden dargestellt. * Wird in Requests und Responses als `float` der Gesamtsekunden dargestellt.
* Pydantic ermöglicht auch die Darstellung als „ISO 8601 Zeitdifferenz-Kodierung“, [siehe die Dokumentation für weitere Informationen](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers). * Pydantic ermöglicht auch die Darstellung als „ISO 8601 Zeitdifferenz-Kodierung“, [siehe die Dokumentation für weitere Informationen](https://pydantic.dev/docs/validation/latest/concepts/serialization/#custom-serializers).
* `frozenset`: * `frozenset`:
* Wird in Requests und Responses wie ein `set` behandelt: * Wird in Requests und Responses wie ein `set` behandelt:
* Bei Requests wird eine Liste gelesen, Duplikate entfernt und in ein `set` umgewandelt. * Bei Requests wird eine Liste gelesen, Duplikate entfernt und in ein `set` umgewandelt.
@@ -50,7 +49,7 @@ Hier sind einige der zusätzlichen Datentypen, die Sie verwenden können:
* `Decimal`: * `Decimal`:
* Standard-Python-`Decimal`. * Standard-Python-`Decimal`.
* In Requests und Responses wird es wie ein `float` behandelt. * In Requests und Responses wird es wie ein `float` behandelt.
* Sie können alle gültigen Pydantic-Datentypen hier überprüfen: [Pydantic-Datentypen](https://docs.pydantic.dev/latest/usage/types/types/). * Sie können alle gültigen Pydantic-Datentypen hier überprüfen: [Pydantic-Datentypen](https://pydantic.dev/docs/validation/latest/concepts/types/).
## Beispiel { #example } ## Beispiel { #example }
+1 -1
View File
@@ -166,7 +166,7 @@ Um das zu tun, verwenden Sie den Standard-Python-Typhinweis [`typing.Union`](htt
/// note | Hinweis /// note | Hinweis
Wenn Sie eine [`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions) definieren, listen Sie den spezifischeren Typ zuerst auf, gefolgt vom weniger spezifischen Typ. Im Beispiel unten steht `PlaneItem` vor `CarItem` in `Union[PlaneItem, CarItem]`. Wenn Sie eine [`Union`](https://pydantic.dev/docs/validation/latest/concepts/unions/) definieren, listen Sie den spezifischsten Typ zuerst auf, gefolgt vom weniger spezifischen Typ. Im folgenden Beispiel kommt der spezifischere `PlaneItem` vor `CarItem` in `Union[PlaneItem, CarItem]`.
/// ///
+14 -8
View File
@@ -6,12 +6,18 @@ Die einfachste FastAPI-Datei könnte wie folgt aussehen:
Kopieren Sie das in eine Datei `main.py`. Kopieren Sie das in eine Datei `main.py`.
/// tip | Tipp
FastAPI hat eine [offizielle Erweiterung für VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (und Cursor), die viele Features bereitstellt, darunter einen Pfadoperation-Explorer, Pfadoperation-Suche, CodeLens-Navigation in Tests (Sprung zur Definition aus Tests) sowie Deployment und Logs von FastAPI Cloud, alles aus Ihrem Editor heraus.
///
Starten Sie den Live-Server: Starten Sie den Live-Server:
<div class="termy"> <div class="termy">
```console ```console
$ <font color="#4E9A06">fastapi</font> dev $ <font color="#4E9A06">uv run fastapi</font> dev
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server 🚀 <span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server 🚀
@@ -78,7 +84,7 @@ Sie werden die automatisch erzeugte, interaktive API-Dokumentation sehen (bereit
Gehen Sie nun auf [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). Gehen Sie nun auf [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc).
Dort sehen Sie die alternative, automatische Dokumentation (bereitgestellt durch [ReDoc](https://github.com/Rebilly/ReDoc)): Dort sehen Sie die alternative, automatische Dokumentation (bereitgestellt durch [ReDoc](https://github.com/Redocly/redoc)):
![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
@@ -185,13 +191,13 @@ from backend.main import app
Sie können auch den Dateipfad an den Befehl `fastapi dev` übergeben, und er wird das zu verwendende FastAPI-App-Objekt erraten: Sie können auch den Dateipfad an den Befehl `fastapi dev` übergeben, und er wird das zu verwendende FastAPI-App-Objekt erraten:
```console ```console
$ fastapi dev main.py $ uv run fastapi dev main.py
``` ```
Oder Sie können die Option `--entrypoint` an den Befehl `fastapi dev` übergeben: Oder Sie können die Option `--entrypoint` an den Befehl `fastapi dev` übergeben:
```console ```console
$ fastapi dev --entrypoint main:app $ uv run fastapi dev --entrypoint main:app
``` ```
Aber Sie müssten sich daran erinnern, bei jedem Aufruf des `fastapi`-Befehls den korrekten Pfad\entrypoint zu übergeben. Aber Sie müssten sich daran erinnern, bei jedem Aufruf des `fastapi`-Befehls den korrekten Pfad\entrypoint zu übergeben.
@@ -205,7 +211,7 @@ Sie können optional Ihre FastAPI-App in der [FastAPI Cloud](https://fastapiclou
<div class="termy"> <div class="termy">
```console ```console
$ fastapi deploy $ uv run fastapi deploy
Deploying to FastAPI Cloud... Deploying to FastAPI Cloud...
@@ -218,7 +224,7 @@ Deploying to FastAPI Cloud...
Das CLI erkennt Ihre FastAPI-Anwendung automatisch und deployt sie in die Cloud. Wenn Sie nicht eingeloggt sind, wird Ihr Browser geöffnet, um die Authentifizierung abzuschließen. Das CLI erkennt Ihre FastAPI-Anwendung automatisch und deployt sie in die Cloud. Wenn Sie nicht eingeloggt sind, wird Ihr Browser geöffnet, um die Authentifizierung abzuschließen.
Das war's! Jetzt können Sie Ihre App unter dieser URL aufrufen. ✨ Das wars! Jetzt können Sie Ihre App unter dieser URL aufrufen. ✨
## Zusammenfassung, Schritt für Schritt { #recap-step-by-step } ## Zusammenfassung, Schritt für Schritt { #recap-step-by-step }
@@ -232,7 +238,7 @@ Das war's! Jetzt können Sie Ihre App unter dieser URL aufrufen. ✨
`FastAPI` ist eine Klasse, die direkt von `Starlette` erbt. `FastAPI` ist eine Klasse, die direkt von `Starlette` erbt.
Sie können alle [Starlette](https://www.starlette.dev/)-Funktionalitäten auch mit `FastAPI` nutzen. Sie können alle [Starlette](https://starlette.dev/)-Funktionalitäten auch mit `FastAPI` nutzen.
/// ///
@@ -349,7 +355,7 @@ Es steht Ihnen frei, jede Operation (HTTP-Methode) so zu verwenden, wie Sie es m
Die hier aufgeführten Informationen dienen als Leitfaden und sind nicht verbindlich. Die hier aufgeführten Informationen dienen als Leitfaden und sind nicht verbindlich.
Wenn Sie beispielsweise GraphQL verwenden, führen Sie normalerweise alle Aktionen nur mit POST-Operationen durch. Wenn Sie beispielsweise GraphQL verwenden, führen Sie normalerweise alle Aktionen nur mit `POST`-Operationen durch.
/// ///
+15 -3
View File
@@ -52,7 +52,7 @@ Verwenden Sie dafür `fallback="index.html"`:
{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *} {* ../../docs_src/frontend/tutorial002_py310.py hl[5] *}
**FastAPI** verwendet diesen Fallback nur für `GET`- und `HEAD`-Requests, die wie Browser-Navigation aussehen. Fehlende Dateien wie JavaScript, CSS und Bilder geben weiterhin `404` zurück. **FastAPI** verwendet diesen Fallback nur für `GET`- und `HEAD`-Requests, die explizit HTML mit `Accept: text/html` oder `Accept: application/xhtml+xml` akzeptieren, wie Browser-Navigationsrequests es normalerweise tun. Fehlende Dateien wie JavaScript, CSS und Bilder geben weiterhin `404` zurück.
Requests mit anderen Methoden, wie `POST` oder `PUT`, an Pfade, die nur zum Frontend-Fallback passen, geben ebenfalls `404` zurück. Reguläre **FastAPI**-*Pfadoperationen* haben weiterhin eine höhere Priorität als Frontend-Routen. Requests mit anderen Methoden, wie `POST` oder `PUT`, an Pfade, die nur zum Frontend-Fallback passen, geben ebenfalls `404` zurück. Reguläre **FastAPI**-*Pfadoperationen* haben weiterhin eine höhere Priorität als Frontend-Routen.
@@ -106,9 +106,13 @@ Dann geben fehlende Frontend-Pfade das normale `404` zurück.
## Verzeichnis prüfen { #check-directory } ## Verzeichnis prüfen { #check-directory }
Standardmäßig prüft `app.frontend()`, dass das Verzeichnis existiert, wenn die App erstellt wird. Standardmäßig verwendet `app.frontend()` `check_dir="auto"`.
Das hilft, Konfigurationsfehler früh zu erkennen. Wenn zum Beispiel das Output-Verzeichnis des Frontend-Builds fehlt, löst **FastAPI** beim Startup einen Fehler aus. Wenn die `FASTAPI_ENV`-Umgebungsvariable auf `development` gesetzt ist, zeigt **FastAPI** nur eine Warnung an, wenn das Output-Verzeichnis des Frontend-Builds fehlt. Der [`fastapi dev`-Befehl](https://github.com/fastapi/fastapi-cli#fastapi-dev) setzt diese Umgebungsvariable für Sie, wenn sie nicht bereits gesetzt ist. Dadurch können Sie während der Entwicklung das Backend starten, bevor Sie das Frontend bauen oder starten.
In jeder anderen Umgebung löst **FastAPI** einen Fehler aus, wenn die App erstellt wird. Das hilft, Konfigurationsfehler früh zu erkennen, bevor eine App ohne ihre Frontend-Dateien deployt wird.
Sie können auch `check_dir=True` setzen, um das Verzeichnis immer zu prüfen, wenn die App erstellt wird.
Wenn Ihre Frontend-Dateien später erstellt werden, zum Beispiel durch einen separaten Build-Schritt, nachdem das App-Objekt erstellt wurde, setzen Sie `check_dir=False`: Wenn Ihre Frontend-Dateien später erstellt werden, zum Beispiel durch einen separaten Build-Schritt, nachdem das App-Objekt erstellt wurde, setzen Sie `check_dir=False`:
@@ -126,6 +130,14 @@ In diesem Beispiel werden Frontend-Pfade unter `/app` bereitgestellt.
Alle regulären *Pfadoperationen* in der App haben weiterhin Vorrang, auch in anderen Routern. Alle regulären *Pfadoperationen* in der App haben weiterhin Vorrang, auch in anderen Routern.
## Abhängigkeiten und Middleware { #dependencies-and-middleware }
Frontend-Responses laufen innerhalb der normalen **FastAPI**-Anwendung, daher gilt HTTP-Middleware für sie.
Abhängigkeiten aus der App, aus einem `APIRouter` und aus `include_router()` gelten ebenfalls für Frontend-Responses. Das kann nützlich sein, um ein Frontend mit Cookie-Authentifizierung oder Ähnlichem zu schützen.
Abhängigkeiten können auch Response-Header ändern und Hintergrundtasks hinzufügen, wie bei normalen *Pfadoperationen*.
## Nur statischer Build-Output { #static-build-output-only } ## Nur statischer Build-Output { #static-build-output-only }
`app.frontend()` liefert Dateien aus, die bereits von Ihrem Frontend-Build generiert wurden. `app.frontend()` liefert Dateien aus, die bereits von Ihrem Frontend-Build generiert wurden.
+1 -1
View File
@@ -81,7 +81,7 @@ Aber falls Sie es für ein fortgeschrittenes Szenario benötigen, können Sie be
## Benutzerdefinierte Exceptionhandler installieren { #install-custom-exception-handlers } ## Benutzerdefinierte Exceptionhandler installieren { #install-custom-exception-handlers }
Sie können benutzerdefinierte Exceptionhandler mit [denselben Exception-Werkzeugen von Starlette](https://www.starlette.dev/exceptions/) hinzufügen. Sie können benutzerdefinierte Exceptionhandler mit [denselben Exception-Werkzeugen von Starlette](https://starlette.dev/exceptions/) hinzufügen.
Angenommen, Sie haben eine benutzerdefinierte Exception `UnicornException`, die Sie (oder eine Bibliothek, die Sie verwenden) `raise`n könnten. Angenommen, Sie haben eine benutzerdefinierte Exception `UnicornException`, die Sie (oder eine Bibliothek, die Sie verwenden) `raise`n könnten.
+58 -19
View File
@@ -1,22 +1,21 @@
# Tutorial Benutzerhandbuch { #tutorial-user-guide } # Tutorial Benutzerhandbuch { #tutorial-user-guide }
This tutorial shows you how to use **FastAPI** with most of its features, step by step.
Dieses Tutorial zeigt Ihnen Schritt für Schritt, wie Sie **FastAPI** mit den meisten seiner Funktionen verwenden können. Each section gradually builds on the previous ones, but it's structured to separate topics, so that you can go directly to any specific one to solve your specific API needs.
Jeder Abschnitt baut schrittweise auf den vorhergehenden auf, ist jedoch in einzelne Themen gegliedert, sodass Sie direkt zu einem bestimmten Thema übergehen können, um Ihre spezifischen API-Anforderungen zu lösen. It is also built to work as a future reference so you can come back and see exactly what you need.
Es ist auch so gestaltet, dass es als zukünftige Referenz dient, sodass Sie jederzeit zurückkommen und genau das sehen, was Sie benötigen.
## Den Code ausführen { #run-the-code } ## Den Code ausführen { #run-the-code }
Alle Codeblöcke können kopiert und direkt verwendet werden (es sind tatsächlich getestete Python-Dateien). Alle Codeblöcke können kopiert und direkt verwendet werden (es sind tatsächlich getestete Python-Dateien).
Um eines der Beispiele auszuführen, kopieren Sie den Code in eine Datei `main.py`, und starten Sie `fastapi dev`: Um eines der Beispiele auszuführen, kopieren Sie den Code in eine Datei `main.py`, und starten Sie `fastapi dev` mit `uv run`:
<div class="termy"> <div class="termy">
```console ```console
$ <font color="#4E9A06">fastapi</font> dev $ <font color="#4E9A06">uv run fastapi</font> dev
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server 🚀 <span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server 🚀
@@ -61,35 +60,75 @@ Die Verwendung in Ihrem eigenen Editor zeigt Ihnen die Vorteile von FastAPI am b
## FastAPI installieren { #install-fastapi } ## FastAPI installieren { #install-fastapi }
Der erste Schritt besteht darin, FastAPI zu installieren. Der erste Schritt besteht darin, Ihr Projekt einzurichten und FastAPI hinzuzufügen.
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md) erstellen, sie aktivieren und dann **FastAPI installieren**: Installieren Sie [`uv`](https://docs.astral.sh/uv/getting-started/installation/), erstellen Sie dann ein Projekt und fügen Sie FastAPI hinzu:
<div class="termy"> <div class="termy">
```console ```console
$ pip install "fastapi[standard]" $ uv init awesome-project --bare
$ cd awesome-project
$ uv add "fastapi[standard]"
---> 100% ---> 100%
``` ```
</div> </div>
`uv add` erstellt die virtuelle Umgebung des Projekts in `.venv`, fügt FastAPI zu `pyproject.toml` hinzu und erstellt `uv.lock`, sodass dieselben Packageversionen später installiert werden können.
/// details | Was diese Befehle tun
* `uv init`: Erstellt ein neues Python-Projekt.
* `awesome-project`: Erstellt das Projekt in einem neuen Verzeichnis mit diesem Namen.
* `--bare`: Erstellt nur die minimale Datei `pyproject.toml`, ohne eine Beispiel-`main.py`, `README.md` oder andere Dateien zu generieren. Sie erstellen die Anwendungsdateien in den nächsten Schritten dieses Tutorials selbst.
Dann betritt `cd awesome-project` das neue Projektverzeichnis, bevor FastAPI hinzugefügt wird.
`uv` verwendet eine kompatible Python-Version, die bereits auf Ihrem System installiert ist, oder lädt bei Bedarf eine herunter.
Wenn Sie `uv add` ausführen, wählt es kompatible Versionen von FastAPI und aller Packages aus, von denen FastAPI abhängt. Es zeichnet die exakten Versionen in `uv.lock` auf, wodurch es möglich wird, dieselben Packageversionen später auf einem anderen Computer oder beim Deployen der Anwendung zu installieren.
Das Erstellen oder Aktualisieren dieser Datei wird [**Locking** der Projektabhängigkeiten](https://docs.astral.sh/uv/concepts/projects/sync/) genannt. `uv` erledigt dies automatisch, wenn Sie ein Package hinzufügen.
///
/// details | FastAPI-Installationsoptionen
Wenn Sie mit `uv add "fastapi[standard]"` installieren, werden einige optionale Standard-Abhängigkeiten mit installiert, einschließlich `fastapi-cloud-cli`, welches Ihnen das Deployment in der [FastAPI Cloud](https://fastapicloud.com) ermöglicht.
Wenn Sie diese optionalen Abhängigkeiten nicht haben möchten, können Sie stattdessen `uv add fastapi` installieren.
Wenn Sie die Standard-Abhängigkeiten, aber ohne das `fastapi-cloud-cli` installieren möchten, können Sie mit `uv add "fastapi[standard-no-fastapi-cloud-cli]"` installieren.
///
/// details | Stattdessen `pip` verwenden
Wenn Sie es bevorzugen, eine virtuelle Umgebung und Packages manuell zu verwalten, erstellen und aktivieren Sie eine virtuelle Umgebung und installieren Sie dann FastAPI mit `pip install "fastapi[standard]"`.
Lesen Sie den [Leitfaden zu virtuellen Umgebungen](https://tiangolo.com/guides/virtual-environments/) für die detaillierten Schritte.
///
## Skills für AI-Agenten { #ai-agent-skills }
FastAPI enthält einen offiziellen Skill für AI-Coding-Agenten. Er ist mit dem Package gebündelt, sodass seine Anleitung mit der in Ihrem Projekt installierten FastAPI-Version übereinstimmt und aktualisiert wird, wenn Sie FastAPI aktualisieren.
Nachdem Sie FastAPI in Ihrem Projekt installiert haben, können Sie den Skill mit <a href="https://library-skills.io">Library Skills</a> installieren:
```bash
uvx library-skills
```
/// note | Hinweis /// note | Hinweis
Wenn Sie mit `pip install "fastapi[standard]"` installieren, werden einige optionale Standard-Abhängigkeiten mit installiert, einschließlich `fastapi-cloud-cli`, welches Ihnen das Deployment in der [FastAPI Cloud](https://fastapicloud.com) ermöglicht. `uvx` ist ein Alias für `uv tool run`. Es führt Library Skills in einer temporären, isolierten Umgebung aus, während Library Skills die in Ihrem Projekt installierten Packages scannt.
Wenn Sie diese optionalen Abhängigkeiten nicht haben möchten, können Sie stattdessen `pip install fastapi` installieren.
Wenn Sie die Standard-Abhängigkeiten, aber ohne das `fastapi-cloud-cli` installieren möchten, können Sie mit `pip install "fastapi[standard-no-fastapi-cloud-cli]"` installieren.
/// ///
/// tip | Tipp Der Skill ist kompatibel mit Codex, Claude Code, Cursor, GitHub Copilot, Gemini CLI, Pi, OpenCode und den meisten anderen Coding-Agenten. Wählen Sie bei Claude Code `.claude/skills`, wenn Sie gefragt werden, wo der Skill installiert werden soll.
FastAPI hat eine [offizielle Erweiterung für VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (und Cursor), die viele Funktionen bereitstellt, darunter einen Pfadoperation-Explorer, eine Pfadoperation-Suche, CodeLens-Navigation in Tests (zur Definition aus Tests springen) sowie FastAPI-Cloud-Deployment und Logs alles direkt aus Ihrem Editor.
///
## Handbuch für fortgeschrittene Benutzer { #advanced-user-guide } ## Handbuch für fortgeschrittene Benutzer { #advanced-user-guide }
+7 -7
View File
@@ -5,10 +5,10 @@ Sie können Middleware zu **FastAPI**-Anwendungen hinzufügen.
Eine „Middleware“ ist eine Funktion, die mit jedem **<abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Request</abbr>** arbeitet, bevor er von einer bestimmten *Pfadoperation* verarbeitet wird. Und auch mit jeder **<abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>**, bevor sie zurückgegeben wird. Eine „Middleware“ ist eine Funktion, die mit jedem **<abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Request</abbr>** arbeitet, bevor er von einer bestimmten *Pfadoperation* verarbeitet wird. Und auch mit jeder **<abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>**, bevor sie zurückgegeben wird.
* Sie nimmt jeden **Request** entgegen, der an Ihre Anwendung gesendet wird. * Sie nimmt jeden **Request** entgegen, der an Ihre Anwendung gesendet wird.
* Sie kann dann etwas mit diesem **Request** tun oder beliebigen Code ausführen. * Sie kann dann etwas mit diesem **Request** tun oder jeden notwendigen Code ausführen.
* Dann gibt sie den **Request** zur Verarbeitung durch den Rest der Anwendung weiter (durch eine bestimmte *Pfadoperation*). * Dann gibt sie den **Request** zur Verarbeitung durch den Rest der Anwendung weiter (durch eine bestimmte *Pfadoperation*).
* Sie nimmt dann die **Response** entgegen, die von der Anwendung generiert wurde (durch eine bestimmte *Pfadoperation*). * Sie nimmt dann die **Response** entgegen, die von der Anwendung generiert wurde (durch eine bestimmte *Pfadoperation*).
* Sie kann etwas mit dieser **Response** tun oder beliebigen Code ausführen. * Sie kann etwas mit dieser **Response** tun oder jeden notwendigen Code ausführen.
* Dann gibt sie die **Response** zurück. * Dann gibt sie die **Response** zurück.
/// note | Technische Details /// note | Technische Details
@@ -28,8 +28,8 @@ Die Middleware-Funktion erhält:
* Den `request`. * Den `request`.
* Eine Funktion `call_next`, die den `request` als Parameter erhält. * Eine Funktion `call_next`, die den `request` als Parameter erhält.
* Diese Funktion gibt den `request` an die entsprechende *Pfadoperation* weiter. * Diese Funktion gibt den `request` an die entsprechende *Pfadoperation* weiter.
* Dann gibt es die von der entsprechenden *Pfadoperation* generierte `response` zurück. * Dann gibt sie die von der entsprechenden *Pfadoperation* generierte `response` zurück.
* Sie können die `response` dann weiter modifizieren, bevor Sie sie zurückgeben. * Sie können die `response` dann weiter ändern, bevor Sie sie zurückgeben.
{* ../../docs_src/middleware/tutorial001_py310.py hl[8:9,11,14] *} {* ../../docs_src/middleware/tutorial001_py310.py hl[8:9,11,14] *}
@@ -37,7 +37,7 @@ Die Middleware-Funktion erhält:
Beachten Sie, dass benutzerdefinierte proprietäre Header hinzugefügt werden können [unter Verwendung des `X-`-Präfixes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). Beachten Sie, dass benutzerdefinierte proprietäre Header hinzugefügt werden können [unter Verwendung des `X-`-Präfixes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers).
Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen soll, müssen Sie sie zu Ihrer CORS-Konfiguration ([CORS (Cross-Origin Resource Sharing)](cors.md)) hinzufügen, indem Sie den Parameter `expose_headers` verwenden, der in [Starlettes CORS-Dokumentation](https://www.starlette.dev/middleware/#corsmiddleware) dokumentiert ist. Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen soll, müssen Sie sie zu Ihren CORS-Konfigurationen ([CORS (Cross-Origin Resource Sharing)](cors.md)) hinzufügen, indem Sie den Parameter `expose_headers` verwenden, der in [Starlettes CORS-Dokumentation](https://starlette.dev/middleware/#corsmiddleware) dokumentiert ist.
/// ///
@@ -67,7 +67,7 @@ Hier verwenden wir [`time.perf_counter()`](https://docs.python.org/3/library/tim
## Ausführungsreihenfolge bei mehreren Middlewares { #multiple-middleware-execution-order } ## Ausführungsreihenfolge bei mehreren Middlewares { #multiple-middleware-execution-order }
Wenn Sie mehrere Middlewares hinzufügen, entweder mit dem `@app.middleware()` Dekorator oder der Methode `app.add_middleware()`, umschließt jede neue Middleware die Anwendung und bildet einen Stapel. Die zuletzt hinzugefügte Middleware ist die *äußerste*, und die erste ist die *innerste*. Wenn Sie mehrere Middlewares hinzufügen, entweder mit dem `@app.middleware()`-Dekorator oder der Methode `app.add_middleware()`, wrappt jede neue Middleware die Anwendung und bildet einen Stapel. Die zuletzt hinzugefügte Middleware ist die *äußerste*, und die erste ist die *innerste*.
Auf dem Requestpfad läuft die *äußerste* Middleware zuerst. Auf dem Requestpfad läuft die *äußerste* Middleware zuerst.
@@ -92,4 +92,4 @@ Dieses Stapelverhalten stellt sicher, dass Middlewares in einer vorhersehbaren u
Sie können später mehr über andere Middlewares im [Handbuch für fortgeschrittene Benutzer: Fortgeschrittene Middleware](../advanced/middleware.md) lesen. Sie können später mehr über andere Middlewares im [Handbuch für fortgeschrittene Benutzer: Fortgeschrittene Middleware](../advanced/middleware.md) lesen.
In der nächsten Sektion erfahren Sie, wie Sie <abbr title="Cross-Origin Resource Sharing Ressourcenfreigabe zwischen Ursprüngen">CORS</abbr> mit einer Middleware behandeln können. In der nächsten Sektion erfahren Sie, wie Sie <abbr title="Cross-Origin Resource Sharing - Ressourcenfreigabe zwischen Ursprüngen">CORS</abbr> mit einer Middleware behandeln können.
+44 -44
View File
@@ -6,7 +6,7 @@ Sie können Pfad-„Parameter“ oder -„Variablen“ mit der gleichen Syntax d
Der Wert des Pfad-Parameters `item_id` wird Ihrer Funktion als das Argument `item_id` übergeben. Der Wert des Pfad-Parameters `item_id` wird Ihrer Funktion als das Argument `item_id` übergeben.
Wenn Sie dieses Beispiel ausführen und auf [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo) gehen, sehen Sie als <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>: Wenn Sie also dieses Beispiel ausführen und auf [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo) gehen, sehen Sie als <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>:
```JSON ```JSON
{"item_id":"foo"} {"item_id":"foo"}
@@ -14,11 +14,11 @@ Wenn Sie dieses Beispiel ausführen und auf [http://127.0.0.1:8000/items/foo](ht
## Pfad-Parameter mit Typen { #path-parameters-with-types } ## Pfad-Parameter mit Typen { #path-parameters-with-types }
Sie können den Typ eines Pfad-Parameters in der Argumentliste der Funktion deklarieren, mit Standard-Python-Typannotationen: Sie können den Typ eines Pfad-Parameters in der Funktion deklarieren, mit Standard-Python-Typannotationen:
{* ../../docs_src/path_params/tutorial002_py310.py hl[7] *} {* ../../docs_src/path_params/tutorial002_py310.py hl[7] *}
In diesem Fall wird `item_id` als `int` deklariert, also als Ganzzahl. In diesem Fall wird `item_id` als `int` deklariert.
/// tip | Tipp /// tip | Tipp
@@ -36,9 +36,9 @@ Wenn Sie dieses Beispiel ausführen und Ihren Browser unter [http://127.0.0.1:80
/// tip | Tipp /// tip | Tipp
Beachten Sie, dass der Wert, den Ihre Funktion erhält und zurückgibt, die Zahl `3` ist, also ein `int`. Nicht der String „3“, also ein `str`. Beachten Sie, dass der Wert, den Ihre Funktion erhalten (und zurückgegeben) hat, `3` ist, als Python-`int`, nicht als String `"3"`.
Sprich, mit dieser Typdeklaration wird **FastAPI** den <dfn title="Den String, der von einem HTTP-Request kommt, in Python-Daten konvertieren">„parsen“</dfn>. Sprich, mit dieser Typdeklaration bietet **FastAPI** Ihnen automatisches Request-<dfn title="Den String, der von einem HTTP-Request kommt, in Python-Daten konvertieren">„Parsing“</dfn>.
/// ///
@@ -62,9 +62,9 @@ Wenn Sie aber im Browser [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000
} }
``` ```
Der Pfad-Parameter `item_id` hatte den Wert „foo“, was kein `int` ist. denn der Pfad-Parameter `item_id` hatte den Wert `"foo"`, was kein `int` ist.
Die gleiche Fehlermeldung würde angezeigt werden, wenn Sie ein `float` (also eine Kommazahl) statt eines `int`s übergeben würden, wie etwa in: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2) Die gleiche Fehlermeldung würde angezeigt werden, wenn Sie ein `float` statt eines `int`s übergeben würden, wie etwa in: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
/// tip | Tipp /// tip | Tipp
@@ -78,101 +78,101 @@ Das ist unglaublich hilfreich, wenn Sie Code entwickeln und debuggen, welcher mi
## Dokumentation { #documentation } ## Dokumentation { #documentation }
Wenn Sie die Seite [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) in Ihrem Browser öffnen, sehen Sie eine automatische, interaktive API-Dokumentation: Und wenn Sie die Seite [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) in Ihrem Browser öffnen, sehen Sie eine automatische, interaktive API-Dokumentation wie:
<img src="/img/tutorial/path-params/image01.png"> <img src="/img/tutorial/path-params/image01.png">
/// tip | Tipp /// tip | Tipp
Wiederum, mit dieser gleichen Python-Typdeklaration gibt Ihnen **FastAPI** eine automatische, interaktive Dokumentation (verwendet die Swagger-Benutzeroberfläche). Wiederum, nur mit dieser gleichen Python-Typdeklaration gibt Ihnen **FastAPI** eine automatische, interaktive Dokumentation (integriert Swagger UI).
Beachten Sie, dass der Pfad-Parameter dort als Ganzzahl deklariert ist. Beachten Sie, dass der Pfad-Parameter dort als Ganzzahl deklariert ist.
/// ///
## Nützliche Standards, alternative Dokumentation { #standards-based-benefits-alternative-documentation } ## Standardbasierte Vorteile, alternative Dokumentation { #standards-based-benefits-alternative-documentation }
Und weil das generierte Schema vom [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md)-Standard kommt, gibt es viele kompatible Tools. Und weil das generierte Schema vom [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md)-Standard kommt, gibt es viele kompatible Tools.
Zum Beispiel bietet **FastAPI** selbst eine alternative API-Dokumentation (verwendet ReDoc), welche Sie unter [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) einsehen können: Aus diesem Grund bietet **FastAPI** selbst eine alternative API-Dokumentation (verwendet ReDoc), welche Sie unter [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) einsehen können:
<img src="/img/tutorial/path-params/image02.png"> <img src="/img/tutorial/path-params/image02.png">
Und viele weitere kompatible Tools. Inklusive Codegenerierung für viele Sprachen. Auf die gleiche Weise gibt es viele kompatible Tools. Inklusive Codegenerierungstools für viele Sprachen.
## Pydantic { #pydantic } ## Pydantic { #pydantic }
Die ganze Datenvalidierung wird hinter den Kulissen von [Pydantic](https://docs.pydantic.dev/) durchgeführt, Sie profitieren also von dessen Vorteilen. Und Sie wissen, dass Sie in guten Händen sind. Die ganze Datenvalidierung wird hinter den Kulissen von [Pydantic](https://pydantic.dev/docs/) durchgeführt, Sie profitieren also von dessen Vorteilen. Und Sie wissen, dass Sie in guten Händen sind.
Sie können für Typdeklarationen auch `str`, `float`, `bool` und viele andere komplexe Datentypen verwenden. Sie können die gleichen Typdeklarationen auch mit `str`, `float`, `bool` und vielen anderen komplexen Datentypen verwenden.
Mehrere davon werden wir in den nächsten Kapiteln erkunden. Mehrere davon werden in den nächsten Kapiteln des Tutorials erkundet.
## Die Reihenfolge ist wichtig { #order-matters } ## Die Reihenfolge ist wichtig { #order-matters }
Wenn Sie *Pfadoperationen* erstellen, haben Sie manchmal einen fixen Pfad. Wenn Sie *Pfadoperationen* erstellen, haben Sie manchmal Situationen, in denen Sie einen fixen Pfad haben.
Etwa `/users/me`, um Daten über den aktuellen Benutzer zu erhalten. Etwa `/users/me`, sagen wir, um Daten über den aktuellen Benutzer zu erhalten.
Und Sie haben auch einen Pfad `/users/{user_id}`, um Daten über einen spezifischen Benutzer zu erhalten, mittels einer Benutzer-ID. Und Sie können auch einen Pfad `/users/{user_id}` haben, um Daten über einen spezifischen Benutzer mittels irgendeiner Benutzer-ID zu erhalten.
Weil *Pfadoperationen* in ihrer Reihenfolge ausgewertet werden, müssen Sie sicherstellen, dass der Pfad `/users/me` vor `/users/{user_id}` deklariert wurde: Weil *Pfadoperationen* in ihrer Reihenfolge ausgewertet werden, müssen Sie sicherstellen, dass der Pfad für `/users/me` vor dem für `/users/{user_id}` deklariert wurde:
{* ../../docs_src/path_params/tutorial003_py310.py hl[6,11] *} {* ../../docs_src/path_params/tutorial003_py310.py hl[6,11] *}
Ansonsten würde der Pfad für `/users/{user_id}` auch `/users/me` auswerten, und annehmen, dass ein Parameter `user_id` mit dem Wert „me“ übergeben wurde. Ansonsten würde der Pfad für `/users/{user_id}` auch auf `/users/me` passen und „denken, dass er einen Parameter `user_id` mit dem Wert `"me"` erhält.
Sie können eine Pfadoperation auch nicht erneut definieren: Ebenso können Sie eine Pfadoperation nicht erneut definieren:
{* ../../docs_src/path_params/tutorial003b_py310.py hl[6,11] *} {* ../../docs_src/path_params/tutorial003b_py310.py hl[6,11] *}
Die erste Definition wird immer verwendet werden, da ihr Pfad zuerst übereinstimmt. Die erste Definition wird immer verwendet werden, da ihr Pfad zuerst übereinstimmt.
## Vordefinierte Parameterwerte { #predefined-values } ## Vordefinierte Werte { #predefined-values }
Wenn Sie eine *Pfadoperation* haben, welche einen *Pfad-Parameter* hat, aber Sie wollen, dass dessen gültige Werte vordefiniert sind, können Sie ein Standard-Python <abbr title="Enumeration">`Enum`</abbr> verwenden. Wenn Sie eine *Pfadoperation* haben, welche einen *Pfad-Parameter* erhält, aber Sie wollen, dass die möglichen gültigen *Pfad-Parameter*-Werte vordefiniert sind, können Sie ein Standard-Python-<abbr title="Enumeration">`Enum`</abbr> verwenden.
### Eine `Enum`-Klasse erstellen { #create-an-enum-class } ### Eine `Enum`-Klasse erstellen { #create-an-enum-class }
Importieren Sie `Enum` und erstellen Sie eine Unterklasse, die von `str` und `Enum` erbt. Importieren Sie `Enum` und erstellen Sie eine Unterklasse, die von `str` und `Enum` erbt.
Indem Sie von `str` erben, weiß die API-Dokumentation, dass die Werte vom Typ `str` sein müssen, und wird in der Lage sein, korrekt zu rendern. Indem Sie von `str` erben, weiß die API-Dokumentation, dass die Werte vom Typ `string` sein müssen, und wird in der Lage sein, korrekt zu rendern.
Erstellen Sie dann Klassen-Attribute mit festgelegten Werten, welches die erlaubten Werte sein werden: Erstellen Sie dann Klassen-Attribute mit festgelegten Werten, welche die verfügbaren gültigen Werte sein werden:
{* ../../docs_src/path_params/tutorial005_py310.py hl[1,6:9] *} {* ../../docs_src/path_params/tutorial005_py310.py hl[1,6:9] *}
/// tip | Tipp /// tip | Tipp
Falls Sie sich fragen, was „AlexNet“, „ResNet“ und „LeNet“ ist, das sind Namen von <dfn title="Genauer gesagt: Deep-Learning-Modellarchitekturen">Modellen</dfn> für maschinelles Lernen. Falls Sie sich fragen: „AlexNet“, „ResNet“ und „LeNet“ sind nur Namen von <dfn title="Genauer gesagt: Deep-Learning-Modellarchitekturen">Modellen</dfn> für maschinelles Lernen.
/// ///
### Einen *Pfad-Parameter* deklarieren { #declare-a-path-parameter } ### Einen *Pfad-Parameter* deklarieren { #declare-a-path-parameter }
Dann erstellen Sie einen *Pfad-Parameter*, der als Typ die gerade erstellte Enum-Klasse hat (`ModelName`): Dann erstellen Sie einen *Pfad-Parameter* mit einer Typannotation, welche die von Ihnen erstellte Enum-Klasse (`ModelName`) verwendet:
{* ../../docs_src/path_params/tutorial005_py310.py hl[16] *} {* ../../docs_src/path_params/tutorial005_py310.py hl[16] *}
### Die API-Dokumentation testen { #check-the-docs } ### Die Dokumentation testen { #check-the-docs }
Weil die erlaubten Werte für den *Pfad-Parameter* nun vordefiniert sind, kann die interaktive Dokumentation sie als Auswahl-Drop-Down anzeigen: Weil die verfügbaren Werte für den *Pfad-Parameter* nun vordefiniert sind, kann die interaktive Dokumentation diese hübsch anzeigen:
<img src="/img/tutorial/path-params/image03.png"> <img src="/img/tutorial/path-params/image03.png">
### Mit Python-*Enumerationen* arbeiten { #working-with-python-enumerations } ### Mit Python-*Enumerationen* arbeiten { #working-with-python-enumerations }
Der *Pfad-Parameter* wird ein *<abbr title="Member Mitglied: Einer der möglichen Werte einer Enumeration">Member</abbr> einer Enumeration* sein. Der Wert des *Pfad-Parameters* wird ein *<abbr title="Member Mitglied: Einer der möglichen Werte einer Enumeration">Member</abbr> einer Enumeration* sein.
#### *Enumeration-Member* vergleichen { #compare-enumeration-members } #### *Enumeration-Member* vergleichen { #compare-enumeration-members }
Sie können ihn mit einem Member Ihrer Enumeration `ModelName` vergleichen: Sie können ihn mit dem *Enumeration-Member* in Ihrem erstellten Enum `ModelName` vergleichen:
{* ../../docs_src/path_params/tutorial005_py310.py hl[17] *} {* ../../docs_src/path_params/tutorial005_py310.py hl[17] *}
#### *Enumerations-Wert* erhalten { #get-the-enumeration-value } #### *Enumerations-Wert* erhalten { #get-the-enumeration-value }
Den tatsächlichen Wert (in diesem Fall ein `str`) erhalten Sie via `model_name.value`, oder generell, `your_enum_member.value`: Den tatsächlichen Wert (in diesem Fall ein `str`) erhalten Sie mittels `model_name.value`, oder generell, `your_enum_member.value`:
{* ../../docs_src/path_params/tutorial005_py310.py hl[20] *} {* ../../docs_src/path_params/tutorial005_py310.py hl[20] *}
@@ -184,13 +184,13 @@ Sie können den Wert `"lenet"` außerdem mittels `ModelName.lenet.value` abrufen
#### *Enumeration-Member* zurückgeben { #return-enumeration-members } #### *Enumeration-Member* zurückgeben { #return-enumeration-members }
Sie können *Enum-Member* in ihrer *Pfadoperation* zurückgeben, sogar verschachtelt in einem JSON-Body (z. B. als `dict`). Sie können *Enum-Member* von Ihrer *Pfadoperation* zurückgeben, sogar verschachtelt in einem JSON-Body (z. B. als `dict`).
Diese werden zu ihren entsprechenden Werten konvertiert (in diesem Fall Strings), bevor sie zum Client übertragen werden: Diese werden zu ihren entsprechenden Werten konvertiert (in diesem Fall Strings), bevor sie an den Client zurückgegeben werden:
{* ../../docs_src/path_params/tutorial005_py310.py hl[18,21,23] *} {* ../../docs_src/path_params/tutorial005_py310.py hl[18,21,23] *}
In Ihrem Client erhalten Sie eine JSON-Response, wie etwa: In Ihrem Client erhalten Sie eine JSON-Response wie:
```JSON ```JSON
{ {
@@ -209,21 +209,21 @@ Sprich, die URL für diese Datei wäre etwas wie: `/files/home/johndoe/myfile.tx
### OpenAPI-Unterstützung { #openapi-support } ### OpenAPI-Unterstützung { #openapi-support }
OpenAPI bietet nicht die Möglichkeit, dass ein *Pfad-Parameter* seinerseits einen *Pfad* enthalten kann, das würde zu Szenarios führen, die schwierig zu testen und zu definieren sind. OpenAPI bietet nicht die Möglichkeit, zu deklarieren, dass ein *Pfad-Parameter* in sich einen *Pfad* enthalten kann, da das zu Szenarios führen könnte, die schwierig zu testen und zu definieren sind.
Trotzdem können Sie das in **FastAPI** tun, indem Sie eines der internen Tools von Starlette verwenden. Trotzdem können Sie das in **FastAPI** tun, indem Sie eines der internen Tools von Starlette verwenden.
Die Dokumentation würde weiterhin funktionieren, allerdings wird nicht dokumentiert werden, dass der Parameter ein Pfad sein sollte. Die Dokumentation würde weiterhin funktionieren, allerdings ohne irgendeine Dokumentation hinzuzufügen, die besagt, dass der Parameter einen Pfad enthalten sollte.
### Pfad-Konverter { #path-convertor } ### Pfad-Konverter { #path-convertor }
Mittels einer Option direkt von Starlette können Sie einen *Pfad-Parameter* deklarieren, der einen Pfad enthalten soll, indem Sie eine URL wie folgt definieren: Mittels einer Option direkt von Starlette können Sie einen *Pfad-Parameter* deklarieren, der einen *Pfad* enthält, indem Sie eine URL wie folgt definieren:
``` ```
/files/{file_path:path} /files/{file_path:path}
``` ```
In diesem Fall ist der Name des Parameters `file_path`. Der letzte Teil, `:path`, sagt aus, dass der Parameter ein *Pfad* sein soll. In diesem Fall ist der Name des Parameters `file_path`, und der letzte Teil, `:path`, sagt ihm, dass der Parameter mit jedem *Pfad* übereinstimmen sollte.
Sie verwenden das also wie folgt: Sie verwenden das also wie folgt:
@@ -231,7 +231,7 @@ Sie verwenden das also wie folgt:
/// tip | Tipp /// tip | Tipp
Der Parameter könnte einen führenden Schrägstrich (`/`) haben, wie etwa in `/home/johndoe/myfile.txt`. Der Parameter könnte `/home/johndoe/myfile.txt` enthalten müssen, mit einem führenden Schrägstrich (`/`).
In dem Fall wäre die URL: `/files//home/johndoe/myfile.txt`, mit einem doppelten Schrägstrich (`//`) zwischen `files` und `home`. In dem Fall wäre die URL: `/files//home/johndoe/myfile.txt`, mit einem doppelten Schrägstrich (`//`) zwischen `files` und `home`.
@@ -239,13 +239,13 @@ In dem Fall wäre die URL: `/files//home/johndoe/myfile.txt`, mit einem doppelte
## Zusammenfassung { #recap } ## Zusammenfassung { #recap }
In **FastAPI** erhalten Sie mittels kurzer, intuitiver Typdeklarationen: Mit **FastAPI** erhalten Sie mittels kurzer, intuitiver und Standard-Python-Typdeklarationen:
* Editor-Unterstützung: Fehlerprüfungen, Codevervollständigung, usw. * Editor-Unterstützung: Fehlerprüfungen, Codevervollständigung, usw.
* Daten „<dfn title="Den String, der von einem HTTP-Request kommt, in Python-Daten konvertieren">parsen</dfn>“ * Daten „<dfn title="Den String, der von einem HTTP-Request kommt, in Python-Daten konvertieren">parsen</dfn>“
* Datenvalidierung * Datenvalidierung
* API-Annotationen und automatische Dokumentation * API-Annotation und automatische Dokumentation
Und Sie müssen sie nur einmal deklarieren. Und Sie müssen sie nur einmal deklarieren.
Das ist wahrscheinlich der sichtbarste Unterschied zwischen **FastAPI** und alternativen Frameworks (abgesehen von der reinen Performanz). Das ist wahrscheinlich der wichtigste sichtbare Vorteil von **FastAPI** im Vergleich zu alternativen Frameworks (abgesehen von der rohen Performanz).
@@ -369,11 +369,11 @@ Es kann Fälle geben, in denen Sie eine **benutzerdefinierte Validierung** durch
In diesen Fällen können Sie eine **benutzerdefinierte Validierungsfunktion** verwenden, die nach der normalen Validierung angewendet wird (z. B. nach der Validierung, dass der Wert ein `str` ist). In diesen Fällen können Sie eine **benutzerdefinierte Validierungsfunktion** verwenden, die nach der normalen Validierung angewendet wird (z. B. nach der Validierung, dass der Wert ein `str` ist).
Sie können dies mit [Pydantics `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) innerhalb von `Annotated` erreichen. Sie können dies mit [Pydantics `AfterValidator`](https://pydantic.dev/docs/validation/latest/concepts/validators/#field-after-validator) innerhalb von `Annotated` erreichen.
/// tip | Tipp /// tip | Tipp
Pydantic unterstützt auch [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator) und andere. 🤓 Pydantic unterstützt auch [`BeforeValidator`](https://pydantic.dev/docs/validation/latest/concepts/validators/#field-before-validator) und andere. 🤓
/// ///
+4 -4
View File
@@ -6,10 +6,10 @@ Sie können Dateien, die vom Client hochgeladen werden, mithilfe von `File` defi
Um hochgeladene Dateien zu empfangen, installieren Sie zuerst [`python-multipart`](https://github.com/Kludex/python-multipart). Um hochgeladene Dateien zu empfangen, installieren Sie zuerst [`python-multipart`](https://github.com/Kludex/python-multipart).
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md) erstellen, sie aktivieren und dann das Paket installieren, zum Beispiel: Fügen Sie es Ihrem Projekt hinzu:
```console ```console
$ pip install python-multipart $ uv add python-multipart
``` ```
Das liegt daran, dass hochgeladene Dateien als „Formulardaten“ gesendet werden. Das liegt daran, dass hochgeladene Dateien als „Formulardaten“ gesendet werden.
@@ -147,7 +147,7 @@ Sie können auch `File()` mit `UploadFile` verwenden, um zum Beispiel zusätzlic
## Mehrere Datei-Uploads { #multiple-file-uploads } ## Mehrere Datei-Uploads { #multiple-file-uploads }
Es ist auch möglich, mehrere Dateien gleichzeitig hochzuladen. Es ist möglich, mehrere Dateien gleichzeitig hochzuladen.
Diese werden demselben „Formularfeld“ zugeordnet, welches mittels „Formulardaten“ gesendet wird. Diese werden demselben „Formularfeld“ zugeordnet, welches mittels „Formulardaten“ gesendet wird.
@@ -159,7 +159,7 @@ Sie erhalten, wie deklariert, eine `list` von `bytes` oder `UploadFile`s.
/// note | Technische Details /// note | Technische Details
Sie können auch `from starlette.responses import HTMLResponse` verwenden. Sie könnten auch `from starlette.responses import HTMLResponse` verwenden.
**FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Responses</abbr> kommen aber direkt von Starlette. **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Responses</abbr> kommen aber direkt von Starlette.
+6 -6
View File
@@ -6,10 +6,10 @@ Sie können **Pydantic-Modelle** verwenden, um **Formularfelder** in FastAPI zu
Um Formulare zu verwenden, installieren Sie zuerst [`python-multipart`](https://github.com/Kludex/python-multipart). Um Formulare zu verwenden, installieren Sie zuerst [`python-multipart`](https://github.com/Kludex/python-multipart).
Stellen Sie sicher, dass Sie eine [Virtuelle Umgebung](../virtual-environments.md) erstellen, sie aktivieren und es dann installieren, zum Beispiel: Fügen Sie es zu Ihrem Projekt hinzu:
```console ```console
$ pip install python-multipart $ uv add python-multipart
``` ```
/// ///
@@ -38,7 +38,7 @@ Sie können dies in der Dokumentations-UI unter `/docs` testen:
## Zusätzliche Formularfelder verbieten { #forbid-extra-form-fields } ## Zusätzliche Formularfelder verbieten { #forbid-extra-form-fields }
In einigen speziellen Anwendungsfällen (wahrscheinlich nicht sehr häufig) möchten Sie möglicherweise die Formularfelder auf nur diejenigen beschränken, die im Pydantic-Modell deklariert sind, und jegliche **zusätzlichen** Felder **verbieten**. In einigen speziellen Anwendungsfällen (wahrscheinlich nicht sehr häufig) möchten Sie möglicherweise die Formularfelder auf nur diejenigen **beschränken**, die im Pydantic-Modell deklariert sind. Und jegliche **zusätzlichen** Felder **verbieten**.
/// note | Hinweis /// note | Hinweis
@@ -46,11 +46,11 @@ Dies wird seit FastAPI Version `0.114.0` unterstützt. 🤓
/// ///
Sie können die Modellkonfiguration von Pydantic verwenden, um jegliche `extra` Felder zu `verbieten`: Sie können Pydantics Modellkonfiguration verwenden, um jegliche `extra`-Felder auf `forbid` zu setzen:
{* ../../docs_src/request_form_models/tutorial002_an_py310.py hl[12] *} {* ../../docs_src/request_form_models/tutorial002_an_py310.py hl[12] *}
Wenn ein Client versucht, einige zusätzliche Daten zu senden, erhält er eine **Error-<abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>**. Wenn ein Client versucht, einige zusätzliche Daten zu senden, erhält er eine **Error**-<abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>.
Zum Beispiel, wenn der Client versucht, folgende Formularfelder zu senden: Zum Beispiel, wenn der Client versucht, folgende Formularfelder zu senden:
@@ -58,7 +58,7 @@ Zum Beispiel, wenn der Client versucht, folgende Formularfelder zu senden:
* `password`: `Portal Gun` * `password`: `Portal Gun`
* `extra`: `Mr. Poopybutthole` * `extra`: `Mr. Poopybutthole`
erhält er eine Error-Response, die ihm mitteilt, dass das Feld `extra` nicht erlaubt ist: Er erhält eine Error-Response, die ihm mitteilt, dass das Feld `extra` nicht erlaubt ist:
```json ```json
{ {
@@ -1,15 +1,15 @@
# Formulardaten und Dateien im Request { #request-forms-and-files } # Formulardaten und Dateien im Request { #request-forms-and-files }
Sie können gleichzeitig Dateien und Formulardaten mit `File` und `Form` definieren. Sie können gleichzeitig Dateien und Formularfelder mit `File` und `Form` definieren.
/// note | Hinweis /// note | Hinweis
Um hochgeladene Dateien und/oder Formulardaten zu empfangen, installieren Sie zuerst [`python-multipart`](https://github.com/Kludex/python-multipart). Um hochgeladene Dateien und/oder Formulardaten zu empfangen, installieren Sie zuerst [`python-multipart`](https://github.com/Kludex/python-multipart).
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md) erstellen, diese aktivieren und es dann installieren, z. B.: Fügen Sie es Ihrem Projekt hinzu:
```console ```console
$ pip install python-multipart $ uv add python-multipart
``` ```
/// ///
+2 -2
View File
@@ -7,10 +7,10 @@ Wenn Sie Felder aus Formularen statt JSON empfangen müssen, können Sie `Form`
Um Formulare zu verwenden, installieren Sie zuerst [`python-multipart`](https://github.com/Kludex/python-multipart). Um Formulare zu verwenden, installieren Sie zuerst [`python-multipart`](https://github.com/Kludex/python-multipart).
Erstellen Sie unbedingt eine [virtuelle Umgebung](../virtual-environments.md), aktivieren Sie diese und installieren Sie dann das Paket, zum Beispiel: Fügen Sie es Ihrem Projekt hinzu:
```console ```console
$ pip install python-multipart $ uv add python-multipart
``` ```
/// ///
+34 -34
View File
@@ -1,8 +1,8 @@
# Responsemodell Rückgabetyp { #response-model-return-type } # Responsemodell Rückgabetyp { #response-model-return-type }
Sie können den Typ der <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr> deklarieren, indem Sie den **Rückgabetyp** der *Pfadoperation* annotieren. Sie können den Typ der <abbr title="Response Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr> deklarieren, indem Sie den **Rückgabetyp** der *Pfadoperation-Funktion* annotieren.
Hierbei können Sie **Typannotationen** genauso verwenden, wie Sie es bei Werten von Funktions-**Parametern** machen; verwenden Sie Pydantic-Modelle, Listen, Dicts und skalare Werte wie Nummern, Booleans, usw. Hierbei können Sie **Typannotationen** genauso verwenden, wie Sie es bei Eingabedaten in Funktions-**Parametern** machen; verwenden Sie Pydantic-Modelle, Listen, Dictionaries und skalare Werte wie Integer, Booleans, usw.
{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *} {* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *}
@@ -24,9 +24,9 @@ Aber am wichtigsten:
Es gibt Fälle, da möchten oder müssen Sie Daten zurückgeben, die nicht genau dem entsprechen, was der Typ deklariert. Es gibt Fälle, da möchten oder müssen Sie Daten zurückgeben, die nicht genau dem entsprechen, was der Typ deklariert.
Zum Beispiel könnten Sie **ein Dictionary zurückgeben** wollen, oder ein Datenbank-Objekt, aber **es als Pydantic-Modell deklarieren**. Auf diese Weise übernimmt das Pydantic-Modell alle Datendokumentation, -validierung, usw. für das Objekt, welches Sie zurückgeben (z. B. ein Dictionary oder ein Datenbank-Objekt). Zum Beispiel könnten Sie **ein Dictionary zurückgeben** wollen, oder ein Datenbankobjekt, aber **es als Pydantic-Modell deklarieren**. Auf diese Weise übernimmt das Pydantic-Modell alle Datendokumentation, -validierung, usw. für das Objekt, welches Sie zurückgeben (z. B. ein Dictionary oder ein Datenbankobjekt).
Würden Sie eine hierfür eine Rückgabetyp-Annotation verwenden, dann würden Tools und Editoren (korrekterweise) Fehler ausgeben, die Ihnen sagen, dass Ihre Funktion einen Typ zurückgibt (z. B. ein Dict), der sich unterscheidet von dem, was Sie deklariert haben (z. B. ein Pydantic-Modell). Würden Sie eine Rückgabetyp-Annotation hinzufügen, dann würden Tools und Editoren (korrekterweise) Fehler ausgeben, die Ihnen sagen, dass Ihre Funktion einen Typ zurückgibt (z. B. ein Dict), der sich unterscheidet von dem, was Sie deklariert haben (z. B. ein Pydantic-Modell).
In solchen Fällen können Sie statt des Rückgabetyps den **Pfadoperation-Dekorator**-Parameter `response_model` verwenden. In solchen Fällen können Sie statt des Rückgabetyps den **Pfadoperation-Dekorator**-Parameter `response_model` verwenden.
@@ -42,17 +42,17 @@ Sie können `response_model` in jeder möglichen *Pfadoperation* verwenden:
/// note | Hinweis /// note | Hinweis
Beachten Sie, dass `response_model` ein Parameter der „Dekorator“-Methode ist (`get`, `post`, usw.). Nicht der *Pfadoperation-Funktion*, so wie die anderen Parameter und der Body. Beachten Sie, dass `response_model` ein Parameter der „Dekorator“-Methode ist (`get`, `post`, usw.). Nicht Ihrer *Pfadoperation-Funktion*, so wie alle Parameter und der Body.
/// ///
`response_model` nimmt denselben Typ entgegen, den Sie auch für ein Pydantic-Modellfeld deklarieren würden, also etwa ein Pydantic-Modell, aber es kann auch z. B. eine `list`e von Pydantic-Modellen sein, wie etwa `List[Item]`. `response_model` nimmt denselben Typ entgegen, den Sie auch für ein Pydantic-Modellfeld deklarieren würden, also etwa ein Pydantic-Modell, aber es kann auch z. B. eine `list` von Pydantic-Modellen sein, wie etwa `List[Item]`.
FastAPI wird dieses `response_model` nehmen, um die Daten zu dokumentieren, validieren, usw. und auch, um **die Ausgabedaten** entsprechend der Typdeklaration **zu konvertieren und filtern**. FastAPI wird dieses `response_model` nehmen, um die Daten zu dokumentieren, validieren, usw. und auch, um **die Ausgabedaten** entsprechend der Typdeklaration **zu konvertieren und filtern**.
/// tip | Tipp /// tip | Tipp
Wenn Sie in Ihrem Editor strikte Typchecks haben, mypy, usw., können Sie den Funktions-Rückgabetyp als <abbr title="„Irgend etwas“">`Any`</abbr> deklarieren. Wenn Sie in Ihrem Editor strikte Typchecks haben, mypy, usw., können Sie den Funktions-Rückgabetyp als `Any` deklarieren.
So sagen Sie dem Editor, dass Sie absichtlich *irgendetwas* zurückgeben. Aber FastAPI wird trotzdem die Dokumentation, Validierung, Filterung, usw. der Daten übernehmen, via `response_model`. So sagen Sie dem Editor, dass Sie absichtlich *irgendetwas* zurückgeben. Aber FastAPI wird trotzdem die Dokumentation, Validierung, Filterung, usw. der Daten übernehmen, via `response_model`.
@@ -60,11 +60,11 @@ So sagen Sie dem Editor, dass Sie absichtlich *irgendetwas* zurückgeben. Aber F
### `response_model`-Priorität { #response-model-priority } ### `response_model`-Priorität { #response-model-priority }
Wenn sowohl Rückgabetyp als auch `response_model` deklariert sind, hat `response_model` die Priorität und wird von FastAPI bevorzugt verwendet. Wenn sowohl Rückgabetyp als auch `response_model` deklariert sind, hat `response_model` die Priorität und wird von FastAPI verwendet.
So können Sie korrekte Typannotationen zu Ihrer Funktion hinzufügen, die von Ihrem Editor und Tools wie mypy verwendet werden. Und dennoch übernimmt FastAPI die Validierung und Dokumentation, usw., der Daten anhand von `response_model`. So können Sie korrekte Typannotationen zu Ihren Funktionen hinzufügen, selbst wenn Sie einen anderen Typ als das Responsemodell zurückgeben, die von Ihrem Editor und Tools wie mypy verwendet werden. Und dennoch übernimmt FastAPI die Validierung und Dokumentation, usw., der Daten anhand von `response_model`.
Sie können auch `response_model=None` verwenden, um das Erstellen eines Responsemodells für diese *Pfadoperation* zu unterbinden. Sie könnten das tun wollen, wenn Sie Dinge annotieren, die nicht gültige Pydantic-Felder sind. Ein Beispiel dazu werden Sie in einer der Abschnitte unten sehen. Sie können auch `response_model=None` verwenden, um das Erstellen eines Responsemodells für diese *Pfadoperation* zu unterbinden. Sie könnten das tun müssen, wenn Sie Typannotationen für Dinge hinzufügen, die keine gültigen Pydantic-Felder sind. Ein Beispiel dazu werden Sie in einem der Abschnitte unten sehen.
## Dieselben Eingabedaten zurückgeben { #return-the-same-input-data } ## Dieselben Eingabedaten zurückgeben { #return-the-same-input-data }
@@ -76,16 +76,16 @@ Im Folgenden deklarieren wir ein `UserIn`-Modell; es enthält ein Klartext-Passw
Um `EmailStr` zu verwenden, installieren Sie zuerst [`email-validator`](https://github.com/JoshData/python-email-validator). Um `EmailStr` zu verwenden, installieren Sie zuerst [`email-validator`](https://github.com/JoshData/python-email-validator).
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md) erstellen, sie aktivieren und es dann installieren, zum Beispiel: Fügen Sie es Ihrem Projekt hinzu:
```console ```console
$ pip install email-validator $ uv add email-validator
``` ```
oder mit: oder mit:
```console ```console
$ pip install "pydantic[email]" $ uv add "pydantic[email]"
``` ```
/// ///
@@ -98,11 +98,11 @@ Immer wenn jetzt ein Browser einen Benutzer mit Passwort erzeugt, gibt die API d
Hier ist das möglicherweise kein Problem, da es derselbe Benutzer ist, der das Passwort sendet. Hier ist das möglicherweise kein Problem, da es derselbe Benutzer ist, der das Passwort sendet.
Aber wenn wir dasselbe Modell für eine andere *Pfadoperation* verwenden, könnten wir das Passwort dieses Benutzers zu jedem Client schicken. Aber wenn wir dasselbe Modell für eine andere *Pfadoperation* verwenden, könnten wir die Passwörter unserer Benutzer an jeden Client senden.
/// danger | Gefahr /// danger | Gefahr
Speichern Sie niemals das Klartext-Passwort eines Benutzers, oder versenden Sie es in einer Response wie dieser, wenn Sie sich nicht der resultierenden Gefahren bewusst sind und nicht wissen, was Sie tun. Speichern Sie niemals das Klartext-Passwort eines Benutzers, oder versenden Sie es in einer Response wie dieser, es sei denn, Sie kennen alle Einschränkungen und wissen, was Sie tun.
/// ///
@@ -116,31 +116,31 @@ Obwohl unsere *Pfadoperation-Funktion* hier denselben `user` von der Eingabe zur
{* ../../docs_src/response_model/tutorial003_py310.py hl[24] *} {* ../../docs_src/response_model/tutorial003_py310.py hl[24] *}
... haben wir deklariert, dass `response_model` das Modell `UserOut` ist, welches das Passwort nicht enthält: ... haben wir deklariert, dass `response_model` unser Modell `UserOut` ist, welches das Passwort nicht enthält:
{* ../../docs_src/response_model/tutorial003_py310.py hl[22] *} {* ../../docs_src/response_model/tutorial003_py310.py hl[22] *}
Darum wird **FastAPI** sich darum kümmern, dass alle Daten, die nicht im Ausgabemodell deklariert sind, herausgefiltert werden (mittels Pydantic). Darum wird **FastAPI** sich darum kümmern, dass alle Daten, die nicht im Ausgabemodell deklariert sind, herausgefiltert werden (mittels Pydantic).
### `response_model` oder Rückgabewert { #response-model-or-return-type } ### `response_model` oder Rückgabetyp { #response-model-or-return-type }
Da unsere zwei Modelle in diesem Fall unterschiedlich sind, würde, wenn wir den Rückgabewert der Funktion als `UserOut` deklarieren, der Editor sich beschweren, dass wir einen ungültigen Typ zurückgeben, weil das unterschiedliche Klassen sind. Da unsere zwei Modelle in diesem Fall unterschiedlich sind, würde, wenn wir den Funktions-Rückgabetyp als `UserOut` deklarieren, der Editor sich beschweren, dass wir einen ungültigen Typ zurückgeben, weil das unterschiedliche Klassen sind.
Darum müssen wir es in diesem Fall im `response_model`-Parameter deklarieren. Darum müssen wir es in diesem Beispiel im `response_model`-Parameter deklarieren.
... aber lesen Sie weiter, um zu sehen, wie man das anders lösen kann. ... aber lesen Sie weiter, um zu sehen, wie man das anders lösen kann.
## Rückgabewert und Datenfilterung { #return-type-and-data-filtering } ## Rückgabetyp und Datenfilterung { #return-type-and-data-filtering }
Führen wir unser vorheriges Beispiel fort. Wir wollten **die Funktion mit einem Typ annotieren**, aber wir wollten in der Funktion tatsächlich etwas zurückgeben, das **mehr Daten** enthält. Führen wir unser vorheriges Beispiel fort. Wir wollten **die Funktion mit einem Typ annotieren**, aber wir wollten in der Funktion tatsächlich etwas zurückgeben, das **mehr Daten** enthält.
Wir möchten, dass FastAPI die Daten weiterhin mithilfe des Responsemodells **filtert**. Selbst wenn die Funktion mehr Daten zurückgibt, soll die Response nur die Felder enthalten, die im Responsemodell deklariert sind. Wir möchten, dass FastAPI die Daten weiterhin mithilfe des Responsemodells **filtert**. Selbst wenn die Funktion mehr Daten zurückgibt, soll die Response nur die Felder enthalten, die im Responsemodell deklariert sind.
Im vorherigen Beispiel mussten wir den `response_model`-Parameter verwenden, weil die Klassen unterschiedlich waren. Das bedeutet aber auch, wir bekommen keine Unterstützung vom Editor und anderen Tools, die den Funktions-Rückgabewert überprüfen. Im vorherigen Beispiel mussten wir den `response_model`-Parameter verwenden, weil die Klassen unterschiedlich waren. Das bedeutet aber auch, wir bekommen keine Unterstützung vom Editor und anderen Tools, die den Funktions-Rückgabetyp überprüfen.
Aber in den meisten Fällen, wenn wir so etwas machen, wollen wir nur, dass das Modell einige der Daten **filtert/entfernt**, so wie in diesem Beispiel. Aber in den meisten Fällen, wenn wir so etwas machen, wollen wir nur, dass das Modell einige der Daten **filtert/entfernt**, so wie in diesem Beispiel.
Und in solchen Fällen können wir Klassen und Vererbung verwenden, um Vorteil aus den Typannotationen in der Funktion zu ziehen, was vom Editor und von Tools besser unterstützt wird, während wir gleichzeitig FastAPIs **Datenfilterung** behalten. Und in solchen Fällen können wir Klassen und Vererbung verwenden, um Vorteil aus den **Typannotationen** in der Funktion zu ziehen, was vom Editor und von Tools besser unterstützt wird, während wir gleichzeitig FastAPIs **Datenfilterung** behalten.
{* ../../docs_src/response_model/tutorial003_01_py310.py hl[7:10,13:14,18] *} {* ../../docs_src/response_model/tutorial003_01_py310.py hl[7:10,13:14,18] *}
@@ -156,7 +156,7 @@ Sehen wir uns zunächst an, wie Editor, mypy und andere Tools dies sehen würden
Wir annotieren den Funktionsrückgabetyp als `BaseUser`, geben aber tatsächlich eine `UserIn`-Instanz zurück. Wir annotieren den Funktionsrückgabetyp als `BaseUser`, geben aber tatsächlich eine `UserIn`-Instanz zurück.
Für den Editor, mypy und andere Tools ist das kein Problem, da `UserIn` eine Unterklasse von `BaseUser` ist (Salopp: `UserIn` ist ein `BaseUser`). Es handelt sich um einen *gültigen* Typ, solange irgendetwas überreicht wird, das ein `BaseUser` ist. Der Editor, mypy und andere Tools werden sich darüber nicht beschweren, weil `UserIn` im Sinne des Typings eine Unterklasse von `BaseUser` ist. Das bedeutet, es ist ein *gültiger* Typ, wenn etwas erwartet wird, das ein `BaseUser` ist.
### FastAPI Datenfilterung { #fastapi-data-filtering } ### FastAPI Datenfilterung { #fastapi-data-filtering }
@@ -182,7 +182,7 @@ Es kann Fälle geben, bei denen Sie etwas zurückgeben, das kein gültiges Pydan
### Eine Response direkt zurückgeben { #return-a-response-directly } ### Eine Response direkt zurückgeben { #return-a-response-directly }
Der häufigste Anwendungsfall ist, wenn Sie [eine Response direkt zurückgeben, wie es später im Handbuch für fortgeschrittene Benutzer erläutert wird](../advanced/response-directly.md). Der häufigste Anwendungsfall ist, wenn Sie [eine Response direkt zurückgeben, wie es später in der Dokumentation für fortgeschrittene Benutzer erläutert wird](../advanced/response-directly.md).
{* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *} {* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *}
@@ -192,7 +192,7 @@ Und Tools werden auch glücklich sein, weil sowohl `RedirectResponse` als auch `
### Eine Unterklasse von Response annotieren { #annotate-a-response-subclass } ### Eine Unterklasse von Response annotieren { #annotate-a-response-subclass }
Sie können auch eine Unterklasse von `Response` in der Typannotation verwenden. Sie können auch eine Unterklasse von `Response` in der Typannotation verwenden:
{* ../../docs_src/response_model/tutorial003_03_py310.py hl[8:9] *} {* ../../docs_src/response_model/tutorial003_03_py310.py hl[8:9] *}
@@ -200,9 +200,9 @@ Das wird ebenfalls funktionieren, weil `RedirectResponse` eine Unterklasse von `
### Ungültige Rückgabetyp-Annotationen { #invalid-return-type-annotations } ### Ungültige Rückgabetyp-Annotationen { #invalid-return-type-annotations }
Aber wenn Sie ein beliebiges anderes Objekt zurückgeben, das kein gültiger Pydantic-Typ ist (z. B. ein Datenbank-Objekt), und Sie annotieren es so in der Funktion, wird FastAPI versuchen, ein Pydantic-Responsemodell von dieser Typannotation zu erstellen, und scheitern. Aber wenn Sie ein beliebiges anderes Objekt zurückgeben, das kein gültiger Pydantic-Typ ist (z. B. ein Datenbankobjekt), und Sie annotieren es so in der Funktion, wird FastAPI versuchen, ein Pydantic-Responsemodell von dieser Typannotation zu erstellen, und scheitern.
Das gleiche wird passieren, wenn Sie eine <dfn title="Eine Union mehrerer Typen bedeutet: „Irgendeiner dieser Typen“">Union</dfn> mehrerer Typen haben, und einer oder mehrere sind nicht gültige Pydantic-Typen. Zum Beispiel funktioniert folgendes nicht 💥: Das gleiche wird passieren, wenn Sie eine <dfn title="Eine Union zwischen mehreren Typen bedeutet: „irgendeiner dieser Typen“.">Union</dfn> mehrerer Typen haben, und einer oder mehrere sind nicht gültige Pydantic-Typen. Zum Beispiel funktioniert folgendes nicht 💥:
{* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *} {* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *}
@@ -230,7 +230,7 @@ Ihr Responsemodell könnte Defaultwerte haben, wie:
* `tax: float = 10.5` hat einen Defaultwert `10.5`. * `tax: float = 10.5` hat einen Defaultwert `10.5`.
* `tags: List[str] = []` hat eine leere Liste als Defaultwert: `[]`. * `tags: List[str] = []` hat eine leere Liste als Defaultwert: `[]`.
Aber Sie möchten diese vielleicht vom Resultat ausschließen, wenn Sie gar nicht gesetzt wurden. Aber Sie möchten diese vielleicht vom Resultat ausschließen, wenn sie tatsächlich nicht gespeichert wurden.
Wenn Sie zum Beispiel Modelle mit vielen optionalen Attributen in einer NoSQL-Datenbank haben, und Sie möchten nicht ellenlange JSON-Responses voller Defaultwerte senden. Wenn Sie zum Beispiel Modelle mit vielen optionalen Attributen in einer NoSQL-Datenbank haben, und Sie möchten nicht ellenlange JSON-Responses voller Defaultwerte senden.
@@ -242,7 +242,7 @@ Sie können den *Pfadoperation-Dekorator*-Parameter `response_model_exclude_unse
Die Defaultwerte werden dann nicht in der Response enthalten sein, sondern nur die tatsächlich gesetzten Werte. Die Defaultwerte werden dann nicht in der Response enthalten sein, sondern nur die tatsächlich gesetzten Werte.
Wenn Sie also den Artikel mit der ID `foo` bei der *Pfadoperation* anfragen, wird (ohne die Defaultwerte) die Response sein: Wenn Sie also einen Request an diese *Pfadoperation* für den Artikel mit der ID `foo` senden, wird (ohne die Defaultwerte) die Response sein:
```JSON ```JSON
{ {
@@ -258,13 +258,13 @@ Sie können auch:
* `response_model_exclude_defaults=True` * `response_model_exclude_defaults=True`
* `response_model_exclude_none=True` * `response_model_exclude_none=True`
verwenden, wie in der [Pydantic-Dokumentation](https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict) für `exclude_defaults` und `exclude_none` beschrieben. verwenden, wie in der [Pydantic-Dokumentation](https://pydantic.dev/docs/validation/latest/concepts/serialization/#excluding-and-including-fields-based-on-their-value) für `exclude_defaults` und `exclude_none` beschrieben.
/// ///
#### Daten mit Werten für Felder mit Defaultwerten { #data-with-values-for-fields-with-defaults } #### Daten mit Werten für Felder mit Defaultwerten { #data-with-values-for-fields-with-defaults }
Aber wenn Ihre Daten Werte für Modellfelder mit Defaultwerten haben, wie etwa der Artikel mit der ID `bar`: Aber wenn Ihre Daten Werte für die Felder des Modells mit Defaultwerten haben, wie etwa der Artikel mit der ID `bar`:
```Python hl_lines="3 5" ```Python hl_lines="3 5"
{ {
@@ -331,14 +331,14 @@ Die Syntax `{"name", "description"}` erzeugt ein `set` mit diesen zwei Werten.
/// ///
#### `list`en statt `set`s verwenden { #using-lists-instead-of-sets } #### `list`s statt `set`s verwenden { #using-lists-instead-of-sets }
Wenn Sie vergessen, ein `set` zu verwenden, und stattdessen eine `list`e oder ein `tuple` übergeben, wird FastAPI die dennoch in ein `set` konvertieren, und es wird korrekt funktionieren: Wenn Sie vergessen, ein `set` zu verwenden, und stattdessen eine `list` oder ein `tuple` übergeben, wird FastAPI die dennoch in ein `set` konvertieren, und es wird korrekt funktionieren:
{* ../../docs_src/response_model/tutorial006_py310.py hl[29,35] *} {* ../../docs_src/response_model/tutorial006_py310.py hl[29,35] *}
## Zusammenfassung { #recap } ## Zusammenfassung { #recap }
Verwenden Sie den Parameter `response_model` im *Pfadoperation-Dekorator*, um Responsemodelle zu definieren, und besonders, um private Daten herauszufiltern. Verwenden Sie den Parameter `response_model` im *Pfadoperation-Dekorator*, um Responsemodelle zu definieren, und besonders, um sicherzustellen, dass private Daten herausgefiltert werden.
Verwenden Sie `response_model_exclude_unset`, um nur explizit gesetzte Werte zurückzugeben. Verwenden Sie `response_model_exclude_unset`, um nur explizit gesetzte Werte zurückzugeben.
@@ -12,7 +12,7 @@ Sie können `examples` („Beispiele“) für ein Pydantic-Modell deklarieren, w
Diese zusätzlichen Informationen werden unverändert zum für dieses Modell ausgegebenen **JSON-Schema** hinzugefügt und in der API-Dokumentation verwendet. Diese zusätzlichen Informationen werden unverändert zum für dieses Modell ausgegebenen **JSON-Schema** hinzugefügt und in der API-Dokumentation verwendet.
Sie können das Attribut `model_config` verwenden, das ein <abbr title="Dictionary Zuordnungstabelle: In anderen Sprachen auch Hash, Map, Objekt, Assoziatives Array genannt">`dict`</abbr> akzeptiert, wie beschrieben in [Pydantic-Dokumentation: Configuration](https://docs.pydantic.dev/latest/api/config/). Sie können das Attribut `model_config` verwenden, das ein <abbr title="Dictionary Zuordnungstabelle: In anderen Sprachen auch Hash, Map, Objekt, Assoziatives Array genannt">`dict`</abbr> akzeptiert, wie beschrieben in [Pydantic-Dokumentation: Configuration](https://pydantic.dev/docs/validation/latest/api/pydantic/config/).
Sie können `"json_schema_extra"` setzen, mit einem `dict`, das alle zusätzlichen Daten enthält, die im generierten JSON-Schema angezeigt werden sollen, einschließlich `examples`. Sie können `"json_schema_extra"` setzen, mit einem `dict`, das alle zusätzlichen Daten enthält, die im generierten JSON-Schema angezeigt werden sollen, einschließlich `examples`.
@@ -1,6 +1,5 @@
# Sicherheit Erste Schritte { #security-first-steps } # Sicherheit Erste Schritte { #security-first-steps }
Stellen wir uns vor, dass Sie Ihre **Backend**-API auf einer Domain haben. Stellen wir uns vor, dass Sie Ihre **Backend**-API auf einer Domain haben.
Und Sie haben ein **Frontend** auf einer anderen Domain oder in einem anderen Pfad derselben Domain (oder in einer Mobile-Anwendung). Und Sie haben ein **Frontend** auf einer anderen Domain oder in einem anderen Pfad derselben Domain (oder in einer Mobile-Anwendung).
@@ -27,18 +26,16 @@ Kopieren Sie das Beispiel in eine Datei `main.py`:
/// note | Hinweis /// note | Hinweis
Das Paket [`python-multipart`](https://github.com/Kludex/python-multipart) wird automatisch mit **FastAPI** installiert, wenn Sie den Befehl `pip install "fastapi[standard]"` ausführen. Das Paket [`python-multipart`](https://github.com/Kludex/python-multipart) wird automatisch mit **FastAPI** installiert, wenn Sie den Befehl `uv add "fastapi[standard]"` ausführen.
Wenn Sie jedoch den Befehl `pip install fastapi` verwenden, ist das Paket `python-multipart` nicht standardmäßig enthalten. Wenn Sie jedoch den Befehl `uv add fastapi` verwenden, ist das Paket `python-multipart` nicht standardmäßig enthalten.
Um es manuell zu installieren, stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../../virtual-environments.md) erstellen, sie aktivieren und es dann mit: Um es manuell zu installieren, fügen Sie es Ihrem Projekt hinzu mit:
```console ```console
$ pip install python-multipart $ uv add python-multipart
``` ```
installieren.
Das liegt daran, dass **OAuth2** „Formulardaten“ zum Senden von `username` und `password` verwendet. Das liegt daran, dass **OAuth2** „Formulardaten“ zum Senden von `username` und `password` verwendet.
/// ///
@@ -48,7 +45,7 @@ Führen Sie das Beispiel aus mit:
<div class="termy"> <div class="termy">
```console ```console
$ fastapi dev $ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
+8 -8
View File
@@ -30,12 +30,12 @@ Wenn Sie mit JWT-Tokens spielen und sehen möchten, wie sie funktionieren, schau
Wir müssen `PyJWT` installieren, um die JWT-Tokens in Python zu generieren und zu verifizieren. Wir müssen `PyJWT` installieren, um die JWT-Tokens in Python zu generieren und zu verifizieren.
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../../virtual-environments.md) erstellen, sie aktivieren und dann `pyjwt` installieren: Fügen Sie `pyjwt` zu Ihrem Projekt hinzu:
<div class="termy"> <div class="termy">
```console ```console
$ pip install pyjwt $ uv add pyjwt
---> 100% ---> 100%
``` ```
@@ -44,7 +44,7 @@ $ pip install pyjwt
/// note | Hinweis /// note | Hinweis
Wenn Sie planen, digitale Signaturalgorithmen wie RSA oder ECDSA zu verwenden, sollten Sie die Kryptografie-Abhängigkeit `pyjwt[crypto]` installieren. Wenn Sie planen, digitale Signaturalgorithmen wie RSA oder ECDSA zu verwenden, sollten Sie die Kryptografie-Bibliotheksabhängigkeit `pyjwt[crypto]` installieren.
Weitere Informationen finden Sie in der [PyJWT-Installationsdokumentation](https://pyjwt.readthedocs.io/en/latest/installation.html). Weitere Informationen finden Sie in der [PyJWT-Installationsdokumentation](https://pyjwt.readthedocs.io/en/latest/installation.html).
@@ -72,12 +72,12 @@ Es unterstützt viele sichere Hashing-Algorithmen und Werkzeuge, um mit diesen z
Der empfohlene Algorithmus ist „Argon2“. Der empfohlene Algorithmus ist „Argon2“.
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../../virtual-environments.md) erstellen, sie aktivieren, und installieren Sie dann pwdlib mit Argon2: Fügen Sie `pwdlib` mit Argon2 zu Ihrem Projekt hinzu:
<div class="termy"> <div class="termy">
```console ```console
$ pip install "pwdlib[argon2]" $ uv add "pwdlib[argon2]"
---> 100% ---> 100%
``` ```
@@ -206,7 +206,7 @@ Die Benutzeroberfläche sieht wie folgt aus:
<img src="/img/tutorial/security/image07.png"> <img src="/img/tutorial/security/image07.png">
Melden Sie sich bei der Anwendung auf die gleiche Weise wie zuvor an. Autorisieren Sie die Anwendung auf die gleiche Weise wie zuvor.
Verwenden Sie die Anmeldeinformationen: Verwenden Sie die Anmeldeinformationen:
@@ -260,7 +260,7 @@ Mit dem, was Sie bis hier gesehen haben, können Sie eine sichere **FastAPI**-An
In fast jedem Framework wird die Handhabung der Sicherheit recht schnell zu einem ziemlich komplexen Thema. In fast jedem Framework wird die Handhabung der Sicherheit recht schnell zu einem ziemlich komplexen Thema.
Viele Packages, die es stark vereinfachen, müssen viele Kompromisse beim Datenmodell, der Datenbank und den verfügbaren Funktionen eingehen. Und einige dieser Pakete, die die Dinge zu sehr vereinfachen, weisen tatsächlich Sicherheitslücken auf. Viele Packages, die es stark vereinfachen, müssen viele Kompromisse beim Datenmodell, der Datenbank und den verfügbaren Funktionen eingehen. Und einige dieser Packages, die die Dinge zu sehr vereinfachen, weisen tatsächlich Sicherheitslücken auf.
--- ---
@@ -268,7 +268,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. 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 `pwdlib` 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 Packages 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. 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.
+5 -5
View File
@@ -8,7 +8,7 @@ Hier werden wir ein Beispiel mit [SQLModel](https://sqlmodel.tiangolo.com/) sehe
/// tip | Tipp /// tip | Tipp
Sie könnten jede andere SQL- oder NoSQL-Datenbankbibliothek verwenden, die Sie möchten (in einigen Fällen als <abbr title="Objektrelationaler Mapper: Ein Fachbegriff für eine Bibliothek, in der einige Klassen SQL-Tabellen und Instanzen Zeilen in diesen Tabellen darstellen">„ORMs“</abbr> bezeichnet), FastAPI zwingt Sie nicht, irgendetwas zu verwenden. 😎 Sie könnten jede andere SQL- oder NoSQL-Datenbankbibliothek verwenden, die Sie möchten (in einigen Fällen als <abbr title="Objektrelationaler Mapper: Ein Fachbegriff für eine Bibliothek, in der einige Klassen repräsentieren SQL-Tabellen und Instanzen repräsentieren Zeilen in diesen Tabellen">„ORMs“</abbr> bezeichnet), FastAPI zwingt Sie nicht, irgendetwas zu verwenden. 😎
/// ///
@@ -34,12 +34,12 @@ Dies ist ein sehr einfaches und kurzes Tutorial. Wenn Sie mehr über Datenbanken
## `SQLModel` installieren { #install-sqlmodel } ## `SQLModel` installieren { #install-sqlmodel }
Stellen Sie zunächst sicher, dass Sie Ihre [virtuelle Umgebung](../virtual-environments.md) erstellen, sie aktivieren und dann `sqlmodel` installieren: Fügen Sie `sqlmodel` Ihrem Projekt hinzu:
<div class="termy"> <div class="termy">
```console ```console
$ pip install sqlmodel $ uv add sqlmodel
---> 100% ---> 100%
``` ```
@@ -152,7 +152,7 @@ Sie können die App ausführen:
<div class="termy"> <div class="termy">
```console ```console
$ fastapi dev $ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
@@ -337,7 +337,7 @@ Sie können die App erneut ausführen:
<div class="termy"> <div class="termy">
```console ```console
$ fastapi dev $ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
+2 -2
View File
@@ -21,7 +21,7 @@ Wenn Sie ein Frontend hosten müssen, verwenden Sie stattdessen `app.frontend()`
Sie könnten auch `from starlette.staticfiles import StaticFiles` verwenden. Sie könnten auch `from starlette.staticfiles import StaticFiles` verwenden.
**FastAPI** stellt dasselbe `starlette.staticfiles` auch via `fastapi.staticfiles` bereit, als Annehmlichkeit für Sie, den Entwickler. Es kommt aber tatsächlich direkt von Starlette. **FastAPI** stellt dasselbe `starlette.staticfiles` auch als `fastapi.staticfiles` bereit, nur als Annehmlichkeit für Sie, den Entwickler. Es kommt aber tatsächlich direkt von Starlette.
/// ///
@@ -45,4 +45,4 @@ Alle diese Parameter können anders als „`static`“ lauten, passen Sie sie an
## Weitere Informationen { #more-info } ## Weitere Informationen { #more-info }
Weitere Details und Optionen finden Sie in [Starlettes Dokumentation zu statischen Dateien](https://www.starlette.dev/staticfiles/). Weitere Details und Optionen finden Sie in [Starlettes Dokumentation zu statischen Dateien](https://starlette.dev/staticfiles/).
+8 -8
View File
@@ -1,6 +1,6 @@
# Testen { #testing } # Testen { #testing }
Dank [Starlette](https://www.starlette.dev/testclient/) ist das Testen von **FastAPI**-Anwendungen einfach und macht Spaß. Dank [Starlette](https://starlette.dev/testclient/) ist das Testen von **FastAPI**-Anwendungen einfach und macht Spaß.
Es basiert auf [HTTPX](https://www.python-httpx.org), welches wiederum auf der Grundlage von Requests konzipiert wurde, es ist also sehr vertraut und intuitiv. Es basiert auf [HTTPX](https://www.python-httpx.org), welches wiederum auf der Grundlage von Requests konzipiert wurde, es ist also sehr vertraut und intuitiv.
@@ -12,10 +12,10 @@ Damit können Sie [pytest](https://docs.pytest.org/) direkt mit **FastAPI** verw
Um `TestClient` zu verwenden, installieren Sie zunächst [`httpx`](https://www.python-httpx.org). Um `TestClient` zu verwenden, installieren Sie zunächst [`httpx`](https://www.python-httpx.org).
Erstellen Sie eine [virtuelle Umgebung](../virtual-environments.md), aktivieren Sie sie und installieren Sie es dann, z. B.: Fügen Sie es zu Ihrem Projekt hinzu:
```console ```console
$ pip install httpx $ uv add httpx
``` ```
/// ///
@@ -52,7 +52,7 @@ Sie könnten auch `from starlette.testclient import TestClient` verwenden.
/// tip | Tipp /// tip | Tipp
Wenn Sie in Ihren Tests neben dem Senden von <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Requests</abbr> an Ihre FastAPI-Anwendung auch `async`-Funktionen aufrufen möchten (z. B. asynchrone Datenbankfunktionen), werfen Sie einen Blick auf die [Async-Tests](../advanced/async-tests.md) im Handbuch für fortgeschrittene Benutzer. Wenn Sie in Ihren Tests neben dem Senden von <abbr title="Request Anfrage: Daten, die der Client zum Server sendet">Requests</abbr> an Ihre FastAPI-Anwendung auch `async`-Funktionen aufrufen möchten (z. B. asynchrone Datenbankfunktionen), werfen Sie einen Blick auf die [Async-Tests](../advanced/async-tests.md) im Tutorial für fortgeschrittene Benutzer.
/// ///
@@ -153,16 +153,16 @@ Wenn Sie ein Pydantic-Modell in Ihrem Test haben und dessen Daten während des T
/// ///
## Tests ausführen { #run-it } ## Ausführen { #run-it }
Danach müssen Sie nur noch `pytest` installieren. Danach müssen Sie nur noch `pytest` installieren.
Erstellen Sie eine [virtuelle Umgebung](../virtual-environments.md), aktivieren Sie sie und installieren Sie es dann, z. B.: Fügen Sie es zu Ihrem Projekt hinzu:
<div class="termy"> <div class="termy">
```console ```console
$ pip install pytest $ uv add pytest
---> 100% ---> 100%
``` ```
@@ -176,7 +176,7 @@ Führen Sie die Tests aus, mit:
<div class="termy"> <div class="termy">
```console ```console
$ pytest $ uv run pytest
================ test session starts ================ ================ test session starts ================
platform linux -- Python 3.6.9, pytest-5.3.5, py-1.8.1, pluggy-0.13.1 platform linux -- Python 3.6.9, pytest-5.3.5, py-1.8.1, pluggy-0.13.1
+10 -839
View File
@@ -1,864 +1,35 @@
# Virtuelle Umgebungen { #virtual-environments } # Virtuelle Umgebungen { #virtual-environments }
Wenn Sie an Python-Projekten arbeiten, sollten Sie wahrscheinlich eine **virtuelle Umgebung** (oder einen ähnlichen Mechanismus) verwenden, um die <abbr title="Python Installationspakete">Packages</abbr>, die Sie für jedes Projekt installieren, zu isolieren. Wenn Sie mit Python-Projekten arbeiten, sollten Sie eine **virtuelle Umgebung** verwenden, um die für jedes Projekt installierten Packages zu isolieren.
/// note | Hinweis Für FastAPI-Projekte empfehle ich die Verwendung von [uv](https://docs.astral.sh/uv/), um das Projekt, seine Abhängigkeiten und seine virtuelle Umgebung zu verwalten.
Wenn Sie bereits über virtuelle Umgebungen Bescheid wissen, wie man sie erstellt und verwendet, möchten Sie diesen Abschnitt vielleicht überspringen. 🤓
///
/// tip | Tipp
Eine **virtuelle Umgebung** unterscheidet sich von einer **Umgebungsvariable**.
Eine **Umgebungsvariable** ist eine Variable im System, die von Programmen verwendet werden kann.
Eine **virtuelle Umgebung** ist ein Verzeichnis mit einigen Dateien darin.
///
/// note | Hinweis
Diese Seite wird Ihnen beibringen, wie Sie **virtuelle Umgebungen** verwenden und wie sie funktionieren.
Wenn Sie bereit sind, ein **Tool zu verwenden, das alles für Sie verwaltet** (einschließlich der Installation von Python), probieren Sie [uv](https://github.com/astral-sh/uv).
///
## Ein Projekt erstellen { #create-a-project } ## Ein Projekt erstellen { #create-a-project }
Erstellen Sie zuerst ein Verzeichnis für Ihr Projekt. Installieren Sie `uv` mithilfe der [offiziellen Installationsanleitung](https://docs.astral.sh/uv/getting-started/installation/) und erstellen Sie dann ein Projekt:
Was ich normalerweise mache, ist, dass ich ein Verzeichnis namens `code` in meinem Home/Benutzerverzeichnis erstelle.
Und darin erstelle ich ein Verzeichnis pro Projekt.
<div class="termy"> <div class="termy">
```console ```console
// Gehe zum Home-Verzeichnis $ uv init awesome-project --bare
$ cd
// Erstelle ein Verzeichnis für alle Ihre Code-Projekte
$ mkdir code
// Gehe in dieses Code-Verzeichnis
$ cd code
// Erstelle ein Verzeichnis für dieses Projekt
$ mkdir awesome-project
// Gehe in dieses Projektverzeichnis
$ cd awesome-project $ cd awesome-project
$ uv add "fastapi[standard]"
``` ```
</div> </div>
## Eine virtuelle Umgebung erstellen { #create-a-virtual-environment } `uv` erstellt automatisch eine virtuelle Umgebung für das Projekt. Sie müssen selbst keine erstellen oder aktivieren.
Wenn Sie zum **ersten Mal** an einem Python-Projekt arbeiten, erstellen Sie eine virtuelle Umgebung **<dfn title="es gibt andere Optionen, dies ist eine einfache Richtlinie">innerhalb Ihres Projekts</dfn>**. Führen Sie Befehle innerhalb der Projektumgebung mit `uv run` aus, zum Beispiel:
/// tip | Tipp
Sie müssen dies nur **einmal pro Projekt** tun, nicht jedes Mal, wenn Sie daran arbeiten.
///
//// tab | `venv`
Um eine virtuelle Umgebung zu erstellen, können Sie das `venv`-Modul verwenden, das mit Python geliefert wird.
<div class="termy"> <div class="termy">
```console ```console
$ python -m venv .venv $ uv run fastapi dev
``` ```
</div> </div>
/// details | Was dieser Befehl bedeutet ## Mehr erfahren { #learn-more }
* `python`: das Programm namens `python` verwenden Lesen Sie den [Leitfaden zu virtuellen Umgebungen](https://tiangolo.com/guides/virtual-environments/), um zu erfahren, wie virtuelle Umgebungen unter der Haube funktionieren, einschließlich Aktivierung und dem alternativen `python -m venv`- und `pip`-Workflow.
* `-m`: ein Modul als Skript aufrufen, wir geben als nächstes an, welches Modul
* `venv`: das Modul namens `venv` verwenden, das normalerweise mit Python installiert wird
* `.venv`: die virtuelle Umgebung im neuen Verzeichnis `.venv` erstellen
///
////
//// tab | `uv`
Wenn Sie [`uv`](https://github.com/astral-sh/uv) installiert haben, können Sie es verwenden, um eine virtuelle Umgebung zu erstellen.
<div class="termy">
```console
$ uv venv
```
</div>
/// tip | Tipp
Standardmäßig erstellt `uv` eine virtuelle Umgebung in einem Verzeichnis namens `.venv`.
Aber Sie könnten es anpassen, indem Sie ein zusätzliches Argument mit dem Verzeichnisnamen übergeben.
///
////
Dieser Befehl erstellt eine neue virtuelle Umgebung in einem Verzeichnis namens `.venv`.
/// details | `.venv` oder ein anderer Name
Sie könnten die virtuelle Umgebung in einem anderen Verzeichnis erstellen, aber es ist eine Konvention, sie `.venv` zu nennen.
///
## Die virtuelle Umgebung aktivieren { #activate-the-virtual-environment }
Aktivieren Sie die neue virtuelle Umgebung, damit jeder Python-Befehl, den Sie ausführen oder jedes Paket, das Sie installieren, diese Umgebung verwendet.
/// tip | Tipp
Tun Sie dies **jedes Mal**, wenn Sie eine **neue Terminalsitzung** starten, um an dem Projekt zu arbeiten.
///
//// tab | Linux, macOS
<div class="termy">
```console
$ source .venv/bin/activate
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ .venv\Scripts\Activate.ps1
```
</div>
////
//// tab | Windows Bash
Oder wenn Sie Bash für Windows verwenden (z. B. [Git Bash](https://gitforwindows.org/)):
<div class="termy">
```console
$ source .venv/Scripts/activate
```
</div>
////
/// tip | Tipp
Jedes Mal, wenn Sie ein **neues Paket** in dieser Umgebung installieren, aktivieren Sie die Umgebung erneut.
So stellen Sie sicher, dass, wenn Sie ein **Terminalprogramm (<abbr title="command line interface - Kommandozeileninterface">CLI</abbr>)** verwenden, das durch dieses Paket installiert wurde, Sie das aus Ihrer virtuellen Umgebung verwenden und nicht eines, das global installiert ist, wahrscheinlich mit einer anderen Version als der, die Sie benötigen.
///
## Testen, ob die virtuelle Umgebung aktiv ist { #check-the-virtual-environment-is-active }
Testen Sie, dass die virtuelle Umgebung aktiv ist (der vorherige Befehl funktioniert hat).
/// tip | Tipp
Dies ist **optional**, aber es ist eine gute Möglichkeit, **zu überprüfen**, ob alles wie erwartet funktioniert und Sie die beabsichtigte virtuelle Umgebung verwenden.
///
//// tab | Linux, macOS, Windows Bash
<div class="termy">
```console
$ which python
/home/user/code/awesome-project/.venv/bin/python
```
</div>
Wenn es das `python`-Binary in `.venv/bin/python` anzeigt, innerhalb Ihres Projekts (in diesem Fall `awesome-project`), dann hat es funktioniert. 🎉
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ Get-Command python
C:\Users\user\code\awesome-project\.venv\Scripts\python
```
</div>
Wenn es das `python`-Binary in `.venv\Scripts\python` anzeigt, innerhalb Ihres Projekts (in diesem Fall `awesome-project`), dann hat es funktioniert. 🎉
////
## `pip` aktualisieren { #upgrade-pip }
/// tip | Tipp
Wenn Sie [`uv`](https://github.com/astral-sh/uv) verwenden, würden Sie das verwenden, um Dinge zu installieren anstelle von `pip`, sodass Sie `pip` nicht aktualisieren müssen. 😎
///
Wenn Sie `pip` verwenden, um Pakete zu installieren (es wird standardmäßig mit Python geliefert), sollten Sie es auf die neueste Version **aktualisieren**.
Viele exotische Fehler beim Installieren eines Pakets werden einfach dadurch gelöst, dass zuerst `pip` aktualisiert wird.
/// tip | Tipp
Normalerweise würden Sie dies **einmal** tun, unmittelbar nachdem Sie die virtuelle Umgebung erstellt haben.
///
Stellen Sie sicher, dass die virtuelle Umgebung aktiv ist (mit dem obigen Befehl) und führen Sie dann aus:
<div class="termy">
```console
$ python -m pip install --upgrade pip
---> 100%
```
</div>
/// tip | Tipp
Manchmal kann beim Versuch, `pip` zu aktualisieren, der Fehler **`No module named pip`** auftreten.
Wenn das passiert, installieren und aktualisieren Sie `pip` mit dem folgenden Befehl:
<div class="termy">
```console
$ python -m ensurepip --upgrade
---> 100%
```
</div>
Dieser Befehl installiert `pip`, falls es noch nicht installiert ist, und stellt außerdem sicher, dass die installierte Version von `pip` mindestens so aktuell ist wie die in `ensurepip` verfügbare.
///
## `.gitignore` hinzufügen { #add-gitignore }
Wenn Sie **Git** verwenden (was Sie sollten), fügen Sie eine `.gitignore`-Datei hinzu, um alles in Ihrem `.venv` von Git auszuschließen.
/// tip | Tipp
Wenn Sie [`uv`](https://github.com/astral-sh/uv) verwendet haben, um die virtuelle Umgebung zu erstellen, hat es dies bereits für Sie getan, Sie können diesen Schritt überspringen. 😎
///
/// tip | Tipp
Tun Sie dies **einmal**, unmittelbar nachdem Sie die virtuelle Umgebung erstellt haben.
///
<div class="termy">
```console
$ echo "*" > .venv/.gitignore
```
</div>
/// details | Was dieser Befehl bedeutet
* `echo "*"`: wird den Text `*` im Terminal „drucken“ (der nächste Teil ändert das ein wenig)
* `>`: alles, was durch den Befehl links von `>` im Terminal ausgegeben wird, sollte nicht gedruckt, sondern stattdessen in die Datei geschrieben werden, die rechts von `>` kommt
* `.gitignore`: der Name der Datei, in die der Text geschrieben werden soll
Und `*` bedeutet für Git „alles“. Also wird alles im `.venv`-Verzeichnis ignoriert.
Dieser Befehl erstellt eine Datei `.gitignore` mit dem Inhalt:
```gitignore
*
```
///
## Pakete installieren { #install-packages }
Nachdem Sie die Umgebung aktiviert haben, können Sie Pakete darin installieren.
/// tip | Tipp
Tun Sie dies **einmal**, wenn Sie die Pakete installieren oder aktualisieren, die Ihr Projekt benötigt.
Wenn Sie eine Version aktualisieren oder ein neues Paket hinzufügen müssen, würden Sie **dies erneut tun**.
///
### Pakete direkt installieren { #install-packages-directly }
Wenn Sie es eilig haben und keine Datei verwenden möchten, um die Paketanforderungen Ihres Projekts zu deklarieren, können Sie sie direkt installieren.
/// tip | Tipp
Es ist eine (sehr) gute Idee, die Pakete und Versionen, die Ihr Programm benötigt, in einer Datei zu speichern (zum Beispiel `requirements.txt` oder `pyproject.toml`).
///
//// tab | `pip`
<div class="termy">
```console
$ pip install "fastapi[standard]"
---> 100%
```
</div>
////
//// tab | `uv`
Wenn Sie [`uv`](https://github.com/astral-sh/uv) haben:
<div class="termy">
```console
$ uv pip install "fastapi[standard]"
---> 100%
```
</div>
////
### Installation von `requirements.txt` { #install-from-requirements-txt }
Wenn Sie eine `requirements.txt` haben, können Sie diese nun verwenden, um deren Pakete zu installieren.
//// tab | `pip`
<div class="termy">
```console
$ pip install -r requirements.txt
---> 100%
```
</div>
////
//// tab | `uv`
Wenn Sie [`uv`](https://github.com/astral-sh/uv) haben:
<div class="termy">
```console
$ uv pip install -r requirements.txt
---> 100%
```
</div>
////
/// details | `requirements.txt`
Eine `requirements.txt` mit einigen Paketen könnte folgendermaßen aussehen:
```requirements.txt
fastapi[standard]==0.113.0
pydantic==2.8.0
```
///
## Ihr Programm ausführen { #run-your-program }
Nachdem Sie die virtuelle Umgebung aktiviert haben, können Sie Ihr Programm ausführen, und es wird das Python innerhalb Ihrer virtuellen Umgebung mit den Paketen verwenden, die Sie dort installiert haben.
<div class="termy">
```console
$ python main.py
Hello World
```
</div>
## Ihren Editor konfigurieren { #configure-your-editor }
Sie würden wahrscheinlich einen Editor verwenden, stellen Sie sicher, dass Sie ihn so konfigurieren, dass er dieselbe virtuelle Umgebung verwendet, die Sie erstellt haben (er wird sie wahrscheinlich automatisch erkennen), sodass Sie Autovervollständigungen und Inline-Fehler erhalten können.
Zum Beispiel:
* [VS Code](https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment)
* [PyCharm](https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html)
/// tip | Tipp
Normalerweise müssen Sie dies nur **einmal** tun, wenn Sie die virtuelle Umgebung erstellen.
///
## Die virtuelle Umgebung deaktivieren { #deactivate-the-virtual-environment }
Sobald Sie mit der Arbeit an Ihrem Projekt fertig sind, können Sie die virtuelle Umgebung **deaktivieren**.
<div class="termy">
```console
$ deactivate
```
</div>
Auf diese Weise, wenn Sie `python` ausführen, wird nicht versucht, es aus dieser virtuellen Umgebung mit den dort installierten Paketen auszuführen.
## Bereit zu arbeiten { #ready-to-work }
Jetzt sind Sie bereit, mit Ihrem Projekt zu arbeiten.
/// tip | Tipp
Möchten Sie verstehen, was das alles oben bedeutet?
Lesen Sie weiter. 👇🤓
///
## Warum virtuelle Umgebungen { #why-virtual-environments }
Um mit FastAPI zu arbeiten, müssen Sie [Python](https://www.python.org/) installieren.
Danach müssen Sie FastAPI und alle anderen **Pakete**, die Sie verwenden möchten, **installieren**.
Um Pakete zu installieren, würden Sie normalerweise den `pip`-Befehl verwenden, der mit Python geliefert wird (oder ähnliche Alternativen).
Wenn Sie jedoch `pip` direkt verwenden, werden die Pakete in Ihrer **globalen Python-Umgebung** (der globalen Installation von Python) installiert.
### Das Problem { #the-problem }
Was ist also das Problem beim Installieren von Paketen in der globalen Python-Umgebung?
Irgendwann werden Sie wahrscheinlich viele verschiedene Programme schreiben, die von **verschiedenen Paketen** abhängen. Und einige dieser Projekte, an denen Sie arbeiten, werden von **verschiedenen Versionen** desselben Pakets abhängen. 😱
Zum Beispiel könnten Sie ein Projekt namens `philosophers-stone` erstellen, dieses Programm hängt von einem anderen Paket namens **`harry`, Version `1`** ab. Also müssen Sie `harry` installieren.
```mermaid
flowchart LR
stone(philosophers-stone) -->|benötigt| harry-1[harry v1]
```
Dann erstellen Sie zu einem späteren Zeitpunkt ein weiteres Projekt namens `prisoner-of-azkaban`, und dieses Projekt hängt ebenfalls von `harry` ab, aber dieses Projekt benötigt **`harry` Version `3`**.
```mermaid
flowchart LR
azkaban(prisoner-of-azkaban) --> |benötigt| harry-3[harry v3]
```
Aber jetzt ist das Problem, wenn Sie die Pakete global (in der globalen Umgebung) installieren anstatt in einer lokalen **virtuellen Umgebung**, müssen Sie wählen, welche Version von `harry` zu installieren ist.
Wenn Sie `philosophers-stone` ausführen möchten, müssen Sie zuerst `harry` Version `1` installieren, zum Beispiel mit:
<div class="termy">
```console
$ pip install "harry==1"
```
</div>
Und dann hätten Sie `harry` Version `1` in Ihrer globalen Python-Umgebung installiert.
```mermaid
flowchart LR
subgraph global[globale Umgebung]
harry-1[harry v1]
end
subgraph stone-project[philosophers-stone-Projekt]
stone(philosophers-stone) -->|benötigt| harry-1
end
```
Aber dann, wenn Sie `prisoner-of-azkaban` ausführen möchten, müssen Sie `harry` Version `1` deinstallieren und `harry` Version `3` installieren (oder einfach die Version `3` installieren, was die Version `1` automatisch deinstallieren würde).
<div class="termy">
```console
$ pip install "harry==3"
```
</div>
Und dann hätten Sie `harry` Version `3` in Ihrer globalen Python-Umgebung installiert.
Und wenn Sie versuchen, `philosophers-stone` erneut auszuführen, besteht die Möglichkeit, dass es **nicht funktioniert**, weil es `harry` Version `1` benötigt.
```mermaid
flowchart LR
subgraph global[globale Umgebung]
harry-1[<strike>harry v1</strike>]
style harry-1 fill:#ccc,stroke-dasharray: 5 5
harry-3[harry v3]
end
subgraph stone-project[philosophers-stone-Projekt]
stone(philosophers-stone) -.-x|⛔️| harry-1
end
subgraph azkaban-project[prisoner-of-azkaban-Projekt]
azkaban(prisoner-of-azkaban) --> |benötigt| harry-3
end
```
/// tip | Tipp
Es ist sehr üblich in Python-Paketen, alles zu versuchen, **Breaking Changes** in **neuen Versionen** zu vermeiden, aber es ist besser, auf Nummer sicher zu gehen und neue Versionen absichtlich zu installieren und wenn Sie die Tests ausführen können, sicherzustellen, dass alles korrekt funktioniert.
///
Stellen Sie sich das jetzt mit **vielen** anderen **Paketen** vor, von denen alle Ihre **Projekte abhängen**. Das ist sehr schwierig zu verwalten. Und Sie würden wahrscheinlich einige Projekte mit einigen **inkompatiblen Versionen** der Pakete ausführen und nicht wissen, warum etwas nicht funktioniert.
Darüber hinaus könnte es je nach Ihrem Betriebssystem (z. B. Linux, Windows, macOS) bereits mit installiertem Python geliefert worden sein. Und in diesem Fall hatte es wahrscheinlich einige Pakete mit bestimmten Versionen **installiert**, die von Ihrem System benötigt werden. Wenn Sie Pakete in der globalen Python-Umgebung installieren, könnten Sie einige der Programme, die mit Ihrem Betriebssystem geliefert wurden, **kaputtmachen**.
## Wo werden Pakete installiert { #where-are-packages-installed }
Wenn Sie Python installieren, werden einige Verzeichnisse mit einigen Dateien auf Ihrem Rechner erstellt.
Einige dieser Verzeichnisse sind dafür zuständig, alle Pakete, die Sie installieren, aufzunehmen.
Wenn Sie ausführen:
<div class="termy">
```console
// Führen Sie dies jetzt nicht aus, es ist nur ein Beispiel 🤓
$ pip install "fastapi[standard]"
---> 100%
```
</div>
Das lädt eine komprimierte Datei mit dem FastAPI-Code herunter, normalerweise von [PyPI](https://pypi.org/project/fastapi/).
Es wird auch Dateien für andere Pakete **herunterladen**, von denen FastAPI abhängt.
Dann wird es all diese Dateien **extrahieren** und sie in ein Verzeichnis auf Ihrem Rechner legen.
Standardmäßig werden diese heruntergeladenen und extrahierten Dateien in das Verzeichnis gelegt, das mit Ihrer Python-Installation kommt, das ist die **globale Umgebung**.
## Was sind virtuelle Umgebungen { #what-are-virtual-environments }
Die Lösung für die Probleme, alle Pakete in der globalen Umgebung zu haben, besteht darin, eine **virtuelle Umgebung für jedes Projekt** zu verwenden, an dem Sie arbeiten.
Eine virtuelle Umgebung ist ein **Verzeichnis**, sehr ähnlich zu dem globalen, in dem Sie die Pakete für ein Projekt installieren können.
Auf diese Weise hat jedes Projekt seine eigene virtuelle Umgebung (`.venv`-Verzeichnis) mit seinen eigenen Paketen.
```mermaid
flowchart TB
subgraph stone-project[philosophers-stone-Projekt]
stone(philosophers-stone) --->|benötigt| harry-1
subgraph venv1[.venv]
harry-1[harry v1]
end
end
subgraph azkaban-project[prisoner-of-azkaban-Projekt]
azkaban(prisoner-of-azkaban) --->|benötigt| harry-3
subgraph venv2[.venv]
harry-3[harry v3]
end
end
stone-project ~~~ azkaban-project
```
## Was bedeutet das Aktivieren einer virtuellen Umgebung { #what-does-activating-a-virtual-environment-mean }
Wenn Sie eine virtuelle Umgebung aktivieren, zum Beispiel mit:
//// tab | Linux, macOS
<div class="termy">
```console
$ source .venv/bin/activate
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ .venv\Scripts\Activate.ps1
```
</div>
////
//// tab | Windows Bash
Oder wenn Sie Bash für Windows verwenden (z. B. [Git Bash](https://gitforwindows.org/)):
<div class="termy">
```console
$ source .venv/Scripts/activate
```
</div>
////
Dieser Befehl erstellt oder ändert einige [Umgebungsvariablen](environment-variables.md), die für die nächsten Befehle verfügbar sein werden.
Eine dieser Variablen ist die `PATH`-Variable.
/// tip | Tipp
Sie können mehr über die `PATH`-Umgebungsvariable im Abschnitt [Umgebungsvariablen](environment-variables.md#path-environment-variable) erfahren.
///
Das Aktivieren einer virtuellen Umgebung fügt deren Pfad `.venv/bin` (auf Linux und macOS) oder `.venv\Scripts` (auf Windows) zur `PATH`-Umgebungsvariable hinzu.
Angenommen, die `PATH`-Variable sah vor dem Aktivieren der Umgebung so aus:
//// tab | Linux, macOS
```plaintext
/usr/bin:/bin:/usr/sbin:/sbin
```
Das bedeutet, dass das System nach Programmen sucht in:
* `/usr/bin`
* `/bin`
* `/usr/sbin`
* `/sbin`
////
//// tab | Windows
```plaintext
C:\Windows\System32
```
Das bedeutet, dass das System nach Programmen sucht in:
* `C:\Windows\System32`
////
Nach dem Aktivieren der virtuellen Umgebung würde die `PATH`-Variable folgendermaßen aussehen:
//// tab | Linux, macOS
```plaintext
/home/user/code/awesome-project/.venv/bin:/usr/bin:/bin:/usr/sbin:/sbin
```
Das bedeutet, dass das System nun zuerst nach Programmen sucht in:
```plaintext
/home/user/code/awesome-project/.venv/bin
```
bevor es in den anderen Verzeichnissen sucht.
Wenn Sie also `python` im Terminal eingeben, wird das System das Python-Programm in
```plaintext
/home/user/code/awesome-project/.venv/bin/python
```
finden und dieses verwenden.
////
//// tab | Windows
```plaintext
C:\Users\user\code\awesome-project\.venv\Scripts;C:\Windows\System32
```
Das bedeutet, dass das System nun zuerst nach Programmen sucht in:
```plaintext
C:\Users\user\code\awesome-project\.venv\Scripts
```
bevor es in den anderen Verzeichnissen sucht.
Wenn Sie also `python` im Terminal eingeben, wird das System das Python-Programm in
```plaintext
C:\Users\user\code\awesome-project\.venv\Scripts\python
```
finden und dieses verwenden.
////
Ein wichtiger Punkt ist, dass es den Pfad der virtuellen Umgebung am **Anfang** der `PATH`-Variable platziert. Das System wird es **vor** allen anderen verfügbaren Pythons finden. Auf diese Weise, wenn Sie `python` ausführen, wird das Python **aus der virtuellen Umgebung** verwendet anstelle eines anderen `python` (zum Beispiel, einem `python` aus einer globalen Umgebung).
Das Aktivieren einer virtuellen Umgebung ändert auch ein paar andere Dinge, aber dies ist eines der wichtigsten Dinge, die es tut.
## Testen einer virtuellen Umgebung { #checking-a-virtual-environment }
Wenn Sie testen, ob eine virtuelle Umgebung aktiv ist, zum Beispiel mit:
//// tab | Linux, macOS, Windows Bash
<div class="termy">
```console
$ which python
/home/user/code/awesome-project/.venv/bin/python
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ Get-Command python
C:\Users\user\code\awesome-project\.venv\Scripts\python
```
</div>
////
bedeutet das, dass das `python`-Programm, das verwendet wird, das in der **virtuellen Umgebung** ist.
Sie verwenden `which` auf Linux und macOS und `Get-Command` in Windows PowerShell.
So funktioniert dieser Befehl: Er wird in der `PATH`-Umgebungsvariable nachsehen und **jeden Pfad in der Reihenfolge durchgehen**, um das Programm namens `python` zu finden. Sobald er es findet, wird er Ihnen **den Pfad** zu diesem Programm anzeigen.
Der wichtigste Punkt ist, dass, wenn Sie `python` aufrufen, genau dieses „`python`“ ausgeführt wird.
So können Sie überprüfen, ob Sie sich in der richtigen virtuellen Umgebung befinden.
/// tip | Tipp
Es ist einfach, eine virtuelle Umgebung zu aktivieren, ein Python zu bekommen und dann **zu einem anderen Projekt zu wechseln**.
Und das zweite Projekt **würde nicht funktionieren**, weil Sie das **falsche Python** verwenden, aus einer virtuellen Umgebung für ein anderes Projekt.
Es ist nützlich, überprüfen zu können, welches `python` verwendet wird. 🤓
///
## Warum eine virtuelle Umgebung deaktivieren { #why-deactivate-a-virtual-environment }
Zum Beispiel könnten Sie an einem Projekt `philosophers-stone` arbeiten, diese virtuelle Umgebung **aktivieren**, Pakete installieren und mit dieser Umgebung arbeiten.
Und dann möchten Sie an **einem anderen Projekt** `prisoner-of-azkaban` arbeiten.
Sie gehen zu diesem Projekt:
<div class="termy">
```console
$ cd ~/code/prisoner-of-azkaban
```
</div>
Wenn Sie die virtuelle Umgebung für `philosophers-stone` nicht deaktivieren, wird beim Ausführen von `python` im Terminal versucht, das Python von `philosophers-stone` zu verwenden.
<div class="termy">
```console
$ cd ~/code/prisoner-of-azkaban
$ python main.py
// Fehler beim Importieren von sirius, es ist nicht installiert 😱
Traceback (most recent call last):
File "main.py", line 1, in <module>
import sirius
```
</div>
Wenn Sie jedoch die virtuelle Umgebung deaktivieren und die neue für `prisoner-of-azkaban` aktivieren, wird beim Ausführen von `python` das Python aus der virtuellen Umgebung in `prisoner-of-azkaban` verwendet.
<div class="termy">
```console
$ cd ~/code/prisoner-of-azkaban
// Sie müssen nicht im alten Verzeichnis sein, um zu deaktivieren, Sie können dies überall tun, sogar nachdem Sie zum anderen Projekt gewechselt haben 😎
$ deactivate
// Die virtuelle Umgebung in prisoner-of-azkaban/.venv 🚀 aktivieren
$ source .venv/bin/activate
// Jetzt, wenn Sie python ausführen, wird das Paket sirius in dieser virtuellen Umgebung gefunden ✨
$ python main.py
I solemnly swear 🐺
```
</div>
## Alternativen { #alternatives }
Dies ist ein einfacher Leitfaden, um Ihnen den Einstieg zu erleichtern und Ihnen beizubringen, wie alles **unter der Haube** funktioniert.
Es gibt viele **Alternativen** zur Verwaltung von virtuellen Umgebungen, Paketabhängigkeiten (Anforderungen), Projekten.
Sobald Sie bereit sind und ein Tool verwenden möchten, das **das gesamte Projekt verwaltet**, Paketabhängigkeiten, virtuelle Umgebungen usw., würde ich Ihnen vorschlagen, [uv](https://github.com/astral-sh/uv) auszuprobieren.
`uv` kann viele Dinge tun, es kann:
* **Python für Sie installieren**, einschließlich verschiedener Versionen
* Die **virtuelle Umgebung** für Ihre Projekte verwalten
* **Pakete installieren**
* Paket**abhängigkeiten und Versionen** für Ihr Projekt verwalten
* Sicherstellen, dass Sie eine **exakte** Menge an Paketen und Versionen zur Installation haben, einschließlich ihrer Abhängigkeiten, damit Sie sicher sein können, dass Sie Ihr Projekt in der Produktionsumgebung genauso ausführen können wie auf Ihrem Rechner während der Entwicklung, dies wird **Locking** genannt
* Und viele andere Dinge
## Fazit { #conclusion }
Wenn Sie das alles gelesen und verstanden haben, wissen Sie jetzt **viel mehr** über virtuelle Umgebungen als viele Entwickler da draußen. 🤓
Das Wissen über diese Details wird in Zukunft wahrscheinlich nützlich sein, wenn Sie etwas debuggen, das komplex erscheint, aber Sie werden wissen, **wie alles unter der Haube funktioniert**. 😎
+119 -149
View File
@@ -11,9 +11,6 @@ sponsors:
- login: coderabbitai - login: coderabbitai
avatarUrl: https://avatars.githubusercontent.com/u/132028505?v=4 avatarUrl: https://avatars.githubusercontent.com/u/132028505?v=4
url: https://github.com/coderabbitai url: https://github.com/coderabbitai
- login: zuplo
avatarUrl: https://avatars.githubusercontent.com/u/85497839?v=4
url: https://github.com/zuplo
- login: blockbee-io - login: blockbee-io
avatarUrl: https://avatars.githubusercontent.com/u/115143449?u=1b8620c2d6567c4df2111a371b85a51f448f9b85&v=4 avatarUrl: https://avatars.githubusercontent.com/u/115143449?u=1b8620c2d6567c4df2111a371b85a51f448f9b85&v=4
url: https://github.com/blockbee-io url: https://github.com/blockbee-io
@@ -23,12 +20,12 @@ sponsors:
- login: railwayapp - login: railwayapp
avatarUrl: https://avatars.githubusercontent.com/u/66716858?v=4 avatarUrl: https://avatars.githubusercontent.com/u/66716858?v=4
url: https://github.com/railwayapp url: https://github.com/railwayapp
- - login: speakeasy-api - - login: dribia
avatarUrl: https://avatars.githubusercontent.com/u/91446104?v=4 avatarUrl: https://avatars.githubusercontent.com/u/41189616?v=4
url: https://github.com/speakeasy-api url: https://github.com/dribia
- login: stainless-api - login: BairesDev-LLC
avatarUrl: https://avatars.githubusercontent.com/u/88061651?v=4 avatarUrl: https://avatars.githubusercontent.com/u/133211198?u=c1462ade28fe251414bfedc28ce3f10242d44843&v=4
url: https://github.com/stainless-api url: https://github.com/BairesDev-LLC
- login: svix - login: svix
avatarUrl: https://avatars.githubusercontent.com/u/80175132?v=4 avatarUrl: https://avatars.githubusercontent.com/u/80175132?v=4
url: https://github.com/svix url: https://github.com/svix
@@ -38,19 +35,22 @@ sponsors:
- login: databento - login: databento
avatarUrl: https://avatars.githubusercontent.com/u/64141749?v=4 avatarUrl: https://avatars.githubusercontent.com/u/64141749?v=4
url: https://github.com/databento url: https://github.com/databento
- login: tutorcruncher
avatarUrl: https://avatars.githubusercontent.com/u/3341959?v=4
url: https://github.com/tutorcruncher
- - login: LambdaTest-Inc - - login: LambdaTest-Inc
avatarUrl: https://avatars.githubusercontent.com/u/171592363?u=96606606a45fa170427206199014f2a5a2a4920b&v=4 avatarUrl: https://avatars.githubusercontent.com/u/171592363?u=080d9ba6069d0ff2a0558825ff2f667c45807687&v=4
url: https://github.com/LambdaTest-Inc url: https://github.com/LambdaTest-Inc
- login: Ponte-Energy-Partners
avatarUrl: https://avatars.githubusercontent.com/u/114745848?v=4
url: https://github.com/Ponte-Energy-Partners
- login: BoostryJP - login: BoostryJP
avatarUrl: https://avatars.githubusercontent.com/u/57932412?v=4 avatarUrl: https://avatars.githubusercontent.com/u/57932412?v=4
url: https://github.com/BoostryJP url: https://github.com/BoostryJP
- login: acsone - login: acsone
avatarUrl: https://avatars.githubusercontent.com/u/7601056?v=4 avatarUrl: https://avatars.githubusercontent.com/u/7601056?v=4
url: https://github.com/acsone url: https://github.com/acsone
- - login: scalar - - login: manulife-ai
avatarUrl: https://avatars.githubusercontent.com/u/195145621?v=4
url: https://github.com/manulife-ai
- login: scalar
avatarUrl: https://avatars.githubusercontent.com/u/301879?v=4 avatarUrl: https://avatars.githubusercontent.com/u/301879?v=4
url: https://github.com/scalar url: https://github.com/scalar
- login: Trivie - login: Trivie
@@ -62,9 +62,6 @@ sponsors:
- login: Doist - login: Doist
avatarUrl: https://avatars.githubusercontent.com/u/2565372?v=4 avatarUrl: https://avatars.githubusercontent.com/u/2565372?v=4
url: https://github.com/Doist url: https://github.com/Doist
- - login: mainframeindustries
avatarUrl: https://avatars.githubusercontent.com/u/55092103?v=4
url: https://github.com/mainframeindustries
- - login: alixlahuec - - login: alixlahuec
avatarUrl: https://avatars.githubusercontent.com/u/29543316?u=44357eb2a93bccf30fb9d389b8befe94a3d00985&v=4 avatarUrl: https://avatars.githubusercontent.com/u/29543316?u=44357eb2a93bccf30fb9d389b8befe94a3d00985&v=4
url: https://github.com/alixlahuec url: https://github.com/alixlahuec
@@ -77,45 +74,45 @@ sponsors:
- login: ChargeStorm - login: ChargeStorm
avatarUrl: https://avatars.githubusercontent.com/u/26000165?v=4 avatarUrl: https://avatars.githubusercontent.com/u/26000165?v=4
url: https://github.com/ChargeStorm url: https://github.com/ChargeStorm
- login: ibrahimpelumi6142 - login: tltaylor1
avatarUrl: https://avatars.githubusercontent.com/u/113442282?v=4 avatarUrl: https://avatars.githubusercontent.com/u/234697691?u=f9bf860a7a6e1109b35f1eb930920bd37e3bf571&v=4
url: https://github.com/ibrahimpelumi6142 url: https://github.com/tltaylor1
- login: justoutofcuriosity
avatarUrl: https://avatars.githubusercontent.com/u/57193655?v=4
url: https://github.com/justoutofcuriosity
- login: nilslindemann - login: nilslindemann
avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4 avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
url: https://github.com/nilslindemann url: https://github.com/nilslindemann
- - login: samuelcolvin - - login: samuelcolvin
avatarUrl: https://avatars.githubusercontent.com/u/4039449?u=42eb3b833047c8c4b4f647a031eaef148c16d93f&v=4 avatarUrl: https://avatars.githubusercontent.com/u/4039449?u=42eb3b833047c8c4b4f647a031eaef148c16d93f&v=4
url: https://github.com/samuelcolvin url: https://github.com/samuelcolvin
- login: otosky
avatarUrl: https://avatars.githubusercontent.com/u/42260747?u=69d089387c743d89427aa4ad8740cfb34045a9e0&v=4
url: https://github.com/otosky
- login: ramonalmeidam
avatarUrl: https://avatars.githubusercontent.com/u/45269580?u=3358750b3a5854d7c3ed77aaca7dd20a0f529d32&v=4
url: https://github.com/ramonalmeidam
- login: roboflow - login: roboflow
avatarUrl: https://avatars.githubusercontent.com/u/53104118?v=4 avatarUrl: https://avatars.githubusercontent.com/u/53104118?v=4
url: https://github.com/roboflow url: https://github.com/roboflow
- login: dudikbender - login: otosky
avatarUrl: https://avatars.githubusercontent.com/u/53487583?u=3a57542938ebfd57579a0111db2b297e606d9681&v=4 avatarUrl: https://avatars.githubusercontent.com/u/42260747?u=69d089387c743d89427aa4ad8740cfb34045a9e0&v=4
url: https://github.com/dudikbender url: https://github.com/otosky
- login: ehaca
avatarUrl: https://avatars.githubusercontent.com/u/25950317?u=cec1a3e0643b785288ae8260cc295a85ab344995&v=4
url: https://github.com/ehaca
- login: raphaellaude
avatarUrl: https://avatars.githubusercontent.com/u/28026311?u=91e1c00d9ac4f8045527e13de8050d504531cbc0&v=4
url: https://github.com/raphaellaude
- login: timlrx
avatarUrl: https://avatars.githubusercontent.com/u/28362229?u=9a745ca31372ee324af682715ae88ce8522f9094&v=4
url: https://github.com/timlrx
- login: Leay15 - login: Leay15
avatarUrl: https://avatars.githubusercontent.com/u/32212558?u=c4aa9c1737e515959382a5515381757b1fd86c53&v=4 avatarUrl: https://avatars.githubusercontent.com/u/32212558?u=c4aa9c1737e515959382a5515381757b1fd86c53&v=4
url: https://github.com/Leay15 url: https://github.com/Leay15
- login: timlrx
avatarUrl: https://avatars.githubusercontent.com/u/28362229?u=9a745ca31372ee324af682715ae88ce8522f9094&v=4
url: https://github.com/timlrx
- login: ehaca
avatarUrl: https://avatars.githubusercontent.com/u/25950317?u=cec1a3e0643b785288ae8260cc295a85ab344995&v=4
url: https://github.com/ehaca
- login: RaamEEIL
avatarUrl: https://avatars.githubusercontent.com/u/20320552?v=4
url: https://github.com/RaamEEIL
- login: ashi-agrawal
avatarUrl: https://avatars.githubusercontent.com/u/17105294?u=99c7a854035e5398d8e7b674f2d42baae6c957f8&v=4
url: https://github.com/ashi-agrawal
- login: jugeeem - login: jugeeem
avatarUrl: https://avatars.githubusercontent.com/u/116043716?u=ae590d79c38ac79c91b9c5caa6887d061e865a3d&v=4 avatarUrl: https://avatars.githubusercontent.com/u/116043716?u=e4df530e99a086a1085f3dc125b94783670fb383&v=4
url: https://github.com/jugeeem url: https://github.com/jugeeem
- login: Karine-Bauch - login: Charisn
avatarUrl: https://avatars.githubusercontent.com/u/90465103?u=7feb1018abb1a5631cfd9a91fea723d1ceb5f49b&v=4 avatarUrl: https://avatars.githubusercontent.com/u/100683386?u=5a57e569b443a58cb34a32b6cb6ea12c783e14c1&v=4
url: https://github.com/Karine-Bauch url: https://github.com/Charisn
- login: kaoru0310 - login: kaoru0310
avatarUrl: https://avatars.githubusercontent.com/u/80977929?u=1b61d10142b490e56af932ddf08a390fae8ee94f&v=4 avatarUrl: https://avatars.githubusercontent.com/u/80977929?u=1b61d10142b490e56af932ddf08a390fae8ee94f&v=4
url: https://github.com/kaoru0310 url: https://github.com/kaoru0310
@@ -128,20 +125,23 @@ sponsors:
- login: anthonycepeda - login: anthonycepeda
avatarUrl: https://avatars.githubusercontent.com/u/72019805?u=60bdf46240cff8fca482ff0fc07d963fd5e1a27c&v=4 avatarUrl: https://avatars.githubusercontent.com/u/72019805?u=60bdf46240cff8fca482ff0fc07d963fd5e1a27c&v=4
url: https://github.com/anthonycepeda url: https://github.com/anthonycepeda
- login: AalbatrossGuy - login: PedroRuizCode
avatarUrl: https://avatars.githubusercontent.com/u/68378354?u=0bdeea9356d24f638244131f6d8d1e2d2f3601ca&v=4 avatarUrl: https://avatars.githubusercontent.com/u/69810923?u=26f9b262922b724deacdfa16ccd5785d093ac371&v=4
url: https://github.com/AalbatrossGuy url: https://github.com/PedroRuizCode
- login: patsatsia - login: patsatsia
avatarUrl: https://avatars.githubusercontent.com/u/61111267?u=3271b85f7a37b479c8d0ae0a235182e83c166edf&v=4 avatarUrl: https://avatars.githubusercontent.com/u/61111267?u=3271b85f7a37b479c8d0ae0a235182e83c166edf&v=4
url: https://github.com/patsatsia url: https://github.com/patsatsia
- login: oliverxchen - login: bradsward
avatarUrl: https://avatars.githubusercontent.com/u/4471774?u=534191f25e32eeaadda22dfab4b0a428733d5489&v=4 avatarUrl: https://avatars.githubusercontent.com/u/60303274?u=6b74120e142c8bd4dae22edcf3ac6bb9c3b427bb&v=4
url: https://github.com/oliverxchen url: https://github.com/bradsward
- login: dudikbender
avatarUrl: https://avatars.githubusercontent.com/u/53487583?u=3a57542938ebfd57579a0111db2b297e606d9681&v=4
url: https://github.com/dudikbender
- login: jaredtrog - login: jaredtrog
avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4 avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4
url: https://github.com/jaredtrog url: https://github.com/jaredtrog
- login: Ryandaydev - login: Ryandaydev
avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=679ff84cb7b988c5795a5fa583857f574a055763&v=4 avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=87b1afc7f4fff933779959270e2d168339e91402&v=4
url: https://github.com/Ryandaydev url: https://github.com/Ryandaydev
- login: gorhack - login: gorhack
avatarUrl: https://avatars.githubusercontent.com/u/4141690?u=ec119ebc4bdf00a7bc84657a71aa17834f4f27f3&v=4 avatarUrl: https://avatars.githubusercontent.com/u/4141690?u=ec119ebc4bdf00a7bc84657a71aa17834f4f27f3&v=4
@@ -149,9 +149,6 @@ sponsors:
- login: mj0331 - login: mj0331
avatarUrl: https://avatars.githubusercontent.com/u/3890353?u=1c627ac1a024515b4871de5c3ebbfaa1a57f65d4&v=4 avatarUrl: https://avatars.githubusercontent.com/u/3890353?u=1c627ac1a024515b4871de5c3ebbfaa1a57f65d4&v=4
url: https://github.com/mj0331 url: https://github.com/mj0331
- login: anomaly
avatarUrl: https://avatars.githubusercontent.com/u/3654837?v=4
url: https://github.com/anomaly
- login: aacayaco - login: aacayaco
avatarUrl: https://avatars.githubusercontent.com/u/3634801?u=eaadda178c964178fcb64886f6c732172c8f8219&v=4 avatarUrl: https://avatars.githubusercontent.com/u/3634801?u=eaadda178c964178fcb64886f6c732172c8f8219&v=4
url: https://github.com/aacayaco url: https://github.com/aacayaco
@@ -170,36 +167,24 @@ sponsors:
- login: dodo5522 - login: dodo5522
avatarUrl: https://avatars.githubusercontent.com/u/1362607?u=9bf1e0e520cccc547c046610c468ce6115bbcf9f&v=4 avatarUrl: https://avatars.githubusercontent.com/u/1362607?u=9bf1e0e520cccc547c046610c468ce6115bbcf9f&v=4
url: https://github.com/dodo5522 url: https://github.com/dodo5522
- login: mintuhouse - login: netsatan
avatarUrl: https://avatars.githubusercontent.com/u/769950?u=ecfbd79a97d33177e0d093ddb088283cf7fe8444&v=4 avatarUrl: https://avatars.githubusercontent.com/u/955557?u=cb8fc0ae7f7b06807f0a58e335b1af96c9da0344&v=4
url: https://github.com/mintuhouse url: https://github.com/netsatan
- login: falkben
avatarUrl: https://avatars.githubusercontent.com/u/653031?u=ad9838e089058c9e5a0bab94c0eec7cc181e0cd0&v=4
url: https://github.com/falkben
- login: koxudaxi - login: koxudaxi
avatarUrl: https://avatars.githubusercontent.com/u/630670?u=507d8577b4b3670546b449c4c2ccbc5af40d72f7&v=4 avatarUrl: https://avatars.githubusercontent.com/u/630670?u=507d8577b4b3670546b449c4c2ccbc5af40d72f7&v=4
url: https://github.com/koxudaxi url: https://github.com/koxudaxi
- login: wshayes
avatarUrl: https://avatars.githubusercontent.com/u/365303?u=07ca03c5ee811eb0920e633cc3c3db73dbec1aa5&v=4
url: https://github.com/wshayes
- login: pamelafox - login: pamelafox
avatarUrl: https://avatars.githubusercontent.com/u/297042?v=4 avatarUrl: https://avatars.githubusercontent.com/u/297042?v=4
url: https://github.com/pamelafox url: https://github.com/pamelafox
- login: robintw
avatarUrl: https://avatars.githubusercontent.com/u/296686?v=4
url: https://github.com/robintw
- login: jstanden - login: jstanden
avatarUrl: https://avatars.githubusercontent.com/u/63288?u=c3658d57d2862c607a0e19c2101c3c51876e36ad&v=4 avatarUrl: https://avatars.githubusercontent.com/u/63288?u=c3658d57d2862c607a0e19c2101c3c51876e36ad&v=4
url: https://github.com/jstanden url: https://github.com/jstanden
- login: RaamEEIL
avatarUrl: https://avatars.githubusercontent.com/u/20320552?v=4
url: https://github.com/RaamEEIL
- login: ashi-agrawal
avatarUrl: https://avatars.githubusercontent.com/u/17105294?u=99c7a854035e5398d8e7b674f2d42baae6c957f8&v=4
url: https://github.com/ashi-agrawal
- login: mjohnsey - login: mjohnsey
avatarUrl: https://avatars.githubusercontent.com/u/16784016?u=38fad2e6b411244560b3af99c5f5a4751bc81865&v=4 avatarUrl: https://avatars.githubusercontent.com/u/16784016?u=38fad2e6b411244560b3af99c5f5a4751bc81865&v=4
url: https://github.com/mjohnsey url: https://github.com/mjohnsey
- login: cizekmilan
avatarUrl: https://avatars.githubusercontent.com/u/15999191?u=df194a9bf279f503bc96af41a35c0027eb94ad4f&v=4
url: https://github.com/cizekmilan
- login: khadrawy - login: khadrawy
avatarUrl: https://avatars.githubusercontent.com/u/13686061?u=59f25ef42ecf04c22657aac4238ce0e2d3d30304&v=4 avatarUrl: https://avatars.githubusercontent.com/u/13686061?u=59f25ef42ecf04c22657aac4238ce0e2d3d30304&v=4
url: https://github.com/khadrawy url: https://github.com/khadrawy
@@ -221,63 +206,54 @@ sponsors:
- login: FernandoCelmer - login: FernandoCelmer
avatarUrl: https://avatars.githubusercontent.com/u/6262214?u=58ba6d5888fa7f355934e52db19f950e20b38162&v=4 avatarUrl: https://avatars.githubusercontent.com/u/6262214?u=58ba6d5888fa7f355934e52db19f950e20b38162&v=4
url: https://github.com/FernandoCelmer url: https://github.com/FernandoCelmer
- login: geodata-no
avatarUrl: https://avatars.githubusercontent.com/u/5946299?v=4
url: https://github.com/geodata-no
- login: eseglem - login: eseglem
avatarUrl: https://avatars.githubusercontent.com/u/5920492?u=208d419cf667b8ac594c82a8db01932c7e50d057&v=4 avatarUrl: https://avatars.githubusercontent.com/u/5920492?u=208d419cf667b8ac594c82a8db01932c7e50d057&v=4
url: https://github.com/eseglem url: https://github.com/eseglem
- login: ternaus - login: ternaus
avatarUrl: https://avatars.githubusercontent.com/u/5481618?u=513a26b02a39e7a28d587cd37c6cc877ea368e6e&v=4 avatarUrl: https://avatars.githubusercontent.com/u/5481618?u=513a26b02a39e7a28d587cd37c6cc877ea368e6e&v=4
url: https://github.com/ternaus url: https://github.com/ternaus
- - login: Artur-Galstyan - - login: jpfyoder
avatarUrl: https://avatars.githubusercontent.com/u/63471891?u=e8691f386037e51a737cc0ba866cd8c89e5cf109&v=4 avatarUrl: https://avatars.githubusercontent.com/u/7548821?u=1683290ed65dae6987d673da044067577ee71521&v=4
url: https://github.com/Artur-Galstyan url: https://github.com/jpfyoder
- login: manoelpqueiroz - - login: manoelpqueiroz
avatarUrl: https://avatars.githubusercontent.com/u/23669137?u=b12e84b28a84369ab5b30bd5a79e5788df5a0756&v=4 avatarUrl: https://avatars.githubusercontent.com/u/23669137?u=b12e84b28a84369ab5b30bd5a79e5788df5a0756&v=4
url: https://github.com/manoelpqueiroz url: https://github.com/manoelpqueiroz
- login: Artur-Galstyan
avatarUrl: https://avatars.githubusercontent.com/u/63471891?u=e8691f386037e51a737cc0ba866cd8c89e5cf109&v=4
url: https://github.com/Artur-Galstyan
- - login: pawamoy - - login: pawamoy
avatarUrl: https://avatars.githubusercontent.com/u/3999221?u=b030e4c89df2f3a36bc4710b925bdeb6745c9856&v=4 avatarUrl: https://avatars.githubusercontent.com/u/3999221?u=b030e4c89df2f3a36bc4710b925bdeb6745c9856&v=4
url: https://github.com/pawamoy url: https://github.com/pawamoy
- login: siavashyj
avatarUrl: https://avatars.githubusercontent.com/u/43583410?u=562005ddc7901cd27a1219a118a2363817b14977&v=4
url: https://github.com/siavashyj
- login: mobyw
avatarUrl: https://avatars.githubusercontent.com/u/44370805?v=4
url: https://github.com/mobyw
- login: ArtyomVancyan
avatarUrl: https://avatars.githubusercontent.com/u/44609997?v=4
url: https://github.com/ArtyomVancyan
- login: caviri
avatarUrl: https://avatars.githubusercontent.com/u/45425937?u=5f3d66ea5edea94c028c51ebf1c0f3b37e6c3db5&v=4
url: https://github.com/caviri
- login: hgalytoby - login: hgalytoby
avatarUrl: https://avatars.githubusercontent.com/u/50397689?u=6cc9028f3db63f8f60ad21c17b1ce4b88c4e2e60&v=4 avatarUrl: https://avatars.githubusercontent.com/u/50397689?u=6cc9028f3db63f8f60ad21c17b1ce4b88c4e2e60&v=4
url: https://github.com/hgalytoby url: https://github.com/hgalytoby
- login: johnl28 - login: mobyw
avatarUrl: https://avatars.githubusercontent.com/u/54412955?u=47dd06082d1c39caa90c752eb55566e4f3813957&v=4 avatarUrl: https://avatars.githubusercontent.com/u/44370805?v=4
url: https://github.com/johnl28 url: https://github.com/mobyw
- login: danielunderwood - login: siavashyj
avatarUrl: https://avatars.githubusercontent.com/u/4472301?v=4 avatarUrl: https://avatars.githubusercontent.com/u/43583410?u=562005ddc7901cd27a1219a118a2363817b14977&v=4
url: https://github.com/danielunderwood url: https://github.com/siavashyj
- login: hoenie-ams - login: bnkc
avatarUrl: https://avatars.githubusercontent.com/u/25708487?u=cda07434f0509ac728d9edf5e681117c0f6b818b&v=4 avatarUrl: https://avatars.githubusercontent.com/u/34930566?u=888af82706afa36727feebce0e62225905926131&v=4
url: https://github.com/hoenie-ams url: https://github.com/bnkc
- login: joerambo - login: joerambo
avatarUrl: https://avatars.githubusercontent.com/u/26282974?v=4 avatarUrl: https://avatars.githubusercontent.com/u/26282974?v=4
url: https://github.com/joerambo url: https://github.com/joerambo
- login: engineerjoe440 - login: hoenie-ams
avatarUrl: https://avatars.githubusercontent.com/u/33275230?u=eb223cad27017bb1e936ee9b429b450d092d0236&v=4 avatarUrl: https://avatars.githubusercontent.com/u/25708487?u=cda07434f0509ac728d9edf5e681117c0f6b818b&v=4
url: https://github.com/engineerjoe440 url: https://github.com/hoenie-ams
- login: bnkc - login: nisutec
avatarUrl: https://avatars.githubusercontent.com/u/34930566?u=4771ac4e64066f0847d40e5b29910adabd9b2372&v=4 avatarUrl: https://avatars.githubusercontent.com/u/25281462?u=e562484c451fdfc59053163f64405f8eb262b8b0&v=4
url: https://github.com/bnkc url: https://github.com/nisutec
- login: petercool - login: joshuatz
avatarUrl: https://avatars.githubusercontent.com/u/37613029?u=75aa8c6729e6e8f85a300561c4dbeef9d65c8797&v=4 avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4
url: https://github.com/petercool url: https://github.com/joshuatz
- login: PelicanQ - login: danielunderwood
avatarUrl: https://avatars.githubusercontent.com/u/77930606?v=4 avatarUrl: https://avatars.githubusercontent.com/u/4472301?v=4
url: https://github.com/PelicanQ url: https://github.com/danielunderwood
- login: PunRabbit
avatarUrl: https://avatars.githubusercontent.com/u/70463212?u=1a835cfbc99295a60c8282f6aa6199d1b42241a5&v=4
url: https://github.com/PunRabbit
- login: my3 - login: my3
avatarUrl: https://avatars.githubusercontent.com/u/1825270?v=4 avatarUrl: https://avatars.githubusercontent.com/u/1825270?v=4
url: https://github.com/my3 url: https://github.com/my3
@@ -290,6 +266,9 @@ sponsors:
- login: tochikuji - login: tochikuji
avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4 avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4
url: https://github.com/tochikuji url: https://github.com/tochikuji
- login: falkben
avatarUrl: https://avatars.githubusercontent.com/u/653031?u=ad9838e089058c9e5a0bab94c0eec7cc181e0cd0&v=4
url: https://github.com/falkben
- login: ceb10n - login: ceb10n
avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4 avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4
url: https://github.com/ceb10n url: https://github.com/ceb10n
@@ -302,39 +281,21 @@ sponsors:
- login: ddanier - login: ddanier
avatarUrl: https://avatars.githubusercontent.com/u/113563?u=ed1dc79de72f93bd78581f88ebc6952b62f472da&v=4 avatarUrl: https://avatars.githubusercontent.com/u/113563?u=ed1dc79de72f93bd78581f88ebc6952b62f472da&v=4
url: https://github.com/ddanier url: https://github.com/ddanier
- login: nisutec
avatarUrl: https://avatars.githubusercontent.com/u/25281462?u=e562484c451fdfc59053163f64405f8eb262b8b0&v=4
url: https://github.com/nisutec
- login: joshuatz
avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4
url: https://github.com/joshuatz
- login: TheR1D - login: TheR1D
avatarUrl: https://avatars.githubusercontent.com/u/16740832?u=b0dfdbdb27b79729430c71c6128962f77b7b53f7&v=4 avatarUrl: https://avatars.githubusercontent.com/u/16740832?u=b0dfdbdb27b79729430c71c6128962f77b7b53f7&v=4
url: https://github.com/TheR1D url: https://github.com/TheR1D
- login: Zuzah - login: Zuzah
avatarUrl: https://avatars.githubusercontent.com/u/10934846?u=1ef43e075ddc87bd1178372bf4d95ee6175cae27&v=4 avatarUrl: https://avatars.githubusercontent.com/u/10934846?u=1ef43e075ddc87bd1178372bf4d95ee6175cae27&v=4
url: https://github.com/Zuzah url: https://github.com/Zuzah
- login: mntolia
avatarUrl: https://avatars.githubusercontent.com/u/10390224?v=4
url: https://github.com/mntolia
- login: hard-coders
avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=78d12d1acdf853c817700145e73de7fd9e5d068b&v=4
url: https://github.com/hard-coders
- login: DMantis - login: DMantis
avatarUrl: https://avatars.githubusercontent.com/u/9536869?u=652dd0d49717803c0cbcbf44f7740e53cf2d4892&v=4 avatarUrl: https://avatars.githubusercontent.com/u/9536869?u=652dd0d49717803c0cbcbf44f7740e53cf2d4892&v=4
url: https://github.com/DMantis url: https://github.com/DMantis
- login: xncbf
avatarUrl: https://avatars.githubusercontent.com/u/9462045?u=a80a7bb349555b277645632ed66639ff43400614&v=4
url: https://github.com/xncbf
- login: moonape1226 - login: moonape1226
avatarUrl: https://avatars.githubusercontent.com/u/8532038?u=d9f8b855a429fff9397c3833c2ff83849ebf989d&v=4 avatarUrl: https://avatars.githubusercontent.com/u/8532038?u=d9f8b855a429fff9397c3833c2ff83849ebf989d&v=4
url: https://github.com/moonape1226 url: https://github.com/moonape1226
- login: harsh183 - login: harsh183
avatarUrl: https://avatars.githubusercontent.com/u/7780198?v=4 avatarUrl: https://avatars.githubusercontent.com/u/7780198?v=4
url: https://github.com/harsh183 url: https://github.com/harsh183
- login: katnoria
avatarUrl: https://avatars.githubusercontent.com/u/7674948?u=09767eb13e07e09496c5fee4e5ce21d9eac34a56&v=4
url: https://github.com/katnoria
- login: KentShikama - login: KentShikama
avatarUrl: https://avatars.githubusercontent.com/u/6329898?u=8b236810db9b96333230430837e1f021f9246da1&v=4 avatarUrl: https://avatars.githubusercontent.com/u/6329898?u=8b236810db9b96333230430837e1f021f9246da1&v=4
url: https://github.com/KentShikama url: https://github.com/KentShikama
@@ -347,33 +308,33 @@ sponsors:
- login: rangulvers - login: rangulvers
avatarUrl: https://avatars.githubusercontent.com/u/5235430?u=e254d4af4ace5a05fa58372ae677c7d26f0d5a53&v=4 avatarUrl: https://avatars.githubusercontent.com/u/5235430?u=e254d4af4ace5a05fa58372ae677c7d26f0d5a53&v=4
url: https://github.com/rangulvers url: https://github.com/rangulvers
- - login: KOZ39 - - login: mohammadi-hadi
avatarUrl: https://avatars.githubusercontent.com/u/38822500?u=9dfc0a697df1c9628f08e20dc3fb17b1afc4e5a7&v=4 avatarUrl: https://avatars.githubusercontent.com/u/50410241?u=1137b5ff9ea8585c0192fe9ddb4ae5e21bc3d2e8&v=4
url: https://github.com/KOZ39 url: https://github.com/mohammadi-hadi
- login: rwxd
avatarUrl: https://avatars.githubusercontent.com/u/40308458?u=cd04a39e3655923be4f25c2ba8a5a07b3da3230a&v=4
url: https://github.com/rwxd
- login: morzan1001 - login: morzan1001
avatarUrl: https://avatars.githubusercontent.com/u/47593005?u=c30ab7230f82a12a9b938dcb54f84a996931409a&v=4 avatarUrl: https://avatars.githubusercontent.com/u/47593005?u=c30ab7230f82a12a9b938dcb54f84a996931409a&v=4
url: https://github.com/morzan1001 url: https://github.com/morzan1001
- login: Olegt0rr - login: ArtyomVancyan
avatarUrl: https://avatars.githubusercontent.com/u/25399456?u=3e87b5239a2f4600975ba13be73054f8567c6060&v=4 avatarUrl: https://avatars.githubusercontent.com/u/44609997?v=4
url: https://github.com/Olegt0rr url: https://github.com/ArtyomVancyan
- login: larsyngvelundin - login: rwxd
avatarUrl: https://avatars.githubusercontent.com/u/34173819?u=74958599695bf83ac9f1addd935a51548a10c6b0&v=4 avatarUrl: https://avatars.githubusercontent.com/u/40308458?u=cd04a39e3655923be4f25c2ba8a5a07b3da3230a&v=4
url: https://github.com/larsyngvelundin url: https://github.com/rwxd
- login: KOZ39
avatarUrl: https://avatars.githubusercontent.com/u/38822500?u=9dfc0a697df1c9628f08e20dc3fb17b1afc4e5a7&v=4
url: https://github.com/KOZ39
- login: andrecorumba - login: andrecorumba
avatarUrl: https://avatars.githubusercontent.com/u/37807517?u=9b9be3b41da9bda60957da9ef37b50dbf65baa61&v=4 avatarUrl: https://avatars.githubusercontent.com/u/37807517?u=9b9be3b41da9bda60957da9ef37b50dbf65baa61&v=4
url: https://github.com/andrecorumba url: https://github.com/andrecorumba
- login: CoderDeltaLAN - login: Olegt0rr
avatarUrl: https://avatars.githubusercontent.com/u/152043745?u=4ff541efffb7d134e60c5fcf2dd1e343f90bb782&v=4 avatarUrl: https://avatars.githubusercontent.com/u/25399456?u=3e87b5239a2f4600975ba13be73054f8567c6060&v=4
url: https://github.com/CoderDeltaLAN url: https://github.com/Olegt0rr
- login: hippoley - login: diogotoporcov
avatarUrl: https://avatars.githubusercontent.com/u/135493401?u=1164ef48a645a7c12664fabc1638fbb7e1c459b0&v=4 avatarUrl: https://avatars.githubusercontent.com/u/207575398?u=1fa7cf41b4181faa4d27f38bc37a374c17b5163b&v=4
url: https://github.com/hippoley url: https://github.com/diogotoporcov
- login: nayasinghania - login: anandakrishnone
avatarUrl: https://avatars.githubusercontent.com/u/74111380?u=752e99a5e139389fdc0a0677122adc08438eb076&v=4 avatarUrl: https://avatars.githubusercontent.com/u/100110721?u=5d30e6fea1524bf3c8be3547027dbce59cc699af&v=4
url: https://github.com/nayasinghania url: https://github.com/anandakrishnone
- login: onestn - login: onestn
avatarUrl: https://avatars.githubusercontent.com/u/62360849?u=746dd21c34e7e06eefb11b03e8bb01aaae3c2a4f&v=4 avatarUrl: https://avatars.githubusercontent.com/u/62360849?u=746dd21c34e7e06eefb11b03e8bb01aaae3c2a4f&v=4
url: https://github.com/onestn url: https://github.com/onestn
@@ -383,6 +344,15 @@ sponsors:
- login: andreagrandi - login: andreagrandi
avatarUrl: https://avatars.githubusercontent.com/u/636391?u=13d90cb8ec313593a5b71fbd4e33b78d6da736f5&v=4 avatarUrl: https://avatars.githubusercontent.com/u/636391?u=13d90cb8ec313593a5b71fbd4e33b78d6da736f5&v=4
url: https://github.com/andreagrandi url: https://github.com/andreagrandi
- login: 0xsummerday
avatarUrl: https://avatars.githubusercontent.com/u/13888940?u=d0d45d5e2d7efd880a32d030fb222a51406c986f&v=4
url: https://github.com/0xsummerday
- login: xncbf
avatarUrl: https://avatars.githubusercontent.com/u/9462045?u=a80a7bb349555b277645632ed66639ff43400614&v=4
url: https://github.com/xncbf
- login: DaxServer
avatarUrl: https://avatars.githubusercontent.com/u/7479937?u=cf2f97f958e47b209679d6aa2ad8723ef0d1cd0f&v=4
url: https://github.com/DaxServer
- login: msserpa - login: msserpa
avatarUrl: https://avatars.githubusercontent.com/u/6334934?u=82c4489eb1559d88d2990d60001901b14f722bbb&v=4 avatarUrl: https://avatars.githubusercontent.com/u/6334934?u=82c4489eb1559d88d2990d60001901b14f722bbb&v=4
url: https://github.com/msserpa url: https://github.com/msserpa
+9 -9
View File
@@ -2,21 +2,21 @@ members:
- login: tiangolo - login: tiangolo
avatar_url: https://avatars.githubusercontent.com/u/1326112 avatar_url: https://avatars.githubusercontent.com/u/1326112
url: https://github.com/tiangolo url: https://github.com/tiangolo
- login: Kludex
avatar_url: https://avatars.githubusercontent.com/u/7353520
url: https://github.com/Kludex
- login: alejsdev
avatar_url: https://avatars.githubusercontent.com/u/90076947
url: https://github.com/alejsdev
- login: svlandeg
avatar_url: https://avatars.githubusercontent.com/u/8796347
url: https://github.com/svlandeg
- login: YuriiMotov - login: YuriiMotov
avatar_url: https://avatars.githubusercontent.com/u/109919500 avatar_url: https://avatars.githubusercontent.com/u/109919500
url: https://github.com/YuriiMotov url: https://github.com/YuriiMotov
- login: svlandeg
avatar_url: https://avatars.githubusercontent.com/u/8796347
url: https://github.com/svlandeg
- login: alejsdev
avatar_url: https://avatars.githubusercontent.com/u/90076947
url: https://github.com/alejsdev
- login: patrick91 - login: patrick91
avatar_url: https://avatars.githubusercontent.com/u/667029 avatar_url: https://avatars.githubusercontent.com/u/667029
url: https://github.com/patrick91 url: https://github.com/patrick91
- login: luzzodev - login: luzzodev
avatar_url: https://avatars.githubusercontent.com/u/27291415 avatar_url: https://avatars.githubusercontent.com/u/27291415
url: https://github.com/luzzodev url: https://github.com/luzzodev
- login: Kludex
avatar_url: https://avatars.githubusercontent.com/u/7353520
url: https://github.com/Kludex
+1
View File
@@ -1,3 +1,4 @@
users:
- tiangolo - tiangolo
- codecov - codecov
- github-actions - github-actions
+1 -1
View File
@@ -61,6 +61,6 @@ bronze:
# - url: https://testdriven.io/courses/tdd-fastapi/ # - url: https://testdriven.io/courses/tdd-fastapi/
# title: Learn to build high-quality web apps with best practices # title: Learn to build high-quality web apps with best practices
# img: /img/sponsors/testdriven.svg # img: /img/sponsors/testdriven.svg
- url: https://www.testmu.ai/?utm_source=fastapi&utm_medium=partner&utm_campaign=sponsor&utm_term=opensource&utm_content=webpage - url: https://www.testmuai.com/?utm_source=fastapi&utm_medium=partner&utm_campaign=sponsor&utm_term=opensource&utm_content=webpage
title: TestMu AI. The Native AI-Agentic Cloud Platform to Supercharge Quality Engineering. title: TestMu AI. The Native AI-Agentic Cloud Platform to Supercharge Quality Engineering.
img: /img/sponsors/testmu.png img: /img/sponsors/testmu.png
+238 -237
View File
@@ -1,286 +1,332 @@
repos:
- name: headroom - name: headroom
html_url: https://github.com/headroomlabs-ai/headroom html_url: https://github.com/headroomlabs-ai/headroom
stars: 55017 stars: 68267
owner_login: headroomlabs-ai owner_login: headroomlabs-ai
owner_html_url: https://github.com/headroomlabs-ai owner_html_url: https://github.com/headroomlabs-ai
- name: full-stack-fastapi-template - name: full-stack-fastapi-template
html_url: https://github.com/fastapi/full-stack-fastapi-template html_url: https://github.com/fastapi/full-stack-fastapi-template
stars: 43994 stars: 45272
owner_login: fastapi owner_login: fastapi
owner_html_url: https://github.com/fastapi owner_html_url: https://github.com/fastapi
- name: Hello-Python - name: Hello-Python
html_url: https://github.com/mouredev/Hello-Python html_url: https://github.com/mouredev/Hello-Python
stars: 36226 stars: 37219
owner_login: mouredev owner_login: mouredev
owner_html_url: https://github.com/mouredev owner_html_url: https://github.com/mouredev
- name: serve - name: serve
html_url: https://github.com/jina-ai/serve html_url: https://github.com/jina-ai/serve
stars: 21862 stars: 21860
owner_login: jina-ai owner_login: jina-ai
owner_html_url: https://github.com/jina-ai owner_html_url: https://github.com/jina-ai
- name: HivisionIDPhotos - name: HivisionIDPhotos
html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos
stars: 21212 stars: 21468
owner_login: Zeyi-Lin owner_login: Zeyi-Lin
owner_html_url: https://github.com/Zeyi-Lin owner_html_url: https://github.com/Zeyi-Lin
- name: Douyin_TikTok_Download_API - name: Douyin_TikTok_Download_API
html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API
stars: 18599 stars: 19776
owner_login: Evil0ctal owner_login: Evil0ctal
owner_html_url: https://github.com/Evil0ctal owner_html_url: https://github.com/Evil0ctal
- name: sqlmodel - name: sqlmodel
html_url: https://github.com/fastapi/sqlmodel html_url: https://github.com/fastapi/sqlmodel
stars: 18156 stars: 18295
owner_login: fastapi owner_login: fastapi
owner_html_url: https://github.com/fastapi owner_html_url: https://github.com/fastapi
- name: fastapi-best-practices - name: fastapi-best-practices
html_url: https://github.com/zhanymkanov/fastapi-best-practices html_url: https://github.com/zhanymkanov/fastapi-best-practices
stars: 17608 stars: 18006
owner_login: zhanymkanov owner_login: zhanymkanov
owner_html_url: https://github.com/zhanymkanov owner_html_url: https://github.com/zhanymkanov
- name: SurfSense - name: SurfSense
html_url: https://github.com/MODSetter/SurfSense html_url: https://github.com/MODSetter/SurfSense
stars: 15161 stars: 16046
owner_login: MODSetter owner_login: MODSetter
owner_html_url: https://github.com/MODSetter owner_html_url: https://github.com/MODSetter
- name: machine-learning-zoomcamp - name: machine-learning-zoomcamp
html_url: https://github.com/DataTalksClub/machine-learning-zoomcamp html_url: https://github.com/DataTalksClub/machine-learning-zoomcamp
stars: 13445 stars: 14069
owner_login: DataTalksClub owner_login: DataTalksClub
owner_html_url: https://github.com/DataTalksClub owner_html_url: https://github.com/DataTalksClub
- name: peewee
html_url: https://github.com/coleifer/peewee
stars: 11976
owner_login: coleifer
owner_html_url: https://github.com/coleifer
- name: fastapi_mcp
html_url: https://github.com/tadata-org/fastapi_mcp
stars: 11932
owner_login: tadata-org
owner_html_url: https://github.com/tadata-org
- name: XHS-Downloader - name: XHS-Downloader
html_url: https://github.com/JoeanAmier/XHS-Downloader html_url: https://github.com/JoeanAmier/XHS-Downloader
stars: 11768 stars: 12563
owner_login: JoeanAmier owner_login: JoeanAmier
owner_html_url: https://github.com/JoeanAmier owner_html_url: https://github.com/JoeanAmier
- name: fastapi_mcp
html_url: https://github.com/tadata-org/fastapi_mcp
stars: 11994
owner_login: tadata-org
owner_html_url: https://github.com/tadata-org
- name: peewee
html_url: https://github.com/coleifer/peewee
stars: 11986
owner_login: coleifer
owner_html_url: https://github.com/coleifer
- name: awesome-fastapi - name: awesome-fastapi
html_url: https://github.com/mjhea0/awesome-fastapi html_url: https://github.com/mjhea0/awesome-fastapi
stars: 11478 stars: 11633
owner_login: mjhea0 owner_login: mjhea0
owner_html_url: https://github.com/mjhea0 owner_html_url: https://github.com/mjhea0
- name: WhisperLiveKit
html_url: https://github.com/QuentinFuxa/WhisperLiveKit
stars: 10983
owner_login: QuentinFuxa
owner_html_url: https://github.com/QuentinFuxa
- name: polar - name: polar
html_url: https://github.com/polarsource/polar html_url: https://github.com/polarsource/polar
stars: 9999 stars: 10225
owner_login: polarsource owner_login: polarsource
owner_html_url: https://github.com/polarsource owner_html_url: https://github.com/polarsource
- name: pycaret - name: pycaret
html_url: https://github.com/pycaret/pycaret html_url: https://github.com/pycaret/pycaret
stars: 9818 stars: 9833
owner_login: pycaret owner_login: pycaret
owner_html_url: https://github.com/pycaret owner_html_url: https://github.com/pycaret
- name: FastUI - name: FastUI
html_url: https://github.com/pydantic/FastUI html_url: https://github.com/pydantic/FastUI
stars: 8970 stars: 8953
owner_login: pydantic owner_login: pydantic
owner_html_url: https://github.com/pydantic owner_html_url: https://github.com/pydantic
- name: FileCodeBox - name: FileCodeBox
html_url: https://github.com/vastsa/FileCodeBox html_url: https://github.com/vastsa/FileCodeBox
stars: 8376 stars: 8498
owner_login: vastsa owner_login: vastsa
owner_html_url: https://github.com/vastsa owner_html_url: https://github.com/vastsa
- name: nonebot2
html_url: https://github.com/nonebot/nonebot2
stars: 7593
owner_login: nonebot
owner_html_url: https://github.com/nonebot
- name: hatchet - name: hatchet
html_url: https://github.com/hatchet-dev/hatchet html_url: https://github.com/hatchet-dev/hatchet
stars: 7441 stars: 7824
owner_login: hatchet-dev owner_login: hatchet-dev
owner_html_url: https://github.com/hatchet-dev owner_html_url: https://github.com/hatchet-dev
- name: fastapi-users - name: nonebot2
html_url: https://github.com/fastapi-users/fastapi-users html_url: https://github.com/nonebot/nonebot2
stars: 6182 stars: 7691
owner_login: fastapi-users owner_login: nonebot
owner_html_url: https://github.com/fastapi-users owner_html_url: https://github.com/nonebot
- name: Yuxi
html_url: https://github.com/xerrors/Yuxi
stars: 5926
owner_login: xerrors
owner_html_url: https://github.com/xerrors
- name: serge
html_url: https://github.com/serge-chat/serge
stars: 5723
owner_login: serge-chat
owner_html_url: https://github.com/serge-chat
- name: honcho - name: honcho
html_url: https://github.com/plastic-labs/honcho html_url: https://github.com/plastic-labs/honcho
stars: 5680 stars: 6974
owner_login: plastic-labs owner_login: plastic-labs
owner_html_url: https://github.com/plastic-labs owner_html_url: https://github.com/plastic-labs
- name: Yuxi
html_url: https://github.com/xerrors/Yuxi
stars: 6604
owner_login: xerrors
owner_html_url: https://github.com/xerrors
- name: fastapi-users
html_url: https://github.com/fastapi-users/fastapi-users
stars: 6236
owner_login: fastapi-users
owner_html_url: https://github.com/fastapi-users
- name: serge
html_url: https://github.com/serge-chat/serge
stars: 5712
owner_login: serge-chat
owner_html_url: https://github.com/serge-chat
- name: YouDub-webui
html_url: https://github.com/liuzhao1225/YouDub-webui
stars: 5401
owner_login: liuzhao1225
owner_html_url: https://github.com/liuzhao1225
- name: Kokoro-FastAPI - name: Kokoro-FastAPI
html_url: https://github.com/remsky/Kokoro-FastAPI html_url: https://github.com/remsky/Kokoro-FastAPI
stars: 5085 stars: 5392
owner_login: remsky owner_login: remsky
owner_html_url: https://github.com/remsky owner_html_url: https://github.com/remsky
- name: dramaclaw
html_url: https://github.com/dramaclaw/dramaclaw
stars: 4892
owner_login: dramaclaw
owner_html_url: https://github.com/dramaclaw
- name: devpush - name: devpush
html_url: https://github.com/hunvreus/devpush html_url: https://github.com/hunvreus/devpush
stars: 4693 stars: 4747
owner_login: hunvreus owner_login: hunvreus
owner_html_url: https://github.com/hunvreus owner_html_url: https://github.com/hunvreus
- name: strawberry - name: strawberry
html_url: https://github.com/strawberry-graphql/strawberry html_url: https://github.com/strawberry-graphql/strawberry
stars: 4677 stars: 4710
owner_login: strawberry-graphql owner_login: strawberry-graphql
owner_html_url: https://github.com/strawberry-graphql owner_html_url: https://github.com/strawberry-graphql
- name: poem
html_url: https://github.com/poem-web/poem
stars: 4415
owner_login: poem-web
owner_html_url: https://github.com/poem-web
- name: logfire - name: logfire
html_url: https://github.com/pydantic/logfire html_url: https://github.com/pydantic/logfire
stars: 4340 stars: 4449
owner_login: pydantic owner_login: pydantic
owner_html_url: https://github.com/pydantic owner_html_url: https://github.com/pydantic
- name: poem
html_url: https://github.com/poem-web/poem
stars: 4438
owner_login: poem-web
owner_html_url: https://github.com/poem-web
- name: mcp-context-forge
html_url: https://github.com/IBM/mcp-context-forge
stars: 4400
owner_login: IBM
owner_html_url: https://github.com/IBM
- name: huma
html_url: https://github.com/danielgtaylor/huma
stars: 4365
owner_login: danielgtaylor
owner_html_url: https://github.com/danielgtaylor
- name: dynaconf - name: dynaconf
html_url: https://github.com/dynaconf/dynaconf html_url: https://github.com/dynaconf/dynaconf
stars: 4310 stars: 4325
owner_login: dynaconf owner_login: dynaconf
owner_html_url: https://github.com/dynaconf owner_html_url: https://github.com/dynaconf
- name: chatgpt-web-share - name: chatgpt-web-share
html_url: https://github.com/chatpire/chatgpt-web-share html_url: https://github.com/chatpire/chatgpt-web-share
stars: 4269 stars: 4273
owner_login: chatpire owner_login: chatpire
owner_html_url: https://github.com/chatpire owner_html_url: https://github.com/chatpire
- name: huma - name: tick-stock-panel
html_url: https://github.com/danielgtaylor/huma html_url: https://github.com/shy3130/tick-stock-panel
stars: 4203 stars: 4101
owner_login: danielgtaylor owner_login: shy3130
owner_html_url: https://github.com/danielgtaylor owner_html_url: https://github.com/shy3130
- name: atrilabs-engine - name: atrilabs-engine
html_url: https://github.com/Atri-Labs/atrilabs-engine html_url: https://github.com/Atri-Labs/atrilabs-engine
stars: 4071 stars: 4066
owner_login: Atri-Labs owner_login: Atri-Labs
owner_html_url: https://github.com/Atri-Labs owner_html_url: https://github.com/Atri-Labs
- name: mcp-context-forge
html_url: https://github.com/IBM/mcp-context-forge
stars: 3989
owner_login: IBM
owner_html_url: https://github.com/IBM
- name: datamodel-code-generator - name: datamodel-code-generator
html_url: https://github.com/koxudaxi/datamodel-code-generator html_url: https://github.com/koxudaxi/datamodel-code-generator
stars: 3952 stars: 4008
owner_login: koxudaxi owner_login: koxudaxi
owner_html_url: https://github.com/koxudaxi owner_html_url: https://github.com/koxudaxi
- name: LitServe - name: LitServe
html_url: https://github.com/Lightning-AI/LitServe html_url: https://github.com/Lightning-AI/LitServe
stars: 3901 stars: 3934
owner_login: Lightning-AI owner_login: Lightning-AI
owner_html_url: https://github.com/Lightning-AI owner_html_url: https://github.com/Lightning-AI
- name: RVG
html_url: https://github.com/arvin341az-glitch/RVG
stars: 3906
owner_login: arvin341az-glitch
owner_html_url: https://github.com/arvin341az-glitch
- name: fastapi-admin - name: fastapi-admin
html_url: https://github.com/fastapi-admin/fastapi-admin html_url: https://github.com/fastapi-admin/fastapi-admin
stars: 3799 stars: 3819
owner_login: fastapi-admin owner_login: fastapi-admin
owner_html_url: https://github.com/fastapi-admin owner_html_url: https://github.com/fastapi-admin
- name: tracecat - name: tracecat
html_url: https://github.com/TracecatHQ/tracecat html_url: https://github.com/TracecatHQ/tracecat
stars: 3703 stars: 3782
owner_login: TracecatHQ owner_login: TracecatHQ
owner_html_url: https://github.com/TracecatHQ owner_html_url: https://github.com/TracecatHQ
- name: farfalle
html_url: https://github.com/rashadphz/farfalle
stars: 3535
owner_login: rashadphz
owner_html_url: https://github.com/rashadphz
- name: Rapid-MLX - name: Rapid-MLX
html_url: https://github.com/raullenchai/Rapid-MLX html_url: https://github.com/raullenchai/Rapid-MLX
stars: 3155 stars: 3630
owner_login: raullenchai owner_login: raullenchai
owner_html_url: https://github.com/raullenchai owner_html_url: https://github.com/raullenchai
- name: farfalle
html_url: https://github.com/rashadphz/farfalle
stars: 3543
owner_login: rashadphz
owner_html_url: https://github.com/rashadphz
- name: OpenExecutive
html_url: https://github.com/SenteLabsAI/OpenExecutive
stars: 3322
owner_login: SenteLabsAI
owner_html_url: https://github.com/SenteLabsAI
- name: any-auto-register
html_url: https://github.com/lxf746/any-auto-register
stars: 3221
owner_login: lxf746
owner_html_url: https://github.com/lxf746
- name: opyrator - name: opyrator
html_url: https://github.com/ml-tooling/opyrator html_url: https://github.com/ml-tooling/opyrator
stars: 3133 stars: 3131
owner_login: ml-tooling owner_login: ml-tooling
owner_html_url: https://github.com/ml-tooling owner_html_url: https://github.com/ml-tooling
- name: docarray - name: docarray
html_url: https://github.com/docarray/docarray html_url: https://github.com/docarray/docarray
stars: 3121 stars: 3124
owner_login: docarray owner_login: docarray
owner_html_url: https://github.com/docarray owner_html_url: https://github.com/docarray
- name: fastapi-realworld-example-app - name: fastapi-realworld-example-app
html_url: https://github.com/nsidnev/fastapi-realworld-example-app html_url: https://github.com/nsidnev/fastapi-realworld-example-app
stars: 3109 stars: 3107
owner_login: nsidnev owner_login: nsidnev
owner_html_url: https://github.com/nsidnev owner_html_url: https://github.com/nsidnev
- name: uvicorn-gunicorn-fastapi-docker - name: uvicorn-gunicorn-fastapi-docker
html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker
stars: 2914 stars: 2916
owner_login: tiangolo owner_login: tiangolo
owner_html_url: https://github.com/tiangolo owner_html_url: https://github.com/tiangolo
- name: any-auto-register - name: codex-lb
html_url: https://github.com/lxf746/any-auto-register html_url: https://github.com/Soju06/codex-lb
stars: 2832 stars: 2904
owner_login: lxf746 owner_login: Soju06
owner_html_url: https://github.com/lxf746 owner_html_url: https://github.com/Soju06
- name: FastAPI-template - name: FastAPI-template
html_url: https://github.com/s3rius/FastAPI-template html_url: https://github.com/s3rius/FastAPI-template
stars: 2810 stars: 2826
owner_login: s3rius owner_login: s3rius
owner_html_url: https://github.com/s3rius owner_html_url: https://github.com/s3rius
- name: YC-Killer
html_url: https://github.com/sahibzada-allahyar/YC-Killer
stars: 2779
owner_login: sahibzada-allahyar
owner_html_url: https://github.com/sahibzada-allahyar
- name: sqladmin - name: sqladmin
html_url: https://github.com/smithyhq/sqladmin html_url: https://github.com/smithyhq/sqladmin
stars: 2759 stars: 2817
owner_login: smithyhq owner_login: smithyhq
owner_html_url: https://github.com/smithyhq owner_html_url: https://github.com/smithyhq
- name: best-of-web-python - name: YC-Killer
html_url: https://github.com/ml-tooling/best-of-web-python html_url: https://github.com/sahibzada-allahyar/YC-Killer
stars: 2731 stars: 2805
owner_login: ml-tooling owner_login: sahibzada-allahyar
owner_html_url: https://github.com/ml-tooling owner_html_url: https://github.com/sahibzada-allahyar
- name: NoteDiscovery - name: NoteDiscovery
html_url: https://github.com/gamosoft/NoteDiscovery html_url: https://github.com/gamosoft/NoteDiscovery
stars: 2595 stars: 2776
owner_login: gamosoft owner_login: gamosoft
owner_html_url: https://github.com/gamosoft owner_html_url: https://github.com/gamosoft
- name: best-of-web-python
html_url: https://github.com/ml-tooling/best-of-web-python
stars: 2755
owner_login: ml-tooling
owner_html_url: https://github.com/ml-tooling
- name: fastapi-langgraph-agent-production-ready-template
html_url: https://github.com/wassim249/fastapi-langgraph-agent-production-ready-template
stars: 2630
owner_login: wassim249
owner_html_url: https://github.com/wassim249
- name: fastapi-react - name: fastapi-react
html_url: https://github.com/Buuntu/fastapi-react html_url: https://github.com/Buuntu/fastapi-react
stars: 2588 stars: 2584
owner_login: Buuntu owner_login: Buuntu
owner_html_url: https://github.com/Buuntu owner_html_url: https://github.com/Buuntu
- name: supabase-py - name: supabase-py
html_url: https://github.com/supabase/supabase-py html_url: https://github.com/supabase/supabase-py
stars: 2530 stars: 2571
owner_login: supabase owner_login: supabase
owner_html_url: https://github.com/supabase owner_html_url: https://github.com/supabase
- name: fastapi-best-architecture
html_url: https://github.com/fastapi-practices/fastapi-best-architecture
stars: 2530
owner_login: fastapi-practices
owner_html_url: https://github.com/fastapi-practices
- name: 30-Days-of-Python - name: 30-Days-of-Python
html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python
stars: 2483 stars: 2511
owner_login: codingforentrepreneurs owner_login: codingforentrepreneurs
owner_html_url: https://github.com/codingforentrepreneurs owner_html_url: https://github.com/codingforentrepreneurs
- name: RasaGPT
html_url: https://github.com/paulpierre/RasaGPT
stars: 2462
owner_login: paulpierre
owner_html_url: https://github.com/paulpierre
- name: fastapi-langgraph-agent-production-ready-template
html_url: https://github.com/wassim249/fastapi-langgraph-agent-production-ready-template
stars: 2456
owner_login: wassim249
owner_html_url: https://github.com/wassim249
- name: AIstudioProxyAPI - name: AIstudioProxyAPI
html_url: https://github.com/CJackHwang/AIstudioProxyAPI html_url: https://github.com/CJackHwang/AIstudioProxyAPI
stars: 2445 stars: 2496
owner_login: CJackHwang owner_login: CJackHwang
owner_html_url: https://github.com/CJackHwang owner_html_url: https://github.com/CJackHwang
- name: RasaGPT
html_url: https://github.com/paulpierre/RasaGPT
stars: 2463
owner_login: paulpierre
owner_html_url: https://github.com/paulpierre
- name: open-wearables
html_url: https://github.com/the-momentum/open-wearables
stars: 2432
owner_login: the-momentum
owner_html_url: https://github.com/the-momentum
- name: nextpy - name: nextpy
html_url: https://github.com/dot-agent/nextpy html_url: https://github.com/dot-agent/nextpy
stars: 2341 stars: 2349
owner_login: dot-agent owner_login: dot-agent
owner_html_url: https://github.com/dot-agent owner_html_url: https://github.com/dot-agent
- name: langserve - name: langserve
@@ -288,79 +334,64 @@
stars: 2329 stars: 2329
owner_login: langchain-ai owner_login: langchain-ai
owner_html_url: https://github.com/langchain-ai owner_html_url: https://github.com/langchain-ai
- name: fastapi-best-architecture
html_url: https://github.com/fastapi-practices/fastapi-best-architecture
stars: 2318
owner_login: fastapi-practices
owner_html_url: https://github.com/fastapi-practices
- name: fastapi-utils - name: fastapi-utils
html_url: https://github.com/fastapiutils/fastapi-utils html_url: https://github.com/fastapiutils/fastapi-utils
stars: 2308 stars: 2309
owner_login: fastapiutils owner_login: fastapiutils
owner_html_url: https://github.com/fastapiutils owner_html_url: https://github.com/fastapiutils
- name: kiro-gateway
html_url: https://github.com/jwadow/kiro-gateway
stars: 2251
owner_login: jwadow
owner_html_url: https://github.com/jwadow
- name: vue-fastapi-admin - name: vue-fastapi-admin
html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin
stars: 2184 stars: 2245
owner_login: mizhexiaoxiao owner_login: mizhexiaoxiao
owner_html_url: https://github.com/mizhexiaoxiao owner_html_url: https://github.com/mizhexiaoxiao
- name: solara - name: solara
html_url: https://github.com/widgetti/solara html_url: https://github.com/widgetti/solara
stars: 2166 stars: 2172
owner_login: widgetti owner_login: widgetti
owner_html_url: https://github.com/widgetti owner_html_url: https://github.com/widgetti
- name: mangum - name: mangum
html_url: https://github.com/Kludex/mangum html_url: https://github.com/Kludex/mangum
stars: 2125 stars: 2131
owner_login: Kludex owner_login: Kludex
owner_html_url: https://github.com/Kludex owner_html_url: https://github.com/Kludex
- name: codex-lb
html_url: https://github.com/Soju06/codex-lb
stars: 2122
owner_login: Soju06
owner_html_url: https://github.com/Soju06
- name: kiro-gateway
html_url: https://github.com/jwadow/kiro-gateway
stars: 2068
owner_login: jwadow
owner_html_url: https://github.com/jwadow
- name: open-wearables
html_url: https://github.com/the-momentum/open-wearables
stars: 2036
owner_login: the-momentum
owner_html_url: https://github.com/the-momentum
- name: slowapi
html_url: https://github.com/laurentS/slowapi
stars: 2022
owner_login: laurentS
owner_html_url: https://github.com/laurentS
- name: xhs_ai_publisher
html_url: https://github.com/BetaStreetOmnis/xhs_ai_publisher
stars: 2004
owner_login: BetaStreetOmnis
owner_html_url: https://github.com/BetaStreetOmnis
- name: FastAPI-boilerplate - name: FastAPI-boilerplate
html_url: https://github.com/benavlabs/FastAPI-boilerplate html_url: https://github.com/benavlabs/FastAPI-boilerplate
stars: 1984 stars: 2070
owner_login: benavlabs owner_login: benavlabs
owner_html_url: https://github.com/benavlabs owner_html_url: https://github.com/benavlabs
- name: xhs_ai_publisher
html_url: https://github.com/BetaStreetOmnis/xhs_ai_publisher
stars: 2068
owner_login: BetaStreetOmnis
owner_html_url: https://github.com/BetaStreetOmnis
- name: slowapi
html_url: https://github.com/laurentS/slowapi
stars: 2052
owner_login: laurentS
owner_html_url: https://github.com/laurentS
- name: openapi-python-client - name: openapi-python-client
html_url: https://github.com/openapi-generators/openapi-python-client html_url: https://github.com/openapi-generators/openapi-python-client
stars: 1967 stars: 1985
owner_login: openapi-generators owner_login: openapi-generators
owner_html_url: https://github.com/openapi-generators owner_html_url: https://github.com/openapi-generators
- name: agentkit - name: agentkit
html_url: https://github.com/BCG-X-Official/agentkit html_url: https://github.com/BCG-X-Official/agentkit
stars: 1944 stars: 1949
owner_login: BCG-X-Official owner_login: BCG-X-Official
owner_html_url: https://github.com/BCG-X-Official owner_html_url: https://github.com/BCG-X-Official
- name: piccolo - name: piccolo
html_url: https://github.com/piccolo-orm/piccolo html_url: https://github.com/piccolo-orm/piccolo
stars: 1922 stars: 1936
owner_login: piccolo-orm owner_login: piccolo-orm
owner_html_url: https://github.com/piccolo-orm owner_html_url: https://github.com/piccolo-orm
- name: manage-fastapi - name: manage-fastapi
html_url: https://github.com/ycd/manage-fastapi html_url: https://github.com/ycd/manage-fastapi
stars: 1905 stars: 1907
owner_login: ycd owner_login: ycd
owner_html_url: https://github.com/ycd owner_html_url: https://github.com/ycd
- name: fastapi-cache - name: fastapi-cache
@@ -368,128 +399,98 @@
stars: 1866 stars: 1866
owner_login: long2ice owner_login: long2ice
owner_html_url: https://github.com/long2ice owner_html_url: https://github.com/long2ice
- name: WebRPA
html_url: https://github.com/pmh1314520/WebRPA
stars: 1866
owner_login: pmh1314520
owner_html_url: https://github.com/pmh1314520
- name: full-stack-ai-agent-template
html_url: https://github.com/vstorm-co/full-stack-ai-agent-template
stars: 1862
owner_login: vstorm-co
owner_html_url: https://github.com/vstorm-co
- name: creatorhub
html_url: https://github.com/3441293738/creatorhub
stars: 1816
owner_login: '3441293738'
owner_html_url: https://github.com/3441293738
- name: ormar - name: ormar
html_url: https://github.com/ormar-orm/ormar html_url: https://github.com/ormar-orm/ormar
stars: 1806 stars: 1802
owner_login: ormar-orm owner_login: ormar-orm
owner_html_url: https://github.com/ormar-orm owner_html_url: https://github.com/ormar-orm
- name: python-week-2022 - name: python-week-2022
html_url: https://github.com/rochacbruno/python-week-2022 html_url: https://github.com/rochacbruno/python-week-2022
stars: 1806 stars: 1797
owner_login: rochacbruno owner_login: rochacbruno
owner_html_url: https://github.com/rochacbruno owner_html_url: https://github.com/rochacbruno
- name: WebRPA
html_url: https://github.com/pmh1314520/WebRPA
stars: 1781
owner_login: pmh1314520
owner_html_url: https://github.com/pmh1314520
- name: termpair - name: termpair
html_url: https://github.com/cs01/termpair html_url: https://github.com/cs01/termpair
stars: 1735 stars: 1779
owner_login: cs01 owner_login: cs01
owner_html_url: https://github.com/cs01 owner_html_url: https://github.com/cs01
- name: fastapi-crudrouter
html_url: https://github.com/awtkns/fastapi-crudrouter
stars: 1694
owner_login: awtkns
owner_html_url: https://github.com/awtkns
- name: bracket - name: bracket
html_url: https://github.com/evroon/bracket html_url: https://github.com/evroon/bracket
stars: 1694 stars: 1728
owner_login: evroon owner_login: evroon
owner_html_url: https://github.com/evroon owner_html_url: https://github.com/evroon
- name: fastapi-crudrouter
html_url: https://github.com/awtkns/fastapi-crudrouter
stars: 1696
owner_login: awtkns
owner_html_url: https://github.com/awtkns
- name: fastapi-pagination - name: fastapi-pagination
html_url: https://github.com/uriyyo/fastapi-pagination html_url: https://github.com/uriyyo/fastapi-pagination
stars: 1670 stars: 1680
owner_login: uriyyo owner_login: uriyyo
owner_html_url: https://github.com/uriyyo owner_html_url: https://github.com/uriyyo
- name: langchain-serve - name: langchain-serve
html_url: https://github.com/jina-ai/langchain-serve html_url: https://github.com/jina-ai/langchain-serve
stars: 1640 stars: 1641
owner_login: jina-ai owner_login: jina-ai
owner_html_url: https://github.com/jina-ai owner_html_url: https://github.com/jina-ai
- name: awesome-fastapi-projects - name: awesome-fastapi-projects
html_url: https://github.com/Kludex/awesome-fastapi-projects html_url: https://github.com/Kludex/awesome-fastapi-projects
stars: 1608 stars: 1618
owner_login: Kludex owner_login: Kludex
owner_html_url: https://github.com/Kludex owner_html_url: https://github.com/Kludex
- name: docling-api
html_url: https://github.com/drmingler/docling-api
stars: 1597
owner_login: drmingler
owner_html_url: https://github.com/drmingler
- name: fastcrud
html_url: https://github.com/benavlabs/fastcrud
stars: 1577
owner_login: benavlabs
owner_html_url: https://github.com/benavlabs
- name: coronavirus-tracker-api - name: coronavirus-tracker-api
html_url: https://github.com/ExpDev07/coronavirus-tracker-api html_url: https://github.com/ExpDev07/coronavirus-tracker-api
stars: 1568 stars: 1569
owner_login: ExpDev07 owner_login: ExpDev07
owner_html_url: https://github.com/ExpDev07 owner_html_url: https://github.com/ExpDev07
- name: fastapi-amis-admin - name: fastapi-amis-admin
html_url: https://github.com/amisadmin/fastapi-amis-admin html_url: https://github.com/amisadmin/fastapi-amis-admin
stars: 1559 stars: 1566
owner_login: amisadmin owner_login: amisadmin
owner_html_url: https://github.com/amisadmin owner_html_url: https://github.com/amisadmin
- name: fastcrud
html_url: https://github.com/benavlabs/fastcrud
stars: 1531
owner_login: benavlabs
owner_html_url: https://github.com/benavlabs
- name: tavily-key-generator - name: tavily-key-generator
html_url: https://github.com/skernelx/tavily-key-generator html_url: https://github.com/skernelx/tavily-key-generator
stars: 1526 stars: 1553
owner_login: skernelx owner_login: skernelx
owner_html_url: https://github.com/skernelx owner_html_url: https://github.com/skernelx
- name: fastapi-boilerplate
html_url: https://github.com/teamhide/fastapi-boilerplate
stars: 1491
owner_login: teamhide
owner_html_url: https://github.com/teamhide
- name: full-stack-ai-agent-template
html_url: https://github.com/vstorm-co/full-stack-ai-agent-template
stars: 1484
owner_login: vstorm-co
owner_html_url: https://github.com/vstorm-co
- name: prometheus-fastapi-instrumentator
html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator
stars: 1471
owner_login: trallnag
owner_html_url: https://github.com/trallnag
- name: awesome-python-resources
html_url: https://github.com/DjangoEx/awesome-python-resources
stars: 1451
owner_login: DjangoEx
owner_html_url: https://github.com/DjangoEx
- name: aktools
html_url: https://github.com/akfamily/aktools
stars: 1431
owner_login: akfamily
owner_html_url: https://github.com/akfamily
- name: RuoYi-Vue3-FastAPI
html_url: https://github.com/insistence/RuoYi-Vue3-FastAPI
stars: 1419
owner_login: insistence
owner_html_url: https://github.com/insistence
- name: fastapi-tutorial
html_url: https://github.com/liaogx/fastapi-tutorial
stars: 1418
owner_login: liaogx
owner_html_url: https://github.com/liaogx
- name: fastapi-code-generator
html_url: https://github.com/koxudaxi/fastapi-code-generator
stars: 1396
owner_login: koxudaxi
owner_html_url: https://github.com/koxudaxi
- name: yubal - name: yubal
html_url: https://github.com/guillevc/yubal html_url: https://github.com/guillevc/yubal
stars: 1388 stars: 1529
owner_login: guillevc owner_login: guillevc
owner_html_url: https://github.com/guillevc owner_html_url: https://github.com/guillevc
- name: budgetml - name: RuoYi-Vue3-FastAPI
html_url: https://github.com/ebhy/budgetml html_url: https://github.com/insistence/RuoYi-Vue3-FastAPI
stars: 1343 stars: 1516
owner_login: ebhy owner_login: insistence
owner_html_url: https://github.com/ebhy owner_html_url: https://github.com/insistence
- name: Chatterbox-TTS-Server - name: FileSync
html_url: https://github.com/devnen/Chatterbox-TTS-Server html_url: https://github.com/polius/FileSync
stars: 1328 stars: 1494
owner_login: devnen owner_login: polius
owner_html_url: https://github.com/devnen owner_html_url: https://github.com/polius
- name: restish
html_url: https://github.com/rest-sh/restish
stars: 1321
owner_login: rest-sh
owner_html_url: https://github.com/rest-sh
@@ -243,5 +243,5 @@ For example:
To see what exactly you can include in the responses, you can check these sections in the OpenAPI specification: To see what exactly you can include in the responses, you can check these sections in the OpenAPI specification:
* [OpenAPI Responses Object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responses-object), it includes the `Response Object`. * [OpenAPI Responses Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#responses-object), it includes the `Response Object`.
* [OpenAPI Response Object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#response-object), you can include anything from this directly in each response inside your `responses` parameter. Including `description`, `headers`, `content` (inside of this is that you declare different media types and JSON Schemas), and `links`. * [OpenAPI Response Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#response-object), you can include anything from this directly in each response inside your `responses` parameter. Including `description`, `headers`, `content` (inside of this is that you declare different media types and JSON Schemas), and `links`.
+1 -1
View File
@@ -45,7 +45,7 @@ You can run your tests as usual via:
<div class="termy"> <div class="termy">
```console ```console
$ pytest $ uv run pytest
---> 100% ---> 100%
``` ```
+5 -5
View File
@@ -33,7 +33,7 @@ If your **server** is behind a trusted **proxy** and only the proxy talks to it,
<div class="termy"> <div class="termy">
```console ```console
$ fastapi run --forwarded-allow-ips="*" $ uv run 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) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
@@ -170,7 +170,7 @@ To achieve this, you can use the command line option `--root-path` like:
<div class="termy"> <div class="termy">
```console ```console
$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 $ uv run 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) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
@@ -200,7 +200,7 @@ Then, if you start Uvicorn with:
<div class="termy"> <div class="termy">
```console ```console
$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 $ uv run 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) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
@@ -253,7 +253,7 @@ In a case like that (without a stripped path prefix), the proxy would listen on
You can easily run the experiment locally with a stripped path prefix using [Traefik](https://docs.traefik.io/). You can easily run the experiment locally with a stripped path prefix using [Traefik](https://docs.traefik.io/).
[Download Traefik](https://github.com/containous/traefik/releases), it's a single binary, you can extract the compressed file and run it directly from the terminal. [Download Traefik](https://github.com/traefik/traefik/releases), it's a single binary, you can extract the compressed file and run it directly from the terminal.
Then create a file `traefik.toml` with: Then create a file `traefik.toml` with:
@@ -321,7 +321,7 @@ And now start your app, using the `--root-path` option:
<div class="termy"> <div class="termy">
```console ```console
$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 $ uv run 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) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
+2 -2
View File
@@ -6,7 +6,7 @@ But FastAPI also supports using [`dataclasses`](https://docs.python.org/3/librar
{* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *} {* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *}
This is still supported thanks to **Pydantic**, as it has [internal support for `dataclasses`](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel). This is still supported thanks to **Pydantic**, as it has [internal support for `dataclasses`](https://pydantic.dev/docs/validation/latest/concepts/dataclasses/#usage-of-stdlib-dataclasses-with-basemodel).
So, even with the code above that doesn't use Pydantic explicitly, FastAPI is using Pydantic to convert those standard dataclasses to Pydantic's own flavor of dataclasses. So, even with the code above that doesn't use Pydantic explicitly, FastAPI is using Pydantic to convert those standard dataclasses to Pydantic's own flavor of dataclasses.
@@ -88,7 +88,7 @@ Check the in-code annotation tips above to see more specific details.
You can also combine `dataclasses` with other Pydantic models, inherit from them, include them in your own models, etc. You can also combine `dataclasses` with other Pydantic models, inherit from them, include them in your own models, etc.
To learn more, check the [Pydantic docs about dataclasses](https://docs.pydantic.dev/latest/concepts/dataclasses/). To learn more, check the [Pydantic docs about dataclasses](https://pydantic.dev/docs/validation/latest/concepts/dataclasses/).
## Version { #version } ## Version { #version }
+1 -1
View File
@@ -154,7 +154,7 @@ Underneath, in the ASGI technical specification, this is part of the [Lifespan P
/// note /// note
You can read more about the Starlette `lifespan` handlers in [Starlette's Lifespan' docs](https://www.starlette.dev/lifespan/). You can read more about the Starlette `lifespan` handlers in [Starlette's Lifespan' docs](https://starlette.dev/lifespan/).
Including how to handle lifespan state that can be used in other areas of your code. Including how to handle lifespan state that can be used in other areas of your code.
+1 -1
View File
@@ -12,7 +12,7 @@ A versatile option is the [OpenAPI Generator](https://openapi-generator.tech/),
For **TypeScript clients**, [Hey API](https://heyapi.dev/) is a purpose-built solution, providing an optimized experience for the TypeScript ecosystem. For **TypeScript clients**, [Hey API](https://heyapi.dev/) is a purpose-built solution, providing an optimized experience for the TypeScript ecosystem.
You can discover more SDK generators on [OpenAPI.Tools](https://openapi.tools/#sdk). You can discover more SDK generators on [OpenAPI.Tools](https://openapi.tools/categories/sdk-generators).
/// tip /// tip
+2 -2
View File
@@ -91,7 +91,7 @@ There are many other ASGI middlewares.
For example: For example:
* [Uvicorn's `ProxyHeadersMiddleware`](https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py) * [Uvicorn's `ProxyHeadersMiddleware`](https://github.com/Kludex/uvicorn/blob/main/uvicorn/middleware/proxy_headers.py)
* [MessagePack](https://github.com/florimondmanca/msgpack-asgi) * [MessagePack](https://github.com/florimondmanca/msgpack-asgi)
To see other available middlewares check [Starlette's Middleware docs](https://www.starlette.dev/middleware/) and the [ASGI Awesome List](https://github.com/florimondmanca/awesome-asgi). To see other available middlewares check [Starlette's Middleware docs](https://starlette.dev/middleware/) and the [ASGI Awesome List](https://github.com/florimondmanca/awesome-asgi).
+3 -3
View File
@@ -35,7 +35,7 @@ This part is pretty normal, most of the code is probably already familiar to you
/// tip /// tip
The `callback_url` query parameter uses a Pydantic [Url](https://docs.pydantic.dev/latest/api/networks/) type. The `callback_url` query parameter uses a Pydantic [Url](https://pydantic.dev/docs/validation/latest/api/pydantic/networks/) type.
/// ///
@@ -106,11 +106,11 @@ It should look just like a normal FastAPI *path operation*:
There are 2 main differences from a normal *path operation*: There are 2 main differences from a normal *path operation*:
* It doesn't need to have any actual code, because your app will never call this code. It's only used to document the *external API*. So, the function could just have `pass`. * It doesn't need to have any actual code, because your app will never call this code. It's only used to document the *external API*. So, the function could just have `pass`.
* The *path* can contain an [OpenAPI 3 expression](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) (see more below) where it can use variables with parameters and parts of the original request sent to *your API*. * The *path* can contain an [OpenAPI 3 expression](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#key-expression) (see more below) where it can use variables with parameters and parts of the original request sent to *your API*.
### The callback path expression { #the-callback-path-expression } ### The callback path expression { #the-callback-path-expression }
The callback *path* can have an [OpenAPI 3 expression](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) that can contain parts of the original request sent to *your API*. The callback *path* can have an [OpenAPI 3 expression](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#key-expression) that can contain parts of the original request sent to *your API*.
In this case, it's the `str`: In this case, it's the `str`:
+1 -1
View File
@@ -48,4 +48,4 @@ And as the `Response` can be used frequently to set headers and cookies, **FastA
/// ///
To see all the available parameters and options, check the [documentation in Starlette](https://www.starlette.dev/responses/#set-cookie). To see all the available parameters and options, check the [documentation in Starlette](https://starlette.dev/responses/#set-cookie).
+1 -1
View File
@@ -38,4 +38,4 @@ And as the `Response` can be used frequently to set headers and cookies, **FastA
Keep in mind that custom proprietary headers can be added [using the `X-` prefix](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). Keep in mind that custom proprietary headers can be added [using the `X-` prefix](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers).
But if you have custom headers that you want a client in a browser to be able to see, you need to add them to your CORS configurations (read more in [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)), using the parameter `expose_headers` documented in [Starlette's CORS docs](https://www.starlette.dev/middleware/#corsmiddleware). But if you have custom headers that you want a client in a browser to be able to see, you need to add them to your CORS configurations (read more in [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)), using the parameter `expose_headers` documented in [Starlette's CORS docs](https://starlette.dev/middleware/#corsmiddleware).
+34 -10
View File
@@ -6,9 +6,13 @@ Most of these settings are variable (can change), like database URLs. And many c
For this reason it's common to provide them in environment variables that are read by the application. For this reason it's common to provide them in environment variables that are read by the application.
An **environment variable** (also known as an **env var**) is a value that lives outside of the Python code, in the operating system, and can be read by your application and other programs.
You can create an environment variable for a command when you run it. You will see the platform-specific commands below.
/// tip /// tip
To understand environment variables you can read [Environment Variables](../environment-variables.md). Read the [Environment Variables guide](https://tiangolo.com/guides/environment-variables/) for a detailed explanation of how environment variables work.
/// ///
@@ -20,16 +24,16 @@ That means that any value read in Python from an environment variable will be a
## Pydantic `Settings` { #pydantic-settings } ## Pydantic `Settings` { #pydantic-settings }
Fortunately, Pydantic provides a great utility to handle these settings coming from environment variables with [Pydantic: Settings management](https://docs.pydantic.dev/latest/concepts/pydantic_settings/). Fortunately, Pydantic provides a great utility to handle these settings coming from environment variables with [Pydantic: Settings management](https://pydantic.dev/docs/validation/latest/concepts/pydantic_settings/).
### Install `pydantic-settings` { #install-pydantic-settings } ### Install `pydantic-settings` { #install-pydantic-settings }
First, make sure you create your [virtual environment](../virtual-environments.md), activate it, and then install the `pydantic-settings` package: Add the `pydantic-settings` package to your project:
<div class="termy"> <div class="termy">
```console ```console
$ pip install pydantic-settings $ uv add pydantic-settings
---> 100% ---> 100%
``` ```
@@ -40,7 +44,7 @@ It also comes included when you install the `all` extras with:
<div class="termy"> <div class="termy">
```console ```console
$ pip install "fastapi[all]" $ uv add "fastapi[all]"
---> 100% ---> 100%
``` ```
@@ -76,19 +80,39 @@ Then you can use the new `settings` object in your application:
Next, you would run the server passing the configurations as environment variables, for example you could set an `ADMIN_EMAIL` and `APP_NAME` with: Next, you would run the server passing the configurations as environment variables, for example you could set an `ADMIN_EMAIL` and `APP_NAME` with:
//// tab | Linux, macOS, Windows Bash
<div class="termy"> <div class="termy">
```console ```console
$ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.py $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" uv run fastapi run main.py
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
</div> </div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ $Env:ADMIN_EMAIL = "deadpool@example.com"
$ $Env:APP_NAME = "ChimichangApp"
$ uv run 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 /// tip
To set multiple env vars for a single command just separate them with a space, and put them all before the command. In Bash, to set multiple env vars for a single command, separate them with a space and put them all before the command.
/// ///
@@ -172,11 +196,11 @@ But a dotenv file doesn't really have to have that exact filename.
/// ///
Pydantic has support for reading from these types of files using an external library. You can read more at [Pydantic Settings: Dotenv (.env) support](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support). Pydantic has support for reading from these types of files using an external library. You can read more at [Pydantic Settings: Dotenv (.env) support](https://pydantic.dev/docs/validation/latest/concepts/pydantic_settings/#dotenv-env-support).
/// tip /// tip
For this to work, you need to `pip install python-dotenv`. For this to work, add `python-dotenv` to your project with `uv add python-dotenv`.
/// ///
@@ -197,7 +221,7 @@ And then update your `config.py` with:
/// tip /// tip
The `model_config` attribute is used just for Pydantic configuration. You can read more at [Pydantic: Concepts: Configuration](https://docs.pydantic.dev/latest/concepts/config/). The `model_config` attribute is used just for Pydantic configuration. You can read more at [Pydantic: Concepts: Configuration](https://pydantic.dev/docs/validation/latest/concepts/config/).
/// ///
+1 -1
View File
@@ -35,7 +35,7 @@ Now, run the `fastapi` command:
<div class="termy"> <div class="termy">
```console ```console
$ fastapi dev $ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
+3 -3
View File
@@ -8,12 +8,12 @@ There are utilities to configure it easily that you can use directly in your **F
## Install dependencies { #install-dependencies } ## Install dependencies { #install-dependencies }
Make sure you create a [virtual environment](../virtual-environments.md), activate it, and install `jinja2`: Add `jinja2` to your project:
<div class="termy"> <div class="termy">
```console ```console
$ pip install jinja2 $ uv add jinja2
---> 100% ---> 100%
``` ```
@@ -123,4 +123,4 @@ And because you are using `StaticFiles`, that CSS file would be served automatic
## More details { #more-details } ## More details { #more-details }
For more details, including how to test templates, check [Starlette's docs on templates](https://www.starlette.dev/templates/). For more details, including how to test templates, check [Starlette's docs on templates](https://starlette.dev/templates/).
+1 -1
View File
@@ -5,7 +5,7 @@ When you need `lifespan` to run in your tests, you can use the `TestClient` with
{* ../../docs_src/app_testing/tutorial004_py310.py hl[9:15,18,27:28,30:32,41:43] *} {* ../../docs_src/app_testing/tutorial004_py310.py hl[9:15,18,27:28,30:32,41:43] *}
You can read more details about the ["Running lifespan in tests in the official Starlette documentation site."](https://www.starlette.dev/lifespan/#running-lifespan-in-tests) You can read more details about the ["Running lifespan in tests in the official Starlette documentation site."](https://starlette.dev/lifespan/#running-lifespan-in-tests)
For the deprecated `startup` and `shutdown` events, you can use the `TestClient` as follows: For the deprecated `startup` and `shutdown` events, you can use the `TestClient` as follows:
+1 -1
View File
@@ -8,6 +8,6 @@ For this, you use the `TestClient` in a `with` statement, connecting to the WebS
/// note /// note
For more details, check Starlette's documentation for [testing WebSockets](https://www.starlette.dev/testclient/#testing-websocket-sessions). For more details, check Starlette's documentation for [testing WebSockets](https://starlette.dev/testclient/#testing-websocket-sessions).
/// ///
@@ -15,7 +15,7 @@ But there are situations where you might need to access the `Request` object dir
## Details about the `Request` object { #details-about-the-request-object } ## Details about the `Request` object { #details-about-the-request-object }
As **FastAPI** is actually **Starlette** underneath, with a layer of several tools on top, you can use Starlette's [`Request`](https://www.starlette.dev/requests/) object directly when you need to. As **FastAPI** is actually **Starlette** underneath, with a layer of several tools on top, you can use Starlette's [`Request`](https://starlette.dev/requests/) object directly when you need to.
It would also mean that if you get data from the `Request` object directly (for example, read the body) it won't be validated, converted or documented (with OpenAPI, for the automatic API user interface) by FastAPI. It would also mean that if you get data from the `Request` object directly (for example, read the body) it won't be validated, converted or documented (with OpenAPI, for the automatic API user interface) by FastAPI.
@@ -45,7 +45,7 @@ The same way, you can declare any other parameter as normally, and additionally,
## `Request` documentation { #request-documentation } ## `Request` documentation { #request-documentation }
You can read more details about the [`Request` object in the official Starlette documentation site](https://www.starlette.dev/requests/). You can read more details about the [`Request` object in the official Starlette documentation site](https://starlette.dev/requests/).
/// note | Technical Details /// note | Technical Details
+6 -6
View File
@@ -4,12 +4,12 @@ You can use [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSoc
## Install `websockets` { #install-websockets } ## Install `websockets` { #install-websockets }
Make sure you create a [virtual environment](../virtual-environments.md), activate it, and install `websockets` (a Python library that makes it easy to use the "WebSocket" protocol): Add `websockets` (a Python library that makes it easy to use the "WebSocket" protocol) to your project:
<div class="termy"> <div class="termy">
```console ```console
$ pip install websockets $ uv add websockets
---> 100% ---> 100%
``` ```
@@ -69,7 +69,7 @@ Put your code in a file `main.py` and then run your application:
<div class="termy"> <div class="termy">
```console ```console
$ fastapi dev $ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
@@ -126,7 +126,7 @@ Run your application:
<div class="termy"> <div class="termy">
```console ```console
$ fastapi dev $ uv run fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
@@ -182,5 +182,5 @@ If you need something easy to integrate with FastAPI but that is more robust, su
To learn more about the options, check Starlette's documentation for: To learn more about the options, check Starlette's documentation for:
* [The `WebSocket` class](https://www.starlette.dev/websockets/). * [The `WebSocket` class](https://starlette.dev/websockets/).
* [Class-based WebSocket handling](https://www.starlette.dev/endpoints/#websocketendpoint). * [Class-based WebSocket handling](https://starlette.dev/endpoints/#websocketendpoint).
+1 -1
View File
@@ -8,7 +8,7 @@ For that, you can use the `WSGIMiddleware` and use it to wrap your WSGI applicat
/// note /// note
This requires installing `a2wsgi` for example with `pip install a2wsgi`. This requires adding `a2wsgi` to your project, for example with `uv add a2wsgi`.
/// ///
+6 -6
View File
@@ -125,7 +125,7 @@ Adopt and use an open standard for API specifications, instead of a custom schem
And integrate standards-based user interface tools: And integrate standards-based user interface tools:
* [Swagger UI](https://github.com/swagger-api/swagger-ui) * [Swagger UI](https://github.com/swagger-api/swagger-ui)
* [ReDoc](https://github.com/Rebilly/ReDoc) * [ReDoc](https://github.com/Redocly/redoc)
These two were chosen for being fairly popular and stable, but doing a quick search, you could find dozens of alternative user interfaces for OpenAPI (that you can use with **FastAPI**). These two were chosen for being fairly popular and stable, but doing a quick search, you could find dozens of alternative user interfaces for OpenAPI (that you can use with **FastAPI**).
@@ -237,7 +237,7 @@ Generate the OpenAPI schema automatically, from the same code that defines seria
/// ///
### [NestJS](https://nestjs.com/) (and [Angular](https://angular.io/)) { #nestjs-and-angular } ### [NestJS](https://nestjs.com/) (and [Angular](https://angular.dev/)) { #nestjs-and-angular }
This isn't even Python, NestJS is a JavaScript (TypeScript) NodeJS framework inspired by Angular. This isn't even Python, NestJS is a JavaScript (TypeScript) NodeJS framework inspired by Angular.
@@ -337,7 +337,7 @@ As it is based on the previous standard for synchronous Python web frameworks (W
/// note /// note
Hug was created by Timothy Crosley, the same creator of [`isort`](https://github.com/timothycrosley/isort), a great tool to automatically sort imports in Python files. Hug was created by Timothy Crosley, the same creator of [`isort`](https://github.com/PyCQA/isort), a great tool to automatically sort imports in Python files.
/// ///
@@ -401,7 +401,7 @@ I consider **FastAPI** a "spiritual successor" to APIStar, while improving and i
## Used by **FastAPI** { #used-by-fastapi } ## Used by **FastAPI** { #used-by-fastapi }
### [Pydantic](https://docs.pydantic.dev/) { #pydantic } ### [Pydantic](https://pydantic.dev/docs/) { #pydantic }
Pydantic is a library to define data validation, serialization and documentation (using JSON Schema) based on Python type hints. Pydantic is a library to define data validation, serialization and documentation (using JSON Schema) based on Python type hints.
@@ -417,7 +417,7 @@ Handle all the data validation, data serialization and automatic model documenta
/// ///
### [Starlette](https://www.starlette.dev/) { #starlette } ### [Starlette](https://starlette.dev/) { #starlette }
Starlette is a lightweight <dfn title="The new standard for building asynchronous Python web applications">ASGI</dfn> framework/toolkit, which is ideal for building high-performance asyncio services. Starlette is a lightweight <dfn title="The new standard for building asynchronous Python web applications">ASGI</dfn> framework/toolkit, which is ideal for building high-performance asyncio services.
@@ -462,7 +462,7 @@ So, anything that you can do with Starlette, you can do it directly with **FastA
/// ///
### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn } ### [Uvicorn](https://uvicorn.dev) { #uvicorn }
Uvicorn is a lightning-fast ASGI server, built on uvloop and httptools. Uvicorn is a lightning-fast ASGI server, built on uvloop and httptools.
+99
View File
@@ -437,6 +437,105 @@ Inspired by Termynal's CSS tricks with modifications
.fastapi-sponsors__card--silver .fastapi-sponsors__banner { height: 50px; } .fastapi-sponsors__card--silver .fastapi-sponsors__banner { height: 50px; }
} }
.fastapi-conf-rail {
display: block;
margin: 1.25rem 0.5rem 0;
padding: 0.9rem 0.85rem 0.85rem;
border: 1px solid var(--md-default-fg-color--lightest);
border-left: 3px solid var(--md-primary-fg-color);
border-radius: 0.2rem;
background: color-mix(in srgb, var(--md-primary-fg-color) 6%, transparent);
color: var(--md-default-fg-color);
text-decoration: none;
transition: border-color 0.15s ease, background-color 0.15s ease, transform 0.15s ease;
}
.fastapi-conf-rail__eyebrow {
display: block;
font-size: 0.56rem;
font-weight: 700;
letter-spacing: 0.11em;
text-transform: uppercase;
color: var(--md-primary-fg-color);
}
.fastapi-conf-rail__date {
display: block;
margin-top: 0.45rem;
font-size: 0.74rem;
font-weight: 700;
line-height: 1.25;
}
.fastapi-conf-rail__place {
display: block;
margin-top: 0.1rem;
font-size: 0.68rem;
line-height: 1.3;
color: var(--md-default-fg-color--light);
}
.fastapi-conf-rail__summary {
display: block;
margin-top: 0.55rem;
font-size: 0.67rem;
line-height: 1.5;
color: var(--md-default-fg-color--light);
}
.fastapi-conf-rail__cta {
display: block;
margin-top: 0.65rem;
font-size: 0.68rem;
font-weight: 700;
color: var(--md-primary-fg-color);
}
.fastapi-conf-rail:hover {
border-color: var(--md-primary-fg-color);
background: color-mix(in srgb, var(--md-primary-fg-color) 10%, transparent);
}
.fastapi-conf-rail:hover .fastapi-conf-rail__cta,
.fastapi-conf-rail:focus-visible .fastapi-conf-rail__cta {
color: var(--md-accent-fg-color);
text-decoration: underline;
}
.fastapi-conf-rail:focus-visible {
outline: 2px solid var(--md-accent-fg-color);
outline-offset: 2px;
}
.fastapi-conf-rail--mobile {
display: none;
}
@media screen and (max-width: 76.234375em) {
.fastapi-conf-rail:not(.fastapi-conf-rail--mobile) {
display: none;
}
.md-typeset .fastapi-conf-rail--mobile {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
margin: 0 0 1.25rem;
text-decoration: none;
}
.fastapi-conf-rail--mobile .fastapi-conf-rail__summary {
display: none;
}
.fastapi-conf-rail--mobile .fastapi-conf-rail__cta {
grid-column: 2;
grid-row: 1 / 4;
align-self: center;
margin: 0 0 0 0.8rem;
white-space: nowrap;
}
}
.fastapi-feature-banner { .fastapi-feature-banner {
display: block; display: block;
max-width: 680px; max-width: 680px;
+10 -1
View File
@@ -55,10 +55,19 @@
text-align: center; text-align: center;
} }
a[data-terminal-control] { button[data-terminal-control] {
cursor: pointer;
text-align: right; text-align: right;
display: block; display: block;
width: 100%;
color: #aebbff; color: #aebbff;
border: 0;
background: transparent;
font: inherit;
}
button[data-terminal-control]:hover {
color: var(--color-text);
} }
[data-ty] { [data-ty] {
+15 -19
View File
@@ -105,36 +105,32 @@ This is what you would want to do in **most cases**, for example:
### Package Requirements { #package-requirements } ### Package Requirements { #package-requirements }
You would normally have the **package requirements** for your application in some file. When you manage your project with `uv`, its direct dependencies are declared in `pyproject.toml` and the exact resolved versions are stored in `uv.lock`.
It would depend mainly on the tool you use to **install** those requirements. You can add the packages your application needs with:
The most common way to do it is to have a file `requirements.txt` with the package names and their versions, one per line.
You would of course use the same ideas you read in [About FastAPI versions](versions.md) to set the ranges of versions.
For example, your `requirements.txt` could look like:
```
fastapi[standard]>=0.113.0,<0.114.0
pydantic>=2.7.0,<3.0.0
```
And you would normally install those package dependencies with `pip`, for example:
<div class="termy"> <div class="termy">
```console ```console
$ pip install -r requirements.txt $ uv add "fastapi[standard]" pydantic
---> 100% ---> 100%
Successfully installed fastapi pydantic
``` ```
</div> </div>
/// note /// note
There are other formats and tools to define and install package dependencies. The Dockerfile below uses `pip` inside the container. You can export the locked dependencies from your uv project to the `requirements.txt` format it expects:
<div class="termy">
```console
$ uv export --format requirements-txt --no-dev --no-emit-project --output-file requirements.txt
```
</div>
The generated `requirements.txt` is an export for the container build. Continue managing dependencies with `uv add` and regenerate it when `uv.lock` changes.
/// ///
@@ -372,7 +368,7 @@ You will see the automatic interactive API documentation (provided by [Swagger U
And you can also go to [http://192.168.99.100/redoc](http://192.168.99.100/redoc) or [http://127.0.0.1/redoc](http://127.0.0.1/redoc) (or equivalent, using your Docker host). And you can also go to [http://192.168.99.100/redoc](http://192.168.99.100/redoc) or [http://127.0.0.1/redoc](http://127.0.0.1/redoc) (or equivalent, using your Docker host).
You will see the alternative automatic documentation (provided by [ReDoc](https://github.com/Rebilly/ReDoc)): You will see the alternative automatic documentation (provided by [ReDoc](https://github.com/Redocly/redoc)):
![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
+1 -1
View File
@@ -5,7 +5,7 @@ You can deploy your FastAPI app to [FastAPI Cloud](https://fastapicloud.com) wit
<div class="termy"> <div class="termy">
```console ```console
$ fastapi deploy $ uv run fastapi deploy
Deploying to FastAPI Cloud... Deploying to FastAPI Cloud...
+5 -5
View File
@@ -52,7 +52,7 @@ The main thing you need to run a **FastAPI** application (or any other ASGI appl
There are several alternatives, including: There are several alternatives, including:
* [Uvicorn](https://www.uvicorn.dev/): a high performance ASGI server. * [Uvicorn](https://uvicorn.dev): a high performance ASGI server.
* [Hypercorn](https://hypercorn.readthedocs.io/): an ASGI server compatible with HTTP/2 and Trio among other features. * [Hypercorn](https://hypercorn.readthedocs.io/): an ASGI server compatible with HTTP/2 and Trio among other features.
* [Daphne](https://github.com/django/daphne): the ASGI server built for Django Channels. * [Daphne](https://github.com/django/daphne): the ASGI server built for Django Channels.
* [Granian](https://github.com/emmett-framework/granian): A Rust HTTP server for Python applications. * [Granian](https://github.com/emmett-framework/granian): A Rust HTTP server for Python applications.
@@ -73,14 +73,14 @@ When you install FastAPI, it comes with a production server, Uvicorn, and you ca
But you can also install an ASGI server manually. But you can also install an ASGI server manually.
Make sure you create a [virtual environment](../virtual-environments.md), activate it, and then you can install the server application. Add the server application to your project.
For example, to install Uvicorn: For example, to install Uvicorn:
<div class="termy"> <div class="termy">
```console ```console
$ pip install "uvicorn[standard]" $ uv add "uvicorn[standard]"
---> 100% ---> 100%
``` ```
@@ -95,7 +95,7 @@ By adding the `standard`, Uvicorn will install and use some recommended extra de
That includes `uvloop`, the high-performance drop-in replacement for `asyncio`, that provides the big concurrency performance boost. That includes `uvloop`, the high-performance drop-in replacement for `asyncio`, that provides the big concurrency performance boost.
When you install FastAPI with something like `pip install "fastapi[standard]"` you already get `uvicorn[standard]` as well. When you add FastAPI with something like `uv add "fastapi[standard]"` you already get `uvicorn[standard]` as well.
/// ///
@@ -106,7 +106,7 @@ If you installed an ASGI server manually, you would normally need to pass an imp
<div class="termy"> <div class="termy">
```console ```console
$ uvicorn main:app --host 0.0.0.0 --port 80 $ uv run uvicorn main:app --host 0.0.0.0 --port 80
<span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
``` ```
+1 -1
View File
@@ -86,7 +86,7 @@ If you prefer to use the `uvicorn` command directly:
<div class="termy"> <div class="termy">
```console ```console
$ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4 $ uv run uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
<font color="#A6E22E">INFO</font>: Uvicorn running on <b>http://0.0.0.0:8080</b> (Press CTRL+C to quit) <font color="#A6E22E">INFO</font>: Uvicorn running on <b>http://0.0.0.0:8080</b> (Press CTRL+C to quit)
<font color="#A6E22E">INFO</font>: Started parent process [<font color="#A1EFE4"><b>27365</b></font>] <font color="#A6E22E">INFO</font>: Started parent process [<font color="#A1EFE4"><b>27365</b></font>]
<font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27368</font>] <font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27368</font>]
+5 -292
View File
@@ -1,298 +1,11 @@
# Environment Variables { #environment-variables } # Environment Variables { #environment-variables }
/// tip An **environment variable** (also known as an **env var**) is a value that lives outside of your Python code, in the operating system, and can be read by your application and other programs.
If you already know what "environment variables" are and how to use them, feel free to skip this. FastAPI applications commonly use environment variables for configuration such as database URLs, email credentials, and secret keys.
/// You will learn how to use them for application configuration in [Settings and Environment Variables](advanced/settings.md).
An environment variable (also known as "**env var**") is a variable that lives **outside** of the Python code, in the **operating system**, and could be read by your Python code (or by other programs as well). ## Learn More { #learn-more }
Environment variables could be useful for handling application **settings**, as part of the **installation** of Python, etc. Read the [Environment Variables guide](https://tiangolo.com/guides/environment-variables/) for a detailed, cross-platform explanation, including how to create and read environment variables and how the `PATH` environment variable works.
## Create and Use Env Vars { #create-and-use-env-vars }
You can **create** and use environment variables in the **shell (terminal)**, without needing Python:
//// tab | Linux, macOS, Windows Bash
<div class="termy">
```console
// You could create an env var MY_NAME with
$ export MY_NAME="Wade Wilson"
// Then you could use it with other programs, like
$ echo "Hello $MY_NAME"
Hello Wade Wilson
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
// Create an env var MY_NAME
$ $Env:MY_NAME = "Wade Wilson"
// Use it with other programs, like
$ echo "Hello $Env:MY_NAME"
Hello Wade Wilson
```
</div>
////
## Read env vars in Python { #read-env-vars-in-python }
You could also create environment variables **outside** of Python, in the terminal (or with any other method), and then **read them in Python**.
For example you could have a file `main.py` with:
```Python hl_lines="3"
import os
name = os.getenv("MY_NAME", "World")
print(f"Hello {name} from Python")
```
/// tip
The second argument to [`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) is the default value to return.
If not provided, it's `None` by default, here we provide `"World"` as the default value to use.
///
Then you could call that Python program:
//// tab | Linux, macOS, Windows Bash
<div class="termy">
```console
// Here we don't set the env var yet
$ python main.py
// As we didn't set the env var, we get the default value
Hello World from Python
// But if we create an environment variable first
$ export MY_NAME="Wade Wilson"
// And then call the program again
$ python main.py
// Now it can read the environment variable
Hello Wade Wilson from Python
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
// Here we don't set the env var yet
$ python main.py
// As we didn't set the env var, we get the default value
Hello World from Python
// But if we create an environment variable first
$ $Env:MY_NAME = "Wade Wilson"
// And then call the program again
$ python main.py
// Now it can read the environment variable
Hello Wade Wilson from Python
```
</div>
////
As environment variables can be set outside of the code, but can be read by the code, and don't have to be stored (committed to `git`) with the rest of the files, it's common to use them for configurations or **settings**.
You can also create an environment variable only for a **specific program invocation**, that is only available to that program, and only for its duration.
To do that, create it right before the program itself, on the same line:
<div class="termy">
```console
// Create an env var MY_NAME in line for this program call
$ MY_NAME="Wade Wilson" python main.py
// Now it can read the environment variable
Hello Wade Wilson from Python
// The env var no longer exists afterwards
$ python main.py
Hello World from Python
```
</div>
/// tip
You can read more about it at [The Twelve-Factor App: Config](https://12factor.net/config).
///
## Types and Validation { #types-and-validation }
These environment variables can only handle **text strings**, as they are external to Python and have to be compatible with other programs and the rest of the system (and even with different operating systems, such as Linux, Windows, and macOS).
That means that **any value** read in Python from an environment variable **will be a `str`**, and any conversion to a different type or any validation has to be done in code.
You will learn more about using environment variables for handling **application settings** in the [Advanced User Guide - Settings and Environment Variables](./advanced/settings.md).
## `PATH` Environment Variable { #path-environment-variable }
There is a **special** environment variable called **`PATH`** that is used by the operating systems (Linux, macOS, Windows) to find programs to run.
The value of the variable `PATH` is a long string that is made of directories separated by a colon `:` on Linux and macOS, and by a semicolon `;` on Windows.
For example, the `PATH` environment variable could look like this:
//// tab | Linux, macOS
```plaintext
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```
This means that the system should look for programs in the directories:
* `/usr/local/bin`
* `/usr/bin`
* `/bin`
* `/usr/sbin`
* `/sbin`
////
//// tab | Windows
```plaintext
C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32
```
This means that the system should look for programs in the directories:
* `C:\Program Files\Python312\Scripts`
* `C:\Program Files\Python312`
* `C:\Windows\System32`
////
When you type a **command** in the terminal, the operating system **looks for** the program in **each of those directories** listed in the `PATH` environment variable.
For example, when you type `python` in the terminal, the operating system looks for a program called `python` in the **first directory** in that list.
If it finds it, then it will **use it**. Otherwise it keeps looking in the **other directories**.
### Installing Python and Updating the `PATH` { #installing-python-and-updating-the-path }
When you install Python, you might be asked if you want to update the `PATH` environment variable.
//// tab | Linux, macOS
Let's say you install Python and it ends up in a directory `/opt/custompython/bin`.
If you say yes to update the `PATH` environment variable, then the installer will add `/opt/custompython/bin` to the `PATH` environment variable.
It could look like this:
```plaintext
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin
```
This way, when you type `python` in the terminal, the system will find the Python program in `/opt/custompython/bin` (the last directory) and use that one.
////
//// tab | Windows
Let's say you install Python and it ends up in a directory `C:\opt\custompython\bin`.
If you say yes to update the `PATH` environment variable, then the installer will add `C:\opt\custompython\bin` to the `PATH` environment variable.
```plaintext
C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32;C:\opt\custompython\bin
```
This way, when you type `python` in the terminal, the system will find the Python program in `C:\opt\custompython\bin` (the last directory) and use that one.
////
So, if you type:
<div class="termy">
```console
$ python
```
</div>
//// tab | Linux, macOS
The system will **find** the `python` program in `/opt/custompython/bin` and run it.
It would be roughly equivalent to typing:
<div class="termy">
```console
$ /opt/custompython/bin/python
```
</div>
////
//// tab | Windows
The system will **find** the `python` program in `C:\opt\custompython\bin\python` and run it.
It would be roughly equivalent to typing:
<div class="termy">
```console
$ C:\opt\custompython\bin\python
```
</div>
////
This information will be useful when learning about [Virtual Environments](virtual-environments.md).
## Conclusion { #conclusion }
With this you should have a basic understanding of what **environment variables** are and how to use them in Python.
You can also read more about them in the [Wikipedia for Environment Variable](https://en.wikipedia.org/wiki/Environment_variable).
In many cases it's not very obvious how environment variables would be useful and applicable right away. But they keep showing up in many different scenarios when you are developing, so it's good to know about them.
For example, you will need this information in the next section, about [Virtual Environments](virtual-environments.md).
+1 -1
View File
@@ -23,7 +23,7 @@ But now that FastAPI is the backend framework with the most GitHub stars across
Most starred [GitHub repositories with the topic `fastapi`](https://github.com/topics/fastapi): Most starred [GitHub repositories with the topic `fastapi`](https://github.com/topics/fastapi):
{% for repo in topic_repos %} {% for repo in topic_repos.repos %}
<a href={{repo.html_url}} target="_blank">★ {{repo.stars}} - {{repo.name}}</a> by <a href={{repo.owner_html_url}} target="_blank">@{{repo.owner_login}}</a>. <a href={{repo.html_url}} target="_blank">★ {{repo.stars}} - {{repo.name}}</a> by <a href={{repo.owner_html_url}} target="_blank">@{{repo.owner_login}}</a>.
+8 -4
View File
@@ -2,7 +2,7 @@
**FastAPI <abbr title="command line interface">CLI</abbr>** is a command line program that you can use to serve your FastAPI app, manage your FastAPI project, and more. **FastAPI <abbr title="command line interface">CLI</abbr>** is a command line program that you can use to serve your FastAPI app, manage your FastAPI project, and more.
When you install FastAPI (e.g. with `pip install "fastapi[standard]"`), it comes with a command line program you can run in the terminal. When you add FastAPI to your project (e.g. with `uv add "fastapi[standard]"`), it comes with a command line program you can run in the terminal.
To run your FastAPI app for development, you can use the `fastapi dev` command: To run your FastAPI app for development, you can use the `fastapi dev` command:
@@ -52,7 +52,7 @@ For production you would use `fastapi run` instead of `fastapi dev`. 🚀
/// ///
Internally, **FastAPI CLI** uses [Uvicorn](https://www.uvicorn.dev), a high-performance, production-ready, ASGI server. 😎 Internally, **FastAPI CLI** uses [Uvicorn](https://uvicorn.dev), a high-performance, production-ready, ASGI server. 😎
The `fastapi` CLI will try to detect automatically the FastAPI app to run, assuming it's an object called `app` in a file `main.py` (or a couple other variants). The `fastapi` CLI will try to detect automatically the FastAPI app to run, assuming it's an object called `app` in a file `main.py` (or a couple other variants).
@@ -100,13 +100,13 @@ from backend.main import app
You can also pass the file path to the `fastapi dev` command, and it will guess the FastAPI app object to use: You can also pass the file path to the `fastapi dev` command, and it will guess the FastAPI app object to use:
```console ```console
$ fastapi dev main.py $ uv run fastapi dev main.py
``` ```
Or, you can also pass the `--entrypoint` option to the `fastapi dev` command: Or, you can also pass the `--entrypoint` option to the `fastapi dev` command:
```console ```console
$ fastapi dev --entrypoint main:app $ uv run fastapi dev --entrypoint main:app
``` ```
But you would have to remember to pass the correct path\entrypoint every time you call the `fastapi` command. But you would have to remember to pass the correct path\entrypoint every time you call the `fastapi` command.
@@ -119,6 +119,10 @@ Running `fastapi dev` initiates development mode.
By default, **auto-reload** is enabled, automatically reloading the server when you make changes to your code. This is resource-intensive and could be less stable than when it's disabled. You should only use it for development. It also listens on the IP address `127.0.0.1`, which is the IP for your machine to communicate with itself alone (`localhost`). By default, **auto-reload** is enabled, automatically reloading the server when you make changes to your code. This is resource-intensive and could be less stable than when it's disabled. You should only use it for development. It also listens on the IP address `127.0.0.1`, which is the IP for your machine to communicate with itself alone (`localhost`).
Before importing your app, `fastapi dev` sets the `FASTAPI_ENV` environment variable to `development`. If `FASTAPI_ENV` is already set, its existing value is preserved. This lets app startup code choose development-friendly behavior while allowing you to provide an app-specific environment such as `staging`.
The conventional `FASTAPI_ENV` values are `development` and `production`. `fastapi run` currently leaves `FASTAPI_ENV` unchanged, so set it explicitly if your app needs to detect production mode.
## `fastapi run` { #fastapi-run } ## `fastapi run` { #fastapi-run }
Executing `fastapi run` starts FastAPI in production mode. Executing `fastapi run` starts FastAPI in production mode.
+34 -135
View File
@@ -1,7 +1,4 @@
--- ---
hide:
- navigation
include_yaml: include_yaml:
github_sponsors: data/github_sponsors.yml github_sponsors: data/github_sponsors.yml
people: data/people.yml people: data/people.yml
@@ -33,22 +30,6 @@ This is me:
I'm the creator of **FastAPI**. You can read more about that in [Help FastAPI - Follow the author](help-fastapi.md#follow-the-author). I'm the creator of **FastAPI**. You can read more about that in [Help FastAPI - Follow the author](help-fastapi.md#follow-the-author).
...But here I want to show you the community.
---
**FastAPI** receives a lot of support from the community. And I want to highlight their contributions.
These are the people that:
* [Help others with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github).
* Create or review Pull Requests.
* Help [manage the repository](https://tiangolo.com/open-source/management-tasks/) (team members).
All these tasks help maintain the repository.
A round of applause to them. 👏 🙇
## Team ## Team
This is the current list of team members. 😎 This is the current list of team members. 😎
@@ -65,113 +46,19 @@ They have different levels of involvement and permissions, they can perform [rep
</div> </div>
Although the team members have the permissions to perform privileged tasks, all the help from others maintaining FastAPI is very much appreciated! 🙇‍♂️
## FastAPI Experts ## FastAPI Experts
These are the users that have been [helping others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github). 🙇 For a long time, answering questions from the community in GitHub Discussions was done by other community volunteers.
They have proven to be **FastAPI Experts** by helping many others. ✨ They proved they are **FastAPI Experts** by helping many others. ✨
/// tip Here's the hall of fame of the first FastAPI Experts:
You could become an official FastAPI Expert too!
Just [help others with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github). 🤓
///
You can see the **FastAPI Experts** for:
* [Last Month](#fastapi-experts-last-month) 🤓
* [3 Months](#fastapi-experts-3-months) 😎
* [6 Months](#fastapi-experts-6-months) 🧐
* [1 Year](#fastapi-experts-1-year) 🧑‍🔬
* [**All Time**](#fastapi-experts-all-time) 🧙
### FastAPI Experts - Last Month
These are the users that have been [helping others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github) during the last month. 🤓
<div class="user-list user-list-center"> <div class="user-list user-list-center">
{% for user in people.last_month_experts[:10] %} {% for user in people.experts[:30] %}
{% if user.login not in skip_users %} {% if user.login not in skip_users.users %}
<div class="user"><a href="{{ user.url }}"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions replied: {{ user.count }}</div></div>
{% endif %}
{% endfor %}
</div>
### FastAPI Experts - 3 Months
These are the users that have been [helping others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github) during the last 3 months. 😎
<div class="user-list user-list-center">
{% for user in people.three_months_experts[:10] %}
{% if user.login not in skip_users %}
<div class="user"><a href="{{ user.url }}"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions replied: {{ user.count }}</div></div>
{% endif %}
{% endfor %}
</div>
### FastAPI Experts - 6 Months
These are the users that have been [helping others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github) during the last 6 months. 🧐
<div class="user-list user-list-center">
{% for user in people.six_months_experts[:10] %}
{% if user.login not in skip_users %}
<div class="user"><a href="{{ user.url }}"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions replied: {{ user.count }}</div></div>
{% endif %}
{% endfor %}
</div>
### FastAPI Experts - 1 Year
These are the users that have been [helping others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github) during the last year. 🧑‍🔬
<div class="user-list user-list-center">
{% for user in people.one_year_experts[:20] %}
{% if user.login not in skip_users %}
<div class="user"><a href="{{ user.url }}"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions replied: {{ user.count }}</div></div>
{% endif %}
{% endfor %}
</div>
### FastAPI Experts - All Time
Here are the all time **FastAPI Experts**. 🤓🤯
These are the users that have [helped others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github) through *all time*. 🧙
<div class="user-list user-list-center">
{% for user in people.experts[:50] %}
{% if user.login not in skip_users %}
<div class="user"><a href="{{ user.url }}"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions replied: {{ user.count }}</div></div> <div class="user"><a href="{{ user.url }}"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions replied: {{ user.count }}</div></div>
@@ -183,17 +70,19 @@ These are the users that have [helped others the most with questions in GitHub](
## Top Contributors ## Top Contributors
Here are the **Top Contributors**. 👷 Currently, most of the code changes in FastAPI are done by the team.
These users have created the most Pull Requests that have been *merged*. But over the years, there have also been many contributions made by others.
They have contributed source code, documentation, etc. 📦 They contributed source code, documentation, etc. 📦
Here's the hall of fame of the first **Top Contributors**. 👷
<div class="user-list user-list-center"> <div class="user-list user-list-center">
{% for user in (contributors.values() | list)[:50] %} {% for user in (contributors.values() | list)[:30] %}
{% if user.login not in skip_users %} {% if user.login not in skip_users.users %}
<div class="user"><a href="{{ user.url }}"><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> <div class="user"><a href="{{ user.url }}"><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>
@@ -207,14 +96,16 @@ There are hundreds of other contributors, you can see them all in the [FastAPI G
## Top Translation Reviewers ## Top Translation Reviewers
These users are the **Top Translation Reviewers**. 🕵️ Currently, translations are done using AI tools, steered by the FastAPI team and native speakers.
Translation reviewers have the **power to approve translations** of the documentation. Without them, there wouldn't be documentation in several other languages. At some point, FastAPI had some documentation pages that community members translated into other languages by hand.
Here's the hall of fame of the first **Top Translation Reviewers**. 🕵️
<div class="user-list user-list-center"> <div class="user-list user-list-center">
{% for user in (translation_reviewers.values() | list)[:50] %} {% for user in (translation_reviewers.values() | list)[:30] %}
{% if user.login not in skip_users %} {% if user.login not in skip_users.users %}
<div class="user"><a href="{{ user.url }}"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Reviews: {{ user.count }}</div></div> <div class="user"><a href="{{ user.url }}"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Reviews: {{ user.count }}</div></div>
@@ -226,9 +117,7 @@ Translation reviewers have the **power to approve translations** of the document
## Sponsors ## Sponsors
These are the **Sponsors**. 😎 **Sponsors** support **FastAPI** and friends, mainly through [GitHub Sponsors](https://github.com/sponsors/tiangolo).
They are supporting my work with **FastAPI** (and others), mainly through [GitHub Sponsors](https://github.com/sponsors/tiangolo).
{% if sponsors %} {% if sponsors %}
@@ -283,12 +172,22 @@ They are supporting my work with **FastAPI** (and others), mainly through [GitHu
## About the data - technical details ## About the data - technical details
The main intention of this page is to highlight the effort of the community to help others. The main intention of this page has been to highlight the effort of the community to help others, especially efforts that were normally less visible and, in many cases, more arduous, like helping others with questions and reviewing Pull Requests with translations.
Especially including efforts that are normally less visible, and in many cases more arduous, like helping others with questions and reviewing Pull Requests with translations. It also highlights contributions from sponsors.
The data is calculated each month, you can read the [source code here](https://github.com/fastapi/fastapi/blob/master/scripts/). The data used to be calculated continuously, each month.
Here I'm also highlighting contributions from sponsors. As of July 2026, most of the work has been done by (paid) team members for quite some time.
I also reserve the right to update the algorithm, sections, thresholds, etc (just in case 🤷). GitHub Discussions are answered mostly by team members.
Most of the code changes are done by team members.
And translations are continuously done for the entire documentation in multiple languages, using AI tools, managed by team members.
Additionally, in recent months, there's been an overwhelming amount of AI spam, mainly to cheat the FastAPI Experts system or to get a PR merged by any means and thereby be considered a contributor. You can read more about the point of view in [Automated Code and AI](https://tiangolo.com/open-source/contributing/#automated-code-and-ai).
Because of this, the data for the FastAPI Experts, Top Contributors, and Top Translation Reviewers is no longer continuously updated.
This section is currently kept as a tribute to the humans that helped shape what FastAPI is today. 🙌
+3 -3
View File
@@ -19,7 +19,7 @@ Interactive API documentation and exploration web user interfaces. As the framew
![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png)
* Alternative API documentation with [**ReDoc**](https://github.com/Rebilly/ReDoc). * Alternative API documentation with [**ReDoc**](https://github.com/Redocly/redoc).
![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png)
@@ -159,7 +159,7 @@ Any integration is designed to be so simple to use (with dependencies) that you
## Starlette features { #starlette-features } ## Starlette features { #starlette-features }
**FastAPI** is fully compatible with (and based on) [**Starlette**](https://www.starlette.dev/). So, any additional Starlette code you have, will also work. **FastAPI** is fully compatible with (and based on) [**Starlette**](https://starlette.dev/). So, any additional Starlette code you have, will also work.
`FastAPI` is actually a sub-class of `Starlette`. So, if you already know or use Starlette, most of the functionality will work the same way. `FastAPI` is actually a sub-class of `Starlette`. So, if you already know or use Starlette, most of the functionality will work the same way.
@@ -177,7 +177,7 @@ With **FastAPI** you get all of **Starlette**'s features (as FastAPI is just Sta
## Pydantic features { #pydantic-features } ## Pydantic features { #pydantic-features }
**FastAPI** is fully compatible with (and based on) [**Pydantic**](https://docs.pydantic.dev/). So, any additional Pydantic code you have, will also work. **FastAPI** is fully compatible with (and based on) [**Pydantic**](https://pydantic.dev/docs/). So, any additional Pydantic code you have, will also work.
Including external libraries also based on Pydantic, such as <abbr title="Object-Relational Mapper">ORM</abbr>s and <abbr title="Object-Document Mapper">ODM</abbr>s for databases. Including external libraries also based on Pydantic, such as <abbr title="Object-Relational Mapper">ORM</abbr>s and <abbr title="Object-Document Mapper">ODM</abbr>s for databases.
+7 -15
View File
@@ -45,20 +45,6 @@ You can follow [me (Sebastián Ramírez / `tiangolo`)](https://tiangolo.com), th
* [@tiangolo.com on **Bluesky**](https://bsky.app/profile/tiangolo.com) * [@tiangolo.com on **Bluesky**](https://bsky.app/profile/tiangolo.com)
* [@tiangolo on **LinkedIn**](https://www.linkedin.com/in/tiangolo/). * [@tiangolo on **LinkedIn**](https://www.linkedin.com/in/tiangolo/).
## Help others with questions in GitHub { #help-others-with-questions-in-github }
You can try and help others with their questions in [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered).
In many cases you might already know the answer for those questions. 🤓
If you are helping a lot of people with their questions, you will become an official [FastAPI Expert](fastapi-people.md#fastapi-experts). 🎉
Just remember, the most important point is: try to be kind. 🤗
### How to Help { #how-to-help }
Follow the [guide on how to help](https://tiangolo.com/open-source/help/#help-others-with-questions-in-github) here.
## Ask Questions { #ask-questions } ## Ask Questions { #ask-questions }
You can [create a new question](https://github.com/fastapi/fastapi/discussions/new?category=questions) in the GitHub repository, for example to: You can [create a new question](https://github.com/fastapi/fastapi/discussions/new?category=questions) in the GitHub repository, for example to:
@@ -68,7 +54,7 @@ You can [create a new question](https://github.com/fastapi/fastapi/discussions/n
## Join the Chat { #join-the-chat } ## Join the Chat { #join-the-chat }
Join the 👥 [Discord chat server](https://discord.gg/VQjSZaeJmf) 👥 and hang out with others in the FastAPI community. Join the 👥 [Discord chat server](https://discord.com/invite/VQjSZaeJmf) 👥 and hang out with others in the FastAPI community.
/// tip /// tip
@@ -85,3 +71,9 @@ Keep in mind that as chats allow more "free conversation", it's easy to ask ques
In GitHub, the template will guide you to write the right question so that you can more easily get a good answer, or even solve the problem yourself even before asking. In GitHub, the template will guide you to write the right question so that you can more easily get a good answer, or even solve the problem yourself even before asking.
Conversations in the chat systems are also not as easily searchable as in GitHub, they get lost. Conversations in the chat systems are also not as easily searchable as in GitHub, they get lost.
## Try FastAPI Cloud { #try-fastapi-cloud }
The main funding for FastAPI and friends comes from [**FastAPI Cloud**](https://fastapicloud.com), a platform to deploy FastAPI applications in a simple and fast way, with a single command, `fastapi deploy`.
FastAPI Cloud is built by the same team behind FastAPI. You can try it and consider it for your projects.
+2 -2
View File
@@ -54,11 +54,11 @@ All in a way that provided the best development experience for all the developer
## Requirements { #requirements } ## Requirements { #requirements }
After testing several alternatives, I decided that I was going to use [**Pydantic**](https://docs.pydantic.dev/) for its advantages. After testing several alternatives, I decided that I was going to use [**Pydantic**](https://pydantic.dev/docs/) for its advantages.
Then I contributed to it, to make it fully compliant with JSON Schema, to support different ways to define constraint declarations, and to improve editor support (type checks, autocompletion) based on the tests in several editors. Then I contributed to it, to make it fully compliant with JSON Schema, to support different ways to define constraint declarations, and to improve editor support (type checks, autocompletion) based on the tests in several editors.
During the development, I also contributed to [**Starlette**](https://www.starlette.dev/), the other key requirement. During the development, I also contributed to [**Starlette**](https://starlette.dev/), the other key requirement.
## Development { #development } ## Development { #development }
@@ -66,7 +66,7 @@ The `scope` `dict` and `receive` function are both part of the ASGI specificatio
And those two things, `scope` and `receive`, are what is needed to create a new `Request` instance. And those two things, `scope` and `receive`, are what is needed to create a new `Request` instance.
To learn more about the `Request` check [Starlette's docs about Requests](https://www.starlette.dev/requests/). To learn more about the `Request` check [Starlette's docs about Requests](https://starlette.dev/requests/).
/// ///

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