@ -178,7 +178,7 @@ Sie kรถnnen denselben `responses`-Parameter verwenden, um verschiedene Medientyp
Sie kรถnnen beispielsweise einen zusรคtzlichen Medientyp `image/png` hinzufรผgen und damit deklarieren, dass Ihre *Pfadoperation* ein JSON-Objekt (mit dem Medientyp `application/json`) oder ein PNG-Bild zurรผckgeben kann:
Sie kรถnnen beispielsweise einen zusรคtzlichen Medientyp `image/png` hinzufรผgen und damit deklarieren, dass Ihre *Pfadoperation* ein JSON-Objekt (mit dem Medientyp `application/json`) oder ein PNG-Bild zurรผckgeben kann:
Und der Proxy wรผrde das **Pfadprรคfix** on-the-fly **"entfernen**", bevor er die Anfrage an Uvicorn รผbermittelt, dafรผr sorgend, dass Ihre Anwendung davon รผberzeugt ist, dass sie unter `/app` bereitgestellt wird, sodass Sie nicht Ihren gesamten Code dahingehend aktualisieren mรผssen, das Prรคfix `/api/v1` zu verwenden.
Und der Proxy wรผrde das **Pfadprรคfix** on-the-fly **"entfernen**", bevor er die Anfrage an Uvicorn รผbermittelt, dafรผr sorgend, dass Ihre Anwendung davon รผberzeugt ist, dass sie unter `/app` bereitgestellt wird, sodass Sie nicht Ihren gesamten Code dahingehend aktualisieren mรผssen, das Prรคfix `/api/v1` zu verwenden.
@ -99,7 +99,7 @@ Sie kรถnnen den aktuellen `root_path` abrufen, der von Ihrer Anwendung fรผr jede
Hier fรผgen wir ihn, nur zu Demonstrationszwecken, in die Nachricht ein.
Hier fรผgen wir ihn, nur zu Demonstrationszwecken, in die Nachricht ein.
Falls Sie keine Mรถglichkeit haben, eine Kommandozeilenoption wie `--root-path` oder รคhnlich zu รผbergeben, kรถnnen Sie als Alternative beim Erstellen Ihrer FastAPI-Anwendung den Parameter `root_path` setzen:
Falls Sie keine Mรถglichkeit haben, eine Kommandozeilenoption wie `--root-path` oder รคhnlich zu รผbergeben, kรถnnen Sie als Alternative beim Erstellen Ihrer FastAPI-Anwendung den Parameter `root_path` setzen:
@ -359,7 +359,7 @@ Die Dokumentationsoberflรคche interagiert mit dem von Ihnen ausgewรคhlten Server
Wenn Sie nicht mรถchten, dass **FastAPI** einen automatischen Server inkludiert, welcher `root_path` verwendet, kรถnnen Sie den Parameter `root_path_in_servers=False` verwenden:
Wenn Sie nicht mรถchten, dass **FastAPI** einen automatischen Server inkludiert, welcher `root_path` verwendet, kรถnnen Sie den Parameter `root_path_in_servers=False` verwenden:
@ -31,7 +31,7 @@ Das liegt daran, dass FastAPI standardmรครig jedes enthaltene Element รผberprรผ
Wenn Sie jedoch sicher sind, dass der von Ihnen zurรผckgegebene Inhalt **mit JSON serialisierbar** ist, kรถnnen Sie ihn direkt an die Response-Klasse รผbergeben und die zusรคtzliche Arbeit vermeiden, die FastAPI hรคtte, indem es Ihren zurรผckgegebenen Inhalt durch den `jsonable_encoder` leitet, bevor es ihn an die Response-Klasse รผbergibt.
Wenn Sie jedoch sicher sind, dass der von Ihnen zurรผckgegebene Inhalt **mit JSON serialisierbar** ist, kรถnnen Sie ihn direkt an die Response-Klasse รผbergeben und die zusรคtzliche Arbeit vermeiden, die FastAPI hรคtte, indem es Ihren zurรผckgegebenen Inhalt durch den `jsonable_encoder` leitet, bevor es ihn an die Response-Klasse รผbergibt.
In diesem Beispiel generiert die Funktion `generate_html_response()` bereits eine `Response` und gibt sie zurรผck, anstatt das HTML in einem `str` zurรผckzugeben.
In diesem Beispiel generiert die Funktion `generate_html_response()` bereits eine `Response` und gibt sie zurรผck, anstatt das HTML in einem `str` zurรผckzugeben.
@ -145,7 +145,7 @@ Sie akzeptiert die folgenden Parameter:
FastAPI (eigentlich Starlette) fรผgt automatisch einen Content-Length-Header ein. Auรerdem wird es einen Content-Type-Header einfรผgen, der auf dem media_type basiert, und fรผr Texttypen einen Zeichensatz (charset) anfรผgen.
FastAPI (eigentlich Starlette) fรผgt automatisch einen Content-Length-Header ein. Auรerdem wird es einen Content-Type-Header einfรผgen, der auf dem media_type basiert, und fรผr Texttypen einen Zeichensatz (charset) anfรผgen.
In diesem Fall kรถnnen Sie den Dateipfad direkt von Ihrer *Pfadoperation*-Funktion zurรผckgeben.
In diesem Fall kรถnnen Sie den Dateipfad direkt von Ihrer *Pfadoperation*-Funktion zurรผckgeben.
@ -291,7 +291,7 @@ Sie mรถchten etwa, dass Ihre Response eingerรผcktes und formatiertes JSON zurรผc
Sie kรถnnten eine `CustomORJSONResponse` erstellen. Das Wichtigste, was Sie tun mรผssen, ist, eine `Response.render(content)`-Methode zu erstellen, die den Inhalt als `bytes` zurรผckgibt:
Sie kรถnnten eine `CustomORJSONResponse` erstellen. Das Wichtigste, was Sie tun mรผssen, ist, eine `Response.render(content)`-Methode zu erstellen, die den Inhalt als `bytes` zurรผckgibt:
@ -5,7 +5,7 @@ FastAPI basiert auf **Pydantic** und ich habe Ihnen gezeigt, wie Sie Pydantic-Mo
Aber FastAPI unterstรผtzt auf die gleiche Weise auch die Verwendung von <ahref="https://docs.python.org/3/library/dataclasses.html"class="external-link"target="_blank">`dataclasses`</a>:
Aber FastAPI unterstรผtzt auf die gleiche Weise auch die Verwendung von <ahref="https://docs.python.org/3/library/dataclasses.html"class="external-link"target="_blank">`dataclasses`</a>:
```Python hl_lines="1 7-12 19-20"
```Python hl_lines="1 7-12 19-20"
{!../../../docs_src/dataclasses/tutorial001.py!}
{!../../docs_src/dataclasses/tutorial001.py!}
```
```
Das ist dank **Pydantic** ebenfalls mรถglich, da es <ahref="https://pydantic-docs.helpmanual.io/usage/dataclasses/#use-of-stdlib-dataclasses-with-basemodel"class="external-link"target="_blank">`dataclasses` intern unterstรผtzt</a>.
Das ist dank **Pydantic** ebenfalls mรถglich, da es <ahref="https://pydantic-docs.helpmanual.io/usage/dataclasses/#use-of-stdlib-dataclasses-with-basemodel"class="external-link"target="_blank">`dataclasses` intern unterstรผtzt</a>.
@ -35,7 +35,7 @@ Wenn Sie jedoch eine Menge Datenklassen herumliegen haben, ist dies ein guter Tr
Sie kรถnnen `dataclasses` auch im Parameter `response_model` verwenden:
Sie kรถnnen `dataclasses` auch im Parameter `response_model` verwenden:
```Python hl_lines="1 7-13 19"
```Python hl_lines="1 7-13 19"
{!../../../docs_src/dataclasses/tutorial002.py!}
{!../../docs_src/dataclasses/tutorial002.py!}
```
```
Die Datenklasse wird automatisch in eine Pydantic-Datenklasse konvertiert.
Die Datenklasse wird automatisch in eine Pydantic-Datenklasse konvertiert.
@ -53,7 +53,7 @@ In einigen Fรคllen mรผssen Sie mรถglicherweise immer noch Pydantics Version von
In diesem Fall kรถnnen Sie einfach die Standard-`dataclasses` durch `pydantic.dataclasses` ersetzen, was einen direkten Ersatz darstellt:
In diesem Fall kรถnnen Sie einfach die Standard-`dataclasses` durch `pydantic.dataclasses` ersetzen, was einen direkten Ersatz darstellt:
@ -31,7 +31,7 @@ Beginnen wir mit einem Beispiel und sehen es uns dann im Detail an.
Wir erstellen eine asynchrone Funktion `lifespan()` mit `yield` wie folgt:
Wir erstellen eine asynchrone Funktion `lifespan()` mit `yield` wie folgt:
```Python hl_lines="16 19"
```Python hl_lines="16 19"
{!../../../docs_src/events/tutorial003.py!}
{!../../docs_src/events/tutorial003.py!}
```
```
Hier simulieren wir das langsame *Hochfahren*, das Laden des Modells, indem wir die (Fake-)Modellfunktion vor dem `yield` in das Dictionary mit Modellen fรผr maschinelles Lernen einfรผgen. Dieser Code wird ausgefรผhrt, **bevor** die Anwendung **beginnt, Requests entgegenzunehmen**, wรคhrend des *Hochfahrens*.
Hier simulieren wir das langsame *Hochfahren*, das Laden des Modells, indem wir die (Fake-)Modellfunktion vor dem `yield` in das Dictionary mit Modellen fรผr maschinelles Lernen einfรผgen. Dieser Code wird ausgefรผhrt, **bevor** die Anwendung **beginnt, Requests entgegenzunehmen**, wรคhrend des *Hochfahrens*.
@ -51,7 +51,7 @@ Mรถglicherweise mรผssen Sie eine neue Version starten, oder Sie haben es einfach
Das Erste, was auffรคllt, ist, dass wir eine asynchrone Funktion mit `yield` definieren. Das ist sehr รคhnlich zu Abhรคngigkeiten mit `yield`.
Das Erste, was auffรคllt, ist, dass wir eine asynchrone Funktion mit `yield` definieren. Das ist sehr รคhnlich zu Abhรคngigkeiten mit `yield`.
```Python hl_lines="14-19"
```Python hl_lines="14-19"
{!../../../docs_src/events/tutorial003.py!}
{!../../docs_src/events/tutorial003.py!}
```
```
Der erste Teil der Funktion, vor dem `yield`, wird ausgefรผhrt **bevor** die Anwendung startet.
Der erste Teil der Funktion, vor dem `yield`, wird ausgefรผhrt **bevor** die Anwendung startet.
@ -65,7 +65,7 @@ Wie Sie sehen, ist die Funktion mit einem `@asynccontextmanager` versehen.
Dadurch wird die Funktion in einen sogenannten โ**asynchronen Kontextmanager**โ umgewandelt.
Dadurch wird die Funktion in einen sogenannten โ**asynchronen Kontextmanager**โ umgewandelt.
```Python hl_lines="1 13"
```Python hl_lines="1 13"
{!../../../docs_src/events/tutorial003.py!}
{!../../docs_src/events/tutorial003.py!}
```
```
Ein **Kontextmanager** in Python ist etwas, das Sie in einer `with`-Anweisung verwenden kรถnnen, zum Beispiel kann `open()` als Kontextmanager verwendet werden:
Ein **Kontextmanager** in Python ist etwas, das Sie in einer `with`-Anweisung verwenden kรถnnen, zum Beispiel kann `open()` als Kontextmanager verwendet werden:
@ -89,7 +89,7 @@ In unserem obigen Codebeispiel verwenden wir ihn nicht direkt, sondern รผbergebe
Der Parameter `lifespan` der `FastAPI`-App benรถtigt einen **asynchronen Kontextmanager**, wir kรถnnen ihm also unseren neuen asynchronen Kontextmanager `lifespan` รผbergeben.
Der Parameter `lifespan` der `FastAPI`-App benรถtigt einen **asynchronen Kontextmanager**, wir kรถnnen ihm also unseren neuen asynchronen Kontextmanager `lifespan` รผbergeben.
```Python hl_lines="22"
```Python hl_lines="22"
{!../../../docs_src/events/tutorial003.py!}
{!../../docs_src/events/tutorial003.py!}
```
```
## Alternative Events (deprecated)
## Alternative Events (deprecated)
@ -113,7 +113,7 @@ Diese Funktionen kรถnnen mit `async def` oder normalem `def` deklariert werden.
Um eine Funktion hinzuzufรผgen, die vor dem Start der Anwendung ausgefรผhrt werden soll, deklarieren Sie diese mit dem Event `startup`:
Um eine Funktion hinzuzufรผgen, die vor dem Start der Anwendung ausgefรผhrt werden soll, deklarieren Sie diese mit dem Event `startup`:
```Python hl_lines="8"
```Python hl_lines="8"
{!../../../docs_src/events/tutorial001.py!}
{!../../docs_src/events/tutorial001.py!}
```
```
In diesem Fall initialisiert die Eventhandler-Funktion `startup` die โDatenbankโ der Items (nur ein `dict`) mit einigen Werten.
In diesem Fall initialisiert die Eventhandler-Funktion `startup` die โDatenbankโ der Items (nur ein `dict`) mit einigen Werten.
@ -127,7 +127,7 @@ Und Ihre Anwendung empfรคngt erst dann Anfragen, wenn alle `startup`-Eventhandle
Um eine Funktion hinzuzufรผgen, die beim Herunterfahren der Anwendung ausgefรผhrt werden soll, deklarieren Sie sie mit dem Event `shutdown`:
Um eine Funktion hinzuzufรผgen, die beim Herunterfahren der Anwendung ausgefรผhrt werden soll, deklarieren Sie sie mit dem Event `shutdown`:
```Python hl_lines="6"
```Python hl_lines="6"
{!../../../docs_src/events/tutorial002.py!}
{!../../docs_src/events/tutorial002.py!}
```
```
Hier schreibt die `shutdown`-Eventhandler-Funktion eine Textzeile `"Application shutdown"` in eine Datei `log.txt`.
Hier schreibt die `shutdown`-Eventhandler-Funktion eine Textzeile `"Application shutdown"` in eine Datei `log.txt`.
Es gibt zwei Hauptunterschiede zu einer normalen *Pfadoperation*:
Es gibt zwei Hauptunterschiede zu einer normalen *Pfadoperation*:
@ -176,7 +176,7 @@ An diesem Punkt haben Sie die benรถtigte(n) *Callback-Pfadoperation(en)* (diejen
Verwenden Sie nun den Parameter `callbacks` im *Pfadoperation-Dekorator Ihrer API*, um das Attribut `.routes` (das ist eigentlich nur eine `list`e von Routen/*Pfadoperationen*) dieses Callback-Routers zu รผbergeben:
Verwenden Sie nun den Parameter `callbacks` im *Pfadoperation-Dekorator Ihrer API*, um das Attribut `.routes` (das ist eigentlich nur eine `list`e von Routen/*Pfadoperationen*) dieses Callback-Routers zu รผbergeben:
@ -33,7 +33,7 @@ Webhooks sind in OpenAPI 3.1.0 und hรถher verfรผgbar und werden von FastAPI `0.9
Wenn Sie eine **FastAPI**-Anwendung erstellen, gibt es ein `webhooks`-Attribut, mit dem Sie *Webhooks* definieren kรถnnen, genauso wie Sie *Pfadoperationen* definieren wรผrden, zum Beispiel mit `@app.webhooks.post()`.
Wenn Sie eine **FastAPI**-Anwendung erstellen, gibt es ein `webhooks`-Attribut, mit dem Sie *Webhooks* definieren kรถnnen, genauso wie Sie *Pfadoperationen* definieren wรผrden, zum Beispiel mit `@app.webhooks.post()`.
@ -45,7 +45,7 @@ Auch wenn diese sich in unterschiedlichen Modulen (Python-Dateien) befinden.
Um eine *Pfadoperation* aus dem generierten OpenAPI-Schema (und damit aus den automatischen Dokumentationssystemen) auszuschlieรen, verwenden Sie den Parameter `include_in_schema` und setzen Sie ihn auf `False`:
Um eine *Pfadoperation* aus dem generierten OpenAPI-Schema (und damit aus den automatischen Dokumentationssystemen) auszuschlieรen, verwenden Sie den Parameter `include_in_schema` und setzen Sie ihn auf `False`:
@ -101,7 +101,7 @@ Sie kรถnnen das OpenAPI-Schema fรผr eine *Pfadoperation* erweitern, indem Sie de
Dieses `openapi_extra` kann beispielsweise hilfreich sein, um <ahref="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions"class="external-link"target="_blank">OpenAPI-Erweiterungen</a> zu deklarieren:
Dieses `openapi_extra` kann beispielsweise hilfreich sein, um <ahref="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions"class="external-link"target="_blank">OpenAPI-Erweiterungen</a> zu deklarieren:
In diesem Beispiel haben wir kein Pydantic-Modell deklariert. Tatsรคchlich wird der Requestbody nicht einmal als JSON <abbrtitle="von einem einfachen Format, wie Bytes, in Python-Objekte konvertieren">geparst</abbr>, sondern direkt als `bytes` gelesen und die Funktion `magic_data_reader ()` wรคre dafรผr verantwortlich, ihn in irgendeiner Weise zu parsen.
In diesem Beispiel haben wir kein Pydantic-Modell deklariert. Tatsรคchlich wird der Requestbody nicht einmal als JSON <abbrtitle="von einem einfachen Format, wie Bytes, in Python-Objekte konvertieren">geparst</abbr>, sondern direkt als `bytes` gelesen und die Funktion `magic_data_reader ()` wรคre dafรผr verantwortlich, ihn in irgendeiner Weise zu parsen.
@ -168,7 +168,7 @@ In der folgenden Anwendung verwenden wir beispielsweise weder die integrierte Fu
Anschlieรend kรถnnen Sie wie gewohnt jedes gewรผnschte Objekt zurรผckgeben (ein `dict`, ein Datenbankmodell, usw.).
Anschlieรend kรถnnen Sie wie gewohnt jedes gewรผnschte Objekt zurรผckgeben (ein `dict`, ein Datenbankmodell, usw.).
@ -25,7 +25,7 @@ Sie kรถnnen auch Header hinzufรผgen, wenn Sie eine `Response` direkt zurรผckgebe
Erstellen Sie eine Response wie in [Eine Response direkt zurรผckgeben](response-directly.md){.internal-link target=_blank} beschrieben und รผbergeben Sie die Header als zusรคtzlichen Parameter:
Erstellen Sie eine Response wie in [Eine Response direkt zurรผckgeben](response-directly.md){.internal-link target=_blank} beschrieben und รผbergeben Sie die Header als zusรคtzlichen Parameter:
@ -337,7 +337,7 @@ Und dann kรถnnen wir das von der *Pfadoperation-Funktion* als Abhรคngigkeit einf
//// tab | Python 3.8+
//// tab | Python 3.8+
```Python hl_lines="17 19-21"
```Python hl_lines="17 19-21"
{!> ../../../docs_src/settings/app02_an/main.py!}
{!> ../../docs_src/settings/app02_an/main.py!}
```
```
////
////
@ -351,7 +351,7 @@ Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
///
///
```Python hl_lines="16 18-20"
```Python hl_lines="16 18-20"
{!> ../../../docs_src/settings/app02/main.py!}
{!> ../../docs_src/settings/app02/main.py!}
```
```
////
////
@ -361,7 +361,7 @@ Bevorzugen Sie die `Annotated`-Version, falls mรถglich.
Dann wรคre es sehr einfach, beim Testen ein anderes Einstellungsobjekt bereitzustellen, indem man eine Abhรคngigkeitsรผberschreibung fรผr `get_settings` erstellt:
Dann wรคre es sehr einfach, beim Testen ein anderes Einstellungsobjekt bereitzustellen, indem man eine Abhรคngigkeitsรผberschreibung fรผr `get_settings` erstellt:
```Python hl_lines="9-10 13 21"
```Python hl_lines="9-10 13 21"
{!../../../docs_src/settings/app02/test_main.py!}
{!../../docs_src/settings/app02/test_main.py!}
```
```
Bei der Abhรคngigkeitsรผberschreibung legen wir einen neuen Wert fรผr `admin_email` fest, wenn wir das neue `Settings`-Objekt erstellen, und geben dann dieses neue Objekt zurรผck.
Bei der Abhรคngigkeitsรผberschreibung legen wir einen neuen Wert fรผr `admin_email` fest, wenn wir das neue `Settings`-Objekt erstellen, und geben dann dieses neue Objekt zurรผck.
@ -406,7 +406,7 @@ Und dann aktualisieren Sie Ihre `config.py` mit:
* Verwenden Sie die von Ihnen erstellten `templates`, um eine `TemplateResponse` zu rendern und zurรผckzugeben, รผbergeben Sie den Namen des Templates, das Requestobjekt und ein โKontextโ-Dictionary mit Schlรผssel-Wert-Paaren, die innerhalb des Jinja2-Templates verwendet werden sollen.
* Verwenden Sie die von Ihnen erstellten `templates`, um eine `TemplateResponse` zu rendern und zurรผckzugeben, รผbergeben Sie den Namen des Templates, das Requestobjekt und ein โKontextโ-Dictionary mit Schlรผssel-Wert-Paaren, die innerhalb des Jinja2-Templates verwendet werden sollen.
```Python hl_lines="4 11 15-18"
```Python hl_lines="4 11 15-18"
{!../../../docs_src/templates/tutorial001.py!}
{!../../docs_src/templates/tutorial001.py!}
```
```
/// note | "Hinweis"
/// note | "Hinweis"
@ -58,7 +58,7 @@ Sie kรถnnen auch `from starlette.templating import Jinja2Templates` verwenden.
Dann kรถnnen Sie unter `templates/item.html` ein Template erstellen, mit z. B. folgendem Inhalt:
Dann kรถnnen Sie unter `templates/item.html` ein Template erstellen, mit z. B. folgendem Inhalt:
In diesem Beispiel wรผrde das zu einer CSS-Datei unter `static/styles.css` verlinken, mit folgendem Inhalt:
In diesem Beispiel wรผrde das zu einer CSS-Datei unter `static/styles.css` verlinken, mit folgendem Inhalt:
```CSS hl_lines="4"
```CSS hl_lines="4"
{!../../../docs_src/templates/static/styles.css!}
{!../../docs_src/templates/static/styles.css!}
```
```
Und da Sie `StaticFiles` verwenden, wird diese CSS-Datei automatisch von Ihrer **FastAPI**-Anwendung unter der URL `/static/styles.css` bereitgestellt.
Und da Sie `StaticFiles` verwenden, wird diese CSS-Datei automatisch von Ihrer **FastAPI**-Anwendung unter der URL `/static/styles.css` bereitgestellt.
Wenn Sie in Ihren Tests Ihre Event-Handler (`startup` und `shutdown`) ausfรผhren wollen, kรถnnen Sie den `TestClient` mit einer `with`-Anweisung verwenden:
Wenn Sie in Ihren Tests Ihre Event-Handler (`startup` und `shutdown`) ausfรผhren wollen, kรถnnen Sie den `TestClient` mit einer `with`-Anweisung verwenden:
Durch die Deklaration eines *Pfadoperation-Funktionsparameters*, dessen Typ der `Request` ist, weiร **FastAPI**, dass es den `Request` diesem Parameter รผbergeben soll.
Durch die Deklaration eines *Pfadoperation-Funktionsparameters*, dessen Typ der `Request` ist, weiร **FastAPI**, dass es den `Request` diesem Parameter รผbergeben soll.
... und dann zeigt die Swagger-Oberflรคche die Syntaxhervorhebung nicht mehr an:
... und dann zeigt die Swagger-Oberflรคche die Syntaxhervorhebung nicht mehr an:
@ -31,7 +31,7 @@ Sie kรถnnen sie jedoch deaktivieren, indem Sie `syntaxHighlight` auf `False` set
Auf die gleiche Weise kรถnnten Sie das Theme der Syntaxhervorhebung mit dem Schlรผssel `syntaxHighlight.theme` festlegen (beachten Sie, dass er einen Punkt in der Mitte hat):
Auf die gleiche Weise kรถnnten Sie das Theme der Syntaxhervorhebung mit dem Schlรผssel `syntaxHighlight.theme` festlegen (beachten Sie, dass er einen Punkt in der Mitte hat):
Wenn eine Exception auftritt, befindet sich die `Request`-Instanz weiterhin im Gรผltigkeitsbereich, sodass wir den Requestbody lesen und bei der Fehlerbehandlung verwenden kรถnnen:
Wenn eine Exception auftritt, befindet sich die `Request`-Instanz weiterhin im Gรผltigkeitsbereich, sodass wir den Requestbody lesen und bei der Fehlerbehandlung verwenden kรถnnen:
In diesem Beispiel verwenden die *Pfadoperationen* unter dem `router` die benutzerdefinierte `TimedRoute`-Klasse und haben in der Response einen zusรคtzlichen `X-Response-Time`-Header mit der Zeit, die zum Generieren der Response benรถtigt wurde:
In diesem Beispiel verwenden die *Pfadoperationen* unter dem `router` die benutzerdefinierte `TimedRoute`-Klasse und haben in der Response einen zusรคtzlichen `X-Response-Time`-Header mit der Zeit, die zum Generieren der Response benรถtigt wurde:
@ -36,7 +36,7 @@ Abhรคngig von Ihrem Anwendungsfall bevorzugen Sie vielleicht eine andere Bibliot
Hier ist eine kleine Vorschau, wie Sie Strawberry mit FastAPI integrieren kรถnnen:
Hier ist eine kleine Vorschau, wie Sie Strawberry mit FastAPI integrieren kรถnnen:
```Python hl_lines="3 22 25-26"
```Python hl_lines="3 22 25-26"
{!../../../docs_src/graphql/tutorial001.py!}
{!../../docs_src/graphql/tutorial001.py!}
```
```
Weitere Informationen zu Strawberry finden Sie in der <ahref="https://strawberry.rocks/"class="external-link"target="_blank">Strawberry-Dokumentation</a>.
Weitere Informationen zu Strawberry finden Sie in der <ahref="https://strawberry.rocks/"class="external-link"target="_blank">Strawberry-Dokumentation</a>.
@ -321,7 +321,7 @@ Sie kรถnnen deklarieren, dass ein Wert ein `str`, aber vielleicht auch `None` se
In Python 3.6 und darรผber (inklusive Python 3.10) kรถnnen Sie das deklarieren, indem Sie `Optional` vom `typing` Modul importieren und verwenden.
In Python 3.6 und darรผber (inklusive Python 3.10) kรถnnen Sie das deklarieren, indem Sie `Optional` vom `typing` Modul importieren und verwenden.
```Python hl_lines="1 4"
```Python hl_lines="1 4"
{!../../../docs_src/python_types/tutorial009.py!}
{!../../docs_src/python_types/tutorial009.py!}
```
```
Wenn Sie `Optional[str]` anstelle von nur `str` verwenden, wird Ihr Editor Ihnen dabei helfen, Fehler zu erkennen, bei denen Sie annehmen kรถnnten, dass ein Wert immer eine String (`str`) ist, obwohl er auch `None` sein kรถnnte.
Wenn Sie `Optional[str]` anstelle von nur `str` verwenden, wird Ihr Editor Ihnen dabei helfen, Fehler zu erkennen, bei denen Sie annehmen kรถnnten, dass ein Wert immer eine String (`str`) ist, obwohl er auch `None` sein kรถnnte.
@ -333,7 +333,7 @@ Das bedeutet auch, dass Sie in Python 3.10 `Something | None` verwenden kรถnnen:
Der Parameter `name` ist definiert als `Optional[str]`, aber er ist **nicht optional**, Sie kรถnnen die Funktion nicht ohne diesen Parameter aufrufen:
Der Parameter `name` ist definiert als `Optional[str]`, aber er ist **nicht optional**, Sie kรถnnen die Funktion nicht ohne diesen Parameter aufrufen:
@ -388,7 +388,7 @@ say_hi(name=None) # Das funktioniert, None is gรผltig ๐
Die gute Nachricht ist, dass Sie sich darรผber keine Sorgen mehr machen mรผssen, wenn Sie Python 3.10 verwenden, da Sie einfach `|` verwenden kรถnnen, um Vereinigungen von Typen zu definieren:
Die gute Nachricht ist, dass Sie sich darรผber keine Sorgen mehr machen mรผssen, wenn Sie Python 3.10 verwenden, da Sie einfach `|` verwenden kรถnnen, um Vereinigungen von Typen zu definieren:
Importieren Sie zunรคchst `BackgroundTasks` und definieren Sie einen Parameter in Ihrer *Pfadoperation-Funktion* mit der Typdeklaration `BackgroundTasks`:
Importieren Sie zunรคchst `BackgroundTasks` und definieren Sie einen Parameter in Ihrer *Pfadoperation-Funktion* mit der Typdeklaration `BackgroundTasks`:
@ -316,7 +316,7 @@ Wir fรผgen weder das Prรคfix `/items` noch `tags=["items"]` zu jeder *Pfadoperat
Aber wir kรถnnen immer noch _mehr_`tags` hinzufรผgen, die auf eine bestimmte *Pfadoperation* angewendet werden, sowie einige zusรคtzliche `responses`, die speziell fรผr diese *Pfadoperation* gelten:
Aber wir kรถnnen immer noch _mehr_`tags` hinzufรผgen, die auf eine bestimmte *Pfadoperation* angewendet werden, sowie einige zusรคtzliche `responses`, die speziell fรผr diese *Pfadoperation* gelten:
@ -344,7 +344,7 @@ Sie importieren und erstellen wie gewohnt eine `FastAPI`-Klasse.
Und wir kรถnnen sogar [globale Abhรคngigkeiten](dependencies/global-dependencies.md){.internal-link target=_blank} deklarieren, die mit den Abhรคngigkeiten fรผr jeden `APIRouter` kombiniert werden:
Und wir kรถnnen sogar [globale Abhรคngigkeiten](dependencies/global-dependencies.md){.internal-link target=_blank} deklarieren, die mit den Abhรคngigkeiten fรผr jeden `APIRouter` kombiniert werden:
Da es sich bei den Dateien `app/routers/users.py` und `app/routers/items.py` um Submodule handelt, die Teil desselben Python-Packages `app` sind, kรถnnen wir einen einzelnen Punkt `.` verwenden, um sie mit โrelativen Importsโ zu importieren.
Da es sich bei den Dateien `app/routers/users.py` und `app/routers/items.py` um Submodule handelt, die Teil desselben Python-Packages `app` sind, kรถnnen wir einen einzelnen Punkt `.` verwenden, um sie mit โrelativen Importsโ zu importieren.
@ -417,7 +417,7 @@ wรผrde der `router` von `users` den von `items` รผberschreiben und wir kรถnnten
Um also beide in derselben Datei verwenden zu kรถnnen, importieren wir die Submodule direkt:
Um also beide in derselben Datei verwenden zu kรถnnen, importieren wir die Submodule direkt:
@ -468,7 +468,7 @@ Sie enthรคlt einen `APIRouter` mit einigen administrativen *Pfadoperationen*, di
In diesem Beispiel wird es ganz einfach sein. Nehmen wir jedoch an, dass wir, da sie mit anderen Projekten in der Organisation geteilt wird, sie nicht รคndern und kein `prefix`, `dependencies`, `tags`, usw. direkt zum `APIRouter` hinzufรผgen kรถnnen:
In diesem Beispiel wird es ganz einfach sein. Nehmen wir jedoch an, dass wir, da sie mit anderen Projekten in der Organisation geteilt wird, sie nicht รคndern und kein `prefix`, `dependencies`, `tags`, usw. direkt zum `APIRouter` hinzufรผgen kรถnnen:
Aber wir mรถchten immer noch ein benutzerdefiniertes `prefix` festlegen, wenn wir den `APIRouter` einbinden, sodass alle seine *Pfadoperationen* mit `/admin` beginnen, wir mรถchten es mit den `dependencies` sichern, die wir bereits fรผr dieses Projekt haben, und wir mรถchten `tags` und `responses` hinzufรผgen.
Aber wir mรถchten immer noch ein benutzerdefiniertes `prefix` festlegen, wenn wir den `APIRouter` einbinden, sodass alle seine *Pfadoperationen* mit `/admin` beginnen, wir mรถchten es mit den `dependencies` sichern, die wir bereits fรผr dieses Projekt haben, und wir mรถchten `tags` und `responses` hinzufรผgen.
@ -476,7 +476,7 @@ Aber wir mรถchten immer noch ein benutzerdefiniertes `prefix` festlegen, wenn wi
Wir kรถnnen das alles deklarieren, ohne den ursprรผnglichen `APIRouter` รคndern zu mรผssen, indem wir diese Parameter an `app.include_router()` รผbergeben:
Wir kรถnnen das alles deklarieren, ohne den ursprรผnglichen `APIRouter` รคndern zu mรผssen, indem wir diese Parameter an `app.include_router()` รผbergeben:
Auf diese Weise bleibt der ursprรผngliche `APIRouter` unverรคndert, sodass wir dieselbe `app/internal/admin.py`-Datei weiterhin mit anderen Projekten in der Organisation teilen kรถnnen.
Auf diese Weise bleibt der ursprรผngliche `APIRouter` unverรคndert, sodass wir dieselbe `app/internal/admin.py`-Datei weiterhin mit anderen Projekten in der Organisation teilen kรถnnen.
@ -499,7 +499,7 @@ Wir kรถnnen *Pfadoperationen* auch direkt zur `FastAPI`-App hinzufรผgen.
Hier machen wir es ... nur um zu zeigen, dass wir es kรถnnen ๐คท:
Hier machen wir es ... nur um zu zeigen, dass wir es kรถnnen ๐คท:
@ -30,19 +30,19 @@ Sie kรถnnten damit beispielsweise eine Datenbanksession erstellen und diese nach
Nur der Code vor und einschlieรlich der `yield`-Anweisung wird ausgefรผhrt, bevor eine Response erzeugt wird:
Nur der Code vor und einschlieรlich der `yield`-Anweisung wird ausgefรผhrt, bevor eine Response erzeugt wird:
```Python hl_lines="2-4"
```Python hl_lines="2-4"
{!../../../docs_src/dependencies/tutorial007.py!}
{!../../docs_src/dependencies/tutorial007.py!}
```
```
Der ge`yield`ete Wert ist das, was in *Pfadoperationen* und andere Abhรคngigkeiten eingefรผgt wird:
Der ge`yield`ete Wert ist das, was in *Pfadoperationen* und andere Abhรคngigkeiten eingefรผgt wird:
```Python hl_lines="4"
```Python hl_lines="4"
{!../../../docs_src/dependencies/tutorial007.py!}
{!../../docs_src/dependencies/tutorial007.py!}
```
```
Der auf die `yield`-Anweisung folgende Code wird ausgefรผhrt, nachdem die Response gesendet wurde:
Der auf die `yield`-Anweisung folgende Code wird ausgefรผhrt, nachdem die Response gesendet wurde:
```Python hl_lines="5-6"
```Python hl_lines="5-6"
{!../../../docs_src/dependencies/tutorial007.py!}
{!../../docs_src/dependencies/tutorial007.py!}
```
```
/// tip | "Tipp"
/// tip | "Tipp"
@ -64,7 +64,7 @@ Sie kรถnnen also mit `except SomeException` diese bestimmte Exception innerhalb
Auf die gleiche Weise kรถnnen Sie `finally` verwenden, um sicherzustellen, dass die Exit-Schritte ausgefรผhrt werden, unabhรคngig davon, ob eine Exception geworfen wurde oder nicht.
Auf die gleiche Weise kรถnnen Sie `finally` verwenden, um sicherzustellen, dass die Exit-Schritte ausgefรผhrt werden, unabhรคngig davon, ob eine Exception geworfen wurde oder nicht.
```Python hl_lines="3 5"
```Python hl_lines="3 5"
{!../../../docs_src/dependencies/tutorial007.py!}
{!../../docs_src/dependencies/tutorial007.py!}
```
```
## Unterabhรคngigkeiten mit `yield`.
## Unterabhรคngigkeiten mit `yield`.
@ -78,7 +78,7 @@ Beispielsweise kann `dependency_c` von `dependency_b` und `dependency_b` von `de
@ -321,7 +321,7 @@ In Python kรถnnen Sie Kontextmanager erstellen, indem Sie <a href="https://docs.
Sie kรถnnen solche auch innerhalb von **FastAPI**-Abhรคngigkeiten mit `yield` verwenden, indem Sie `with`- oder `async with`-Anweisungen innerhalb der Abhรคngigkeits-Funktion verwenden:
Sie kรถnnen solche auch innerhalb von **FastAPI**-Abhรคngigkeiten mit `yield` verwenden, indem Sie `with`- oder `async with`-Anweisungen innerhalb der Abhรคngigkeits-Funktion verwenden:
Jetzt versuchen Sie, einen ungรผltigen Artikel zu senden:
Jetzt versuchen Sie, einen ungรผltigen Artikel zu senden:
@ -265,7 +265,7 @@ from starlette.exceptions import HTTPException as StarletteHTTPException
Wenn Sie die Exception zusammen mit denselben Default-Exceptionhandlern von **FastAPI** verwenden mรถchten, kรถnnen Sie die Default-Exceptionhandler von `fastapi.Exception_handlers` importieren und wiederverwenden:
Wenn Sie die Exception zusammen mit denselben Default-Exceptionhandlern von **FastAPI** verwenden mรถchten, kรถnnen Sie die Default-Exceptionhandler von `fastapi.Exception_handlers` importieren und wiederverwenden:
In diesem Beispiel `print`en Sie nur den Fehler mit einer sehr ausdrucksstarken Nachricht, aber Sie sehen, worauf wir hinauswollen. Sie kรถnnen mit der Exception etwas machen und dann einfach die Default-Exceptionhandler wiederverwenden.
In diesem Beispiel `print`en Sie nur den Fehler mit einer sehr ausdrucksstarken Nachricht, aber Sie sehen, worauf wir hinauswollen. Sie kรถnnen mit der Exception etwas machen und dann einfach die Default-Exceptionhandler wiederverwenden.
@ -19,7 +19,7 @@ Sie kรถnnen die folgenden Felder festlegen, welche in der OpenAPI-Spezifikation
Sie kรถnnen diese wie folgt setzen:
Sie kรถnnen diese wie folgt setzen:
```Python hl_lines="3-16 19-32"
```Python hl_lines="3-16 19-32"
{!../../../docs_src/metadata/tutorial001.py!}
{!../../docs_src/metadata/tutorial001.py!}
```
```
/// tip | "Tipp"
/// tip | "Tipp"
@ -39,7 +39,7 @@ Seit OpenAPI 3.1.0 und FastAPI 0.99.0 kรถnnen Sie die `license_info` auch mit ei
Zum Beispiel:
Zum Beispiel:
```Python hl_lines="31"
```Python hl_lines="31"
{!../../../docs_src/metadata/tutorial001_1.py!}
{!../../docs_src/metadata/tutorial001_1.py!}
```
```
## Metadaten fรผr Tags
## Metadaten fรผr Tags
@ -63,7 +63,7 @@ Versuchen wir das an einem Beispiel mit Tags fรผr `users` und `items`.
Erstellen Sie Metadaten fรผr Ihre Tags und รผbergeben Sie sie an den Parameter `openapi_tags`:
Erstellen Sie Metadaten fรผr Ihre Tags und รผbergeben Sie sie an den Parameter `openapi_tags`:
```Python hl_lines="3-16 18"
```Python hl_lines="3-16 18"
{!../../../docs_src/metadata/tutorial004.py!}
{!../../docs_src/metadata/tutorial004.py!}
```
```
Beachten Sie, dass Sie Markdown in den Beschreibungen verwenden kรถnnen. Beispielsweise wird โloginโ in Fettschrift (**login**) und โfancyโ in Kursivschrift (_fancy_) angezeigt.
Beachten Sie, dass Sie Markdown in den Beschreibungen verwenden kรถnnen. Beispielsweise wird โloginโ in Fettschrift (**login**) und โfancyโ in Kursivschrift (_fancy_) angezeigt.
@ -79,7 +79,7 @@ Sie mรผssen nicht fรผr alle von Ihnen verwendeten Tags Metadaten hinzufรผgen.
Verwenden Sie den Parameter `tags` mit Ihren *Pfadoperationen* (und `APIRouter`n), um diese verschiedenen Tags zuzuweisen:
Verwenden Sie den Parameter `tags` mit Ihren *Pfadoperationen* (und `APIRouter`n), um diese verschiedenen Tags zuzuweisen:
```Python hl_lines="21 26"
```Python hl_lines="21 26"
{!../../../docs_src/metadata/tutorial004.py!}
{!../../docs_src/metadata/tutorial004.py!}
```
```
/// info
/// info
@ -109,7 +109,7 @@ Sie kรถnnen das aber mit dem Parameter `openapi_url` konfigurieren.
Um beispielsweise festzulegen, dass es unter `/api/v1/openapi.json` bereitgestellt wird:
Um beispielsweise festzulegen, dass es unter `/api/v1/openapi.json` bereitgestellt wird:
```Python hl_lines="3"
```Python hl_lines="3"
{!../../../docs_src/metadata/tutorial002.py!}
{!../../docs_src/metadata/tutorial002.py!}
```
```
Wenn Sie das OpenAPI-Schema vollstรคndig deaktivieren mรถchten, kรถnnen Sie `openapi_url=None` festlegen, wodurch auch die Dokumentationsbenutzeroberflรคchen deaktiviert werden, die es verwenden.
Wenn Sie das OpenAPI-Schema vollstรคndig deaktivieren mรถchten, kรถnnen Sie `openapi_url=None` festlegen, wodurch auch die Dokumentationsbenutzeroberflรคchen deaktiviert werden, die es verwenden.
@ -128,5 +128,5 @@ Sie kรถnnen die beiden enthaltenen Dokumentationsbenutzeroberflรคchen konfigurie
Um beispielsweise Swagger UI so einzustellen, dass sie unter `/documentation` bereitgestellt wird, und ReDoc zu deaktivieren:
Um beispielsweise Swagger UI so einzustellen, dass sie unter `/documentation` bereitgestellt wird, und ReDoc zu deaktivieren:
* Sie kรถnnen die `response` dann weiter modifizieren, bevor Sie sie zurรผckgeben.
* Sie kรถnnen die `response` dann weiter modifizieren, bevor Sie sie zurรผckgeben.
```Python hl_lines="8-9 11 14"
```Python hl_lines="8-9 11 14"
{!../../../docs_src/middleware/tutorial001.py!}
{!../../docs_src/middleware/tutorial001.py!}
```
```
/// tip | "Tipp"
/// tip | "Tipp"
@ -60,7 +60,7 @@ Und auch nachdem die `response` generiert wurde, bevor sie zurรผckgegeben wird.
Sie kรถnnten beispielsweise einen benutzerdefinierten Header `X-Process-Time` hinzufรผgen, der die Zeit in Sekunden enthรคlt, die benรถtigt wurde, um den Request zu verarbeiten und eine Response zu generieren:
Sie kรถnnten beispielsweise einen benutzerdefinierten Header `X-Process-Time` hinzufรผgen, der die Zeit in Sekunden enthรคlt, die benรถtigt wurde, um den Request zu verarbeiten und eine Response zu generieren:
@ -205,7 +205,7 @@ Daher, wenn Sie keine vergeben, wird **FastAPI** automatisch eine fรผr โErfolg
Wenn Sie eine *Pfadoperation* als <abbrtitle="deprecated โ obsolet, veraltet: Es soll nicht mehr verwendet werden">deprecated</abbr> kennzeichnen mรถchten, ohne sie zu entfernen, fรผgen Sie den Parameter `deprecated` hinzu:
Wenn Sie eine *Pfadoperation* als <abbrtitle="deprecated โ obsolet, veraltet: Es soll nicht mehr verwendet werden">deprecated</abbr> kennzeichnen mรถchten, ohne sie zu entfernen, fรผgen Sie den Parameter `deprecated` hinzu:
@ -214,7 +214,7 @@ Wenn Sie eines der folgenden Dinge tun mรถchten:
Python macht nichts mit diesem `*`, aber es wird wissen, dass alle folgenden Parameter als <abbrtitle="Keyword-Argument โ Schlรผsselwort-Argument: Das Argument wird anhand seines Namens erkannt, nicht anhand seiner Reihenfolge in der Argumentliste">Keyword-Argumente</abbr> (Schlรผssel-Wert-Paare), auch bekannt als <abbrtitle="Von: K-ey W-ord Arg-uments"><code>kwargs</code></abbr>, verwendet werden. Selbst wenn diese keinen Defaultwert haben.
Python macht nichts mit diesem `*`, aber es wird wissen, dass alle folgenden Parameter als <abbrtitle="Keyword-Argument โ Schlรผsselwort-Argument: Das Argument wird anhand seines Namens erkannt, nicht anhand seiner Reihenfolge in der Argumentliste">Keyword-Argumente</abbr> (Schlรผssel-Wert-Paare), auch bekannt als <abbrtitle="Von: K-ey W-ord Arg-uments"><code>kwargs</code></abbr>, verwendet werden. Selbst wenn diese keinen Defaultwert haben.
Sie kรถnnen Pfad-โParameterโ oder -โVariablenโ mit der gleichen Syntax deklarieren, welche in Python-<abbrtitle="Format-String โ Formatierter String: Der String enthรคlt Variablen, die mit geschweiften Klammern umschlossen sind. Solche Stellen werden durch den Wert der Variable ersetzt">Format-Strings</abbr> verwendet wird:
Sie kรถnnen Pfad-โParameterโ oder -โVariablenโ mit der gleichen Syntax deklarieren, welche in Python-<abbrtitle="Format-String โ Formatierter String: Der String enthรคlt Variablen, die mit geschweiften Klammern umschlossen sind. Solche Stellen werden durch den Wert der Variable ersetzt">Format-Strings</abbr> verwendet wird:
```Python hl_lines="6-7"
```Python hl_lines="6-7"
{!../../../docs_src/path_params/tutorial001.py!}
{!../../docs_src/path_params/tutorial001.py!}
```
```
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.
@ -19,7 +19,7 @@ Wenn Sie dieses Beispiel ausfรผhren und auf <a href="http://127.0.0.1:8000/items
Sie kรถnnen den Typ eines Pfad-Parameters in der Argumentliste der Funktion deklarieren, mit Standard-Python-Typannotationen:
Sie kรถnnen den Typ eines Pfad-Parameters in der Argumentliste der Funktion deklarieren, mit Standard-Python-Typannotationen:
```Python hl_lines="7"
```Python hl_lines="7"
{!../../../docs_src/path_params/tutorial002.py!}
{!../../docs_src/path_params/tutorial002.py!}
```
```
In diesem Fall wird `item_id` als `int` deklariert, also als Ganzzahl.
In diesem Fall wird `item_id` als `int` deklariert, also als Ganzzahl.
@ -124,7 +124,7 @@ Und Sie haben auch einen Pfad `/users/{user_id}`, um Daten รผber einen spezifisc
Weil *Pfadoperationen* in ihrer Reihenfolge ausgewertet werden, mรผssen Sie sicherstellen, dass der Pfad `/users/me` vor `/users/{user_id}` deklariert wurde:
Weil *Pfadoperationen* in ihrer Reihenfolge ausgewertet werden, mรผssen Sie sicherstellen, dass der Pfad `/users/me` vor `/users/{user_id}` deklariert wurde:
```Python hl_lines="6 11"
```Python hl_lines="6 11"
{!../../../docs_src/path_params/tutorial003.py!}
{!../../docs_src/path_params/tutorial003.py!}
```
```
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 `/users/me` auswerten, und annehmen, dass ein Parameter `user_id` mit dem Wert `"me"` รผbergeben wurde.
@ -132,7 +132,7 @@ Ansonsten wรผrde der Pfad fรผr `/users/{user_id}` auch `/users/me` auswerten, un
Sie kรถnnen eine Pfadoperation auch nicht erneut definieren:
Sie kรถnnen eine Pfadoperation auch nicht erneut definieren:
```Python hl_lines="6 11"
```Python hl_lines="6 11"
{!../../../docs_src/path_params/tutorial003b.py!}
{!../../docs_src/path_params/tutorial003b.py!}
```
```
Die erste Definition wird immer verwendet werden, da ihr Pfad zuerst รผbereinstimmt.
Die erste Definition wird immer verwendet werden, da ihr Pfad zuerst รผbereinstimmt.
@ -150,7 +150,7 @@ Indem Sie von `str` erben, weiร die API Dokumentation, dass die Werte des Enums
Erstellen Sie dann Klassen-Attribute mit festgelegten Werten, welches die erlaubten Werte sein werden:
Erstellen Sie dann Klassen-Attribute mit festgelegten Werten, welches die erlaubten Werte sein werden:
```Python hl_lines="1 6-9"
```Python hl_lines="1 6-9"
{!../../../docs_src/path_params/tutorial005.py!}
{!../../docs_src/path_params/tutorial005.py!}
```
```
/// info
/// info
@ -170,7 +170,7 @@ Falls Sie sich fragen, was โAlexNetโ, โResNetโ und โLeNetโ ist, das
Dann erstellen Sie einen *Pfad-Parameter*, der als Typ die gerade erstellte Enum-Klasse hat (`ModelName`):
Dann erstellen Sie einen *Pfad-Parameter*, der als Typ die gerade erstellte Enum-Klasse hat (`ModelName`):
```Python hl_lines="16"
```Python hl_lines="16"
{!../../../docs_src/path_params/tutorial005.py!}
{!../../docs_src/path_params/tutorial005.py!}
```
```
### Testen Sie es in der API-Dokumentation
### Testen Sie es in der API-Dokumentation
@ -188,7 +188,7 @@ Der *Pfad-Parameter* wird ein *<abbr title="Member โ Mitglied: Einer der mรถgl
Sie kรถnnen ihn mit einem Member Ihres Enums `ModelName` vergleichen:
Sie kรถnnen ihn mit einem Member Ihres Enums `ModelName` vergleichen:
```Python hl_lines="17"
```Python hl_lines="17"
{!../../../docs_src/path_params/tutorial005.py!}
{!../../docs_src/path_params/tutorial005.py!}
```
```
#### *Enum-Wert* erhalten
#### *Enum-Wert* erhalten
@ -196,7 +196,7 @@ Sie kรถnnen ihn mit einem Member Ihres Enums `ModelName` vergleichen:
Den tatsรคchlichen Wert (in diesem Fall ein `str`) erhalten Sie via `model_name.value`, oder generell, `ihr_enum_member.value`:
Den tatsรคchlichen Wert (in diesem Fall ein `str`) erhalten Sie via `model_name.value`, oder generell, `ihr_enum_member.value`:
```Python hl_lines="20"
```Python hl_lines="20"
{!../../../docs_src/path_params/tutorial005.py!}
{!../../docs_src/path_params/tutorial005.py!}
```
```
/// tip | "Tipp"
/// tip | "Tipp"
@ -212,7 +212,7 @@ Sie kรถnnen *Enum-Member* in ihrer *Pfadoperation* zurรผckgeben, sogar verschach
Diese werden zu ihren entsprechenden Werten konvertiert (in diesem Fall Strings), bevor sie zum Client รผbertragen werden:
Diese werden zu ihren entsprechenden Werten konvertiert (in diesem Fall Strings), bevor sie zum Client รผbertragen werden:
```Python hl_lines="18 21 23"
```Python hl_lines="18 21 23"
{!../../../docs_src/path_params/tutorial005.py!}
{!../../docs_src/path_params/tutorial005.py!}
```
```
In Ihrem Client erhalten Sie eine JSON-Response, wie etwa:
In Ihrem Client erhalten Sie eine JSON-Response, wie etwa:
@ -253,7 +253,7 @@ In diesem Fall ist der Name des Parameters `file_path`. Der letzte Teil, `:path`
Wenn Sie in ihrer Funktion Parameter deklarieren, die nicht Teil der Pfad-Parameter sind, dann werden diese automatisch als โQueryโ-Parameter interpretiert.
Wenn Sie in ihrer Funktion Parameter deklarieren, die nicht Teil der Pfad-Parameter sind, dann werden diese automatisch als โQueryโ-Parameter interpretiert.
```Python hl_lines="9"
```Python hl_lines="9"
{!../../../docs_src/query_params/tutorial001.py!}
{!../../docs_src/query_params/tutorial001.py!}
```
```
Query-Parameter (Deutsch: Abfrage-Parameter) sind die Schlรผssel-Wert-Paare, die nach dem `?` in einer URL aufgelistet sind, getrennt durch `&`-Zeichen.
Query-Parameter (Deutsch: Abfrage-Parameter) sind die Schlรผssel-Wert-Paare, die nach dem `?` in einer URL aufgelistet sind, getrennt durch `&`-Zeichen.
@ -66,7 +66,7 @@ Auf die gleiche Weise kรถnnen Sie optionale Query-Parameter deklarieren, indem S
@ -303,7 +303,7 @@ Es kann Fรคlle geben, bei denen Sie etwas zurรผckgeben, das kein gรผltiges Pydan
Der hรคufigste Anwendungsfall ist, wenn Sie [eine Response direkt zurรผckgeben, wie es spรคter im Handbuch fรผr fortgeschrittene Benutzer erlรคutert wird](../advanced/response-directly.md){.internal-link target=_blank}.
Der hรคufigste Anwendungsfall ist, wenn Sie [eine Response direkt zurรผckgeben, wie es spรคter im Handbuch fรผr fortgeschrittene Benutzer erlรคutert wird](../advanced/response-directly.md){.internal-link target=_blank}.
Dieser einfache Anwendungsfall wird automatisch von FastAPI gehandhabt, weil die Annotation des Rรผckgabetyps die Klasse (oder eine Unterklasse von) `Response` ist.
Dieser einfache Anwendungsfall wird automatisch von FastAPI gehandhabt, weil die Annotation des Rรผckgabetyps die Klasse (oder eine Unterklasse von) `Response` ist.
@ -315,7 +315,7 @@ Und Tools werden auch glรผcklich sein, weil sowohl `RedirectResponse` als auch `
Sie kรถnnen auch eine Unterklasse von `Response` in der Typannotation verwenden.
Sie kรถnnen auch eine Unterklasse von `Response` in der Typannotation verwenden.
Das wird ebenfalls funktionieren, weil `RedirectResponse` eine Unterklasse von `Response` ist, und FastAPI sich um diesen einfachen Anwendungsfall automatisch kรผmmert.
Das wird ebenfalls funktionieren, weil `RedirectResponse` eine Unterklasse von `Response` ist, und FastAPI sich um diesen einfachen Anwendungsfall automatisch kรผmmert.
@ -329,7 +329,7 @@ Das gleiche wird passieren, wenn Sie eine <abbr title='Eine Union mehrerer Typen
Diese sind nur eine Annehmlichkeit und enthalten dieselbe Nummer, aber auf diese Weise kรถnnen Sie die Autovervollstรคndigung Ihres Editors verwenden, um sie zu finden:
Diese sind nur eine Annehmlichkeit und enthalten dieselbe Nummer, aber auf diese Weise kรถnnen Sie die Autovervollstรคndigung Ihres Editors verwenden, um sie zu finden:
@ -27,7 +27,7 @@ Verwenden Sie das `TestClient`-Objekt auf die gleiche Weise wie `httpx`.
Schreiben Sie einfache `assert`-Anweisungen mit den Standard-Python-Ausdrรผcken, die Sie รผberprรผfen mรผssen (wiederum, Standard-`pytest`).
Schreiben Sie einfache `assert`-Anweisungen mit den Standard-Python-Ausdrรผcken, die Sie รผberprรผfen mรผssen (wiederum, Standard-`pytest`).
```Python hl_lines="2 12 15-18"
```Python hl_lines="2 12 15-18"
{!../../../docs_src/app_testing/tutorial001.py!}
{!../../docs_src/app_testing/tutorial001.py!}
```
```
/// tip | "Tipp"
/// tip | "Tipp"
@ -75,7 +75,7 @@ In der Datei `main.py` haben Sie Ihre **FastAPI**-Anwendung:
```Python
```Python
{!../../../docs_src/app_testing/main.py!}
{!../../docs_src/app_testing/main.py!}
```
```
### Testdatei
### Testdatei
@ -93,7 +93,7 @@ Dann kรถnnten Sie eine Datei `test_main.py` mit Ihren Tests haben. Sie kรถnnte s
Da sich diese Datei im selben Package befindet, kรถnnen Sie relative Importe verwenden, um das Objekt `app` aus dem `main`-Modul (`main.py`) zu importieren:
Da sich diese Datei im selben Package befindet, kรถnnen Sie relative Importe verwenden, um das Objekt `app` aus dem `main`-Modul (`main.py`) zu importieren:
```Python hl_lines="3"
```Python hl_lines="3"
{!../../../docs_src/app_testing/test_main.py!}
{!../../docs_src/app_testing/test_main.py!}
```
```
... und haben den Code fรผr die Tests wie zuvor.
... und haben den Code fรผr die Tests wie zuvor.
@ -125,7 +125,7 @@ Beide *Pfadoperationen* erfordern einen `X-Token`-Header.
Wenn Sie mรถchten, dass der Client Informationen im Request รผbergibt und Sie nicht wissen, wie das geht, kรถnnen Sie suchen (googeln), wie es mit `httpx` gemacht wird, oder sogar, wie es mit `requests` gemacht wird, da das Design von HTTPX auf dem Design von Requests basiert.
Wenn Sie mรถchten, dass der Client Informationen im Request รผbergibt und Sie nicht wissen, wie das geht, kรถnnen Sie suchen (googeln), wie es mit `httpx` gemacht wird, oder sogar, wie es mit `requests` gemacht wird, da das Design von HTTPX auf dem Design von Requests basiert.