committed by
GitHub
228 changed files with 7248 additions and 4054 deletions
@ -0,0 +1,218 @@ |
|||
# LLM-Test { #llm-test } |
|||
|
|||
Dieses Dokument testet, ob das <abbr title="Large Language Model – Großes Sprachmodell">LLM</abbr> die Anweisungen im allgemeinen Prompt in `scripts/translate.py` und diejenigen im sprachspezifischen Prompt `docs/{language code}/llm-prompt.md` versteht (die an die Anweisungen im allgemeinen Prompt angehängt werden). |
|||
|
|||
Wie folgt verwenden: |
|||
|
|||
* Eine frische Übersetzung dieses Dokuments in die gewünschte Zielsprache erstellen. |
|||
* Prüfen, ob alles größtenteils in Ordnung ist. |
|||
* Wenn manches nicht in Ordnung ist, sich aber durch Verbesserungen am allgemeinen Prompt oder am sprachspezifischen Prompt beheben lässt, das tun. |
|||
* Dann die verbleibenden Probleme in der Übersetzung manuell beheben, sodass es eine gute Übersetzung ist. |
|||
* Erneut übersetzen, wobei die existierende, gute Übersetzung verwendet wird. Das ideale Ergebnis wäre, dass das LLM gar keine Änderungen vornimmt. Das würde bedeuten, dass der allgemeine Prompt und der Sprach-Prompt so gut wie möglich sind. (Plot Twist: Es wird normalerweise ein paar scheinbar zufällige Änderungen machen, der Grund ist vermutlich, dass <a href="https://doublespeak.chat/#/handbook#deterministic-output" class="external-link" target="_blank">LLMs keine deterministischen Algorithmen sind</a>). |
|||
|
|||
Die Idee ist, dass Sie, wenn Sie an einer Übersetzung für eine Sprache arbeiten (unter der Annahme, dass Sie `scripts/translate.py` ausführen können), hier Beispiele gefundener Sonderfälle aufnehmen (keine detaillierte Liste, nur Beispiele für solche Sonderfälle) und mit diesem Dokument testen, statt jedes andere einzelne Dokument mehrfach zu testen und zu übersetzen, was pro Übersetzung ein paar Cent kostet. Außerdem werden durch das Hinzufügen solcher Sonderfälle hier auch andere Übersetzungsprojekte auf solche Sonderfälle aufmerksam. |
|||
|
|||
## Codeschnipsel { #codesnippets} |
|||
|
|||
Dies ist ein Codeschnipsel: `foo`. Und dies ist ein weiteres Codeschnipsel: `bar`. Und noch eins: `baz quux`. |
|||
|
|||
## Anführungszeichen { #quotes } |
|||
|
|||
Gestern schrieb mein Freund: „Wenn man falsch richtig buchstabiert, hat man es falsch buchstabiert“. Worauf ich antwortete: „Richtig, aber ‚falsch‘ ist fälschlich nicht ‚„falsch“‘“. |
|||
|
|||
## Anführungszeichen in Codeschnipseln { #quotes-in-codesnippets} |
|||
|
|||
`pip install "foo[bar]"` |
|||
|
|||
Beispiele für Stringliterale in Codeschnipseln: `"this"`, `'that'`. |
|||
|
|||
Ein schwieriges Beispiel für Stringliterale in Codeschnipseln: `f"I like {'oranges' if orange else "apples"}"` |
|||
|
|||
Hardcore: `Yesterday my friend wrote: "If you spell incorrectly correctly you have spelled it incorrectly". To which I answered: "Correct, but 'incorrectly' is incorrectly not '"incorrectly"'!"` |
|||
|
|||
## Codeblöcke { #code-blocks } |
|||
|
|||
Ein Bash-Codebeispiel ... |
|||
|
|||
```bash |
|||
# Gruß an das Universum ausgeben |
|||
echo "Hello universe" |
|||
``` |
|||
|
|||
... und ein Konsolen-Codebeispiel ... |
|||
|
|||
```console |
|||
$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid">main.py</u> |
|||
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting server |
|||
Searching for package file structure |
|||
``` |
|||
|
|||
... und noch ein Konsolen-Codebeispiel ... |
|||
|
|||
```console |
|||
// Erstellen Sie ein Verzeichnis "Code" |
|||
$ mkdir code |
|||
// Wechseln Sie in dieses Verzeichnis |
|||
$ cd code |
|||
``` |
|||
|
|||
... und ein Python-Codebeispiel ... |
|||
|
|||
```Python |
|||
wont_work() # Das wird nicht funktionieren 😱 |
|||
works(foo="bar") # Das funktioniert 🎉 |
|||
``` |
|||
|
|||
... und das war’s. |
|||
|
|||
## Tabs und farbige Kästen { #tabs-and-colored-boxes } |
|||
|
|||
//// tab | Dies ist ein Tab |
|||
|
|||
/// info | Info |
|||
Etwas Text |
|||
/// |
|||
|
|||
/// note | Hinweis |
|||
Etwas Text |
|||
/// |
|||
|
|||
/// note | Technische Details |
|||
Etwas Text |
|||
/// |
|||
|
|||
/// check | Testen |
|||
Etwas Text |
|||
/// |
|||
|
|||
/// tip | Tipp |
|||
Etwas Text |
|||
/// |
|||
|
|||
/// warning | Achtung |
|||
Etwas Text |
|||
/// |
|||
|
|||
/// danger | Gefahr |
|||
Etwas Text |
|||
/// |
|||
|
|||
//// |
|||
|
|||
## Web- und interne Links { #links } |
|||
|
|||
[Link zur Überschrift oben](#codesnippets) |
|||
|
|||
<a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">Externer Link</a> |
|||
|
|||
<a href="https://fastapi.tiangolo.com/de/the/link/#target" class="external-link" target="_blank">FastAPI-Link</a> |
|||
|
|||
<a href="https://fastapi.tiangolo.com/css/styles.css" class="external-link" target="_blank">Link zu einem Stil</a> |
|||
<a href="https://fastapi.tiangolo.com/js/logic.js" class="external-link" target="_blank">Link zu einem Skript</a> |
|||
<a href="https://fastapi.tiangolo.com/img/foo.jpg" class="external-link" target="_blank">Link zu einem Bild</a> |
|||
|
|||
[Interner Link](foo.md#bar){.internal-link target=_blank} |
|||
|
|||
## Abbr-Elemente { #abbr-elements } |
|||
|
|||
Hier einige Dinge, die in `abbr`-Elemente gehüllt sind (einige sind erfunden): <abbr title="Getting Things Done – Dinge erledigt bekommen">GTD</abbr>, <abbr title="XML-Web-Token">XWT</abbr>, <abbr title="Paralleles Server-Gateway-Interface">PSGI</abbr>, <abbr title="Eine Gruppe von Maschinen, die so konfiguriert sind, dass sie verbunden sind und in irgendeiner Weise zusammenarbeiten.">Cluster</abbr>, <abbr title="Eine Methode des maschinellen Lernens, die künstliche neuronale Netze mit zahlreichen verdeckten Schichten zwischen Eingabe- und Ausgabeschichten verwendet und dabei eine umfassende interne Struktur entwickelt">Deep Learning</abbr>, <abbr title="Mozilla Developer Network – Mozilla-Entwicklernetzwerk: Dokumentation für Entwickler, geschrieben von den Firefox-Leuten">MDN</abbr>. |
|||
|
|||
## Überschriften { #headings } |
|||
|
|||
### Eine Webapp entwickeln – ein Tutorial { #develop-a-webapp-a-tutorial } |
|||
|
|||
Hallo. |
|||
|
|||
### Typhinweise und -annotationen { #type-hints-and-annotations } |
|||
|
|||
Hallo nochmal. |
|||
|
|||
### Super- und Subklassen { #super-and-subclasses } |
|||
|
|||
Hallo nochmal. |
|||
|
|||
## Sätze mit bevorzugten Übersetzungen (vielleicht) im Sprach-Prompt definiert { #sentences-with-preferred-translations-maybe-defined-in-the-language-prompt } |
|||
|
|||
Ich heiße Sie willkommen. |
|||
Ich bewundere Ihren Pullover. |
|||
Sie mag Obst, z. B. Äpfel |
|||
Er mag Orangen, Bananen, usw. |
|||
Lesen Sie die `PATH`-Umgebungsvariable. |
|||
Was dasselbe ist wie der `PATH`. |
|||
Installieren Sie aus der `requirements.txt`. |
|||
Verwenden Sie den API-Router. |
|||
Starten Sie die App. |
|||
Erstellen Sie die Anwendung. |
|||
Lesen Sie das Tutorial – Benutzerhandbuch. |
|||
Lesen Sie dann das Handbuch für fortgeschrittene Benutzer. |
|||
Dies ist der Autorisierungsheader. |
|||
Dies ist der `Authorization`-Header. |
|||
Warten auf den Hintergrundtask. |
|||
Probieren Sie diesen Cloudanbieter. |
|||
Verwenden Sie das CLI. |
|||
Was das Kommandozeileninterface ist. |
|||
Lesen Sie die Dokumentation. |
|||
Der Defaultwert ist „foo“. |
|||
Die Default-Deklaration ist „bar“. |
|||
Die Engine wird das tun. |
|||
Wenn die Umgebungsvariable existiert, tun Sie etwas. |
|||
Eine Error-Response zurückgeben. |
|||
Auf das Event warten. |
|||
Die Exception auslösen. |
|||
Der Exceptionhandler behandelt sie. |
|||
Das Formularmodell definieren. |
|||
Den Formularbody senden. |
|||
Auf den Header zugreifen. |
|||
Die Header ändern. |
|||
Schreibweise in Headern. |
|||
Auf das Lifespan-Event lauschen. |
|||
Locking bedeutet, dass wir ein Lock setzen, um etwas sicher zu ändern. |
|||
Eine Mobile-Anwendung entwickeln. |
|||
Das Modellobjekt definieren. |
|||
Etwas wartet auf das Mounten. |
|||
Es ist jetzt gemountet. |
|||
Ein weiteres Origin. |
|||
Dafür haben wir eine Überschreibung. |
|||
Die Funktion hat einen Parameter. |
|||
Der Funktionsparameter ist ein int. |
|||
Die Funktion hat viele Parameter. |
|||
Der Defaultparameter ist ein bool. |
|||
Der Body-Parameter enthält den Body des Requests. |
|||
Auch der Requestbody-Parameter genannt. |
|||
Der Pfad-Parameter enthält eine Variable im Requestpfad. |
|||
Der Query-Parameter enthält die Query-Parameter im Requestpfad. |
|||
Der Cookie-Parameter enthält die Request-Cookies. |
|||
Der Header-Parameter enthält die Request-Header. |
|||
Der Formular-Parameter enthält die Formularfelder des Requests. |
|||
Die Payload ist der Request/die Response ohne Metadaten. |
|||
Diese Query fragt nach Items, die älter als eine Woche sind. |
|||
Zusammenfassung: Es ist smooth. |
|||
Der Request wurde empfangen. |
|||
Den Requestbody empfangen. |
|||
Die Requestbodys empfangen. |
|||
Die Response zurückgeben. |
|||
Was eine Funktion zurückgibt, hat einen Rückgabewert. |
|||
Und einen Rückgabetyp. |
|||
Details sind in der SQLModel-Dokumentation beschrieben. |
|||
Verwenden Sie das SDK. |
|||
Der Tag `Horst` bedeutet, Horst muss es tun. |
|||
Dieser Parameter hat eine Typannotation. |
|||
Was ein Typhinweis ist. |
|||
Die Wildcard ist `*`. |
|||
Die Workerklasse macht dies und das. |
|||
Der Workerprozess macht auch Dinge. |
|||
Ich werde das morgen committen. |
|||
Gestern habe ich den Code geändert. |
|||
Lassen Sie uns unsere App bereitstellen. |
|||
Lassen Sie uns diese Seite ausliefern. |
|||
Aktualisieren Sie FastAPI, bevor Sie das tun. |
|||
Dies ist in ein HTML-Tag gewrappt. |
|||
`foo` vom Typ `int`. |
|||
`bar` vom Typ `str`. |
|||
`baz` vom Typ `list`. |
|||
FastAPIs Dokumentation. |
|||
Starlettes Performance. |
|||
Groß-/Kleinschreibung ist relevant in `foo`. |
|||
Groß-/Kleinschreibung ist nicht relevant in „Bar“. |
|||
Standard-Python-Klassen. |
|||
Dies ist deprecatet. |
@ -1,3 +1,3 @@ |
|||
# Über |
|||
# Über { #about } |
|||
|
|||
Über FastAPI, sein Design, seine Inspiration und mehr. 🤓 |
|||
|
@ -1,31 +1,31 @@ |
|||
# Response – Statuscode ändern |
|||
# Response – Statuscode ändern { #response-change-status-code } |
|||
|
|||
Sie haben wahrscheinlich schon vorher gelesen, dass Sie einen Standard-[Response-Statuscode](../tutorial/response-status-code.md){.internal-link target=_blank} festlegen können. |
|||
Sie haben wahrscheinlich schon vorher gelesen, dass Sie einen Default-[Response-Statuscode](../tutorial/response-status-code.md){.internal-link target=_blank} festlegen können. |
|||
|
|||
In manchen Fällen müssen Sie jedoch einen anderen als den Standard-Statuscode zurückgeben. |
|||
In manchen Fällen müssen Sie jedoch einen anderen als den Default-Statuscode zurückgeben. |
|||
|
|||
## Anwendungsfall |
|||
## Anwendungsfall { #use-case } |
|||
|
|||
Stellen Sie sich zum Beispiel vor, Sie möchten standardmäßig den HTTP-Statuscode „OK“ `200` zurückgeben. |
|||
|
|||
Wenn die Daten jedoch nicht vorhanden waren, möchten Sie diese erstellen und den HTTP-Statuscode „CREATED“ `201` zurückgeben. |
|||
Wenn die Daten jedoch nicht vorhanden sind, möchten Sie diese erstellen und den HTTP-Statuscode „CREATED“ `201` zurückgeben. |
|||
|
|||
Sie möchten aber dennoch in der Lage sein, die von Ihnen zurückgegebenen Daten mit einem `response_model` zu filtern und zu konvertieren. |
|||
|
|||
In diesen Fällen können Sie einen `Response`-Parameter verwenden. |
|||
|
|||
## Einen `Response`-Parameter verwenden |
|||
## Einen `Response`-Parameter verwenden { #use-a-response-parameter } |
|||
|
|||
Sie können einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion* deklarieren (wie Sie es auch für Cookies und Header tun können). |
|||
|
|||
Anschließend können Sie den `status_code` in diesem *vorübergehenden* Response-Objekt festlegen. |
|||
Anschließend können Sie den `status_code` in diesem *vorübergehenden* <abbr title="Response – Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>-Objekt festlegen. |
|||
|
|||
{* ../../docs_src/response_change_status_code/tutorial001.py hl[1,9,12] *} |
|||
|
|||
Und dann können Sie wie gewohnt jedes benötigte Objekt zurückgeben (ein `dict`, ein Datenbankmodell usw.). |
|||
Und dann können Sie jedes benötigte Objekt zurückgeben, wie Sie es normalerweise tun würden (ein `dict`, ein Datenbankmodell usw.). |
|||
|
|||
Und wenn Sie ein `response_model` deklariert haben, wird es weiterhin zum Filtern und Konvertieren des von Ihnen zurückgegebenen Objekts verwendet. |
|||
|
|||
**FastAPI** verwendet diese *vorübergehende* Response, um den Statuscode (auch Cookies und Header) zu extrahieren und fügt diese in die endgültige Response ein, die den von Ihnen zurückgegebenen Wert enthält, gefiltert nach einem beliebigen `response_model`. |
|||
|
|||
Sie können den Parameter `Response` auch in Abhängigkeiten deklarieren und den Statuscode darin festlegen. Bedenken Sie jedoch, dass der gewinnt, welcher zuletzt gesetzt wird. |
|||
Sie können den Parameter `Response` auch in Abhängigkeiten deklarieren und den Statuscode darin festlegen. Bedenken Sie jedoch, dass der zuletzt gesetzte gewinnt. |
|||
|
@ -1,17 +1,18 @@ |
|||
# FastAPI-Deployment bei Cloud-Anbietern |
|||
# FastAPI bei Cloudanbietern bereitstellen { #deploy-fastapi-on-cloud-providers } |
|||
|
|||
Sie können praktisch **jeden Cloud-Anbieter** für das <abbr title="Bereitstellen der fertigen Anwendung für die Endbenutzer">Deployment</abbr> Ihrer FastAPI-Anwendung verwenden. |
|||
Sie können praktisch **jeden Cloudanbieter** verwenden, um Ihre FastAPI-Anwendung bereitzustellen. |
|||
|
|||
In den meisten Fällen verfügen die Haupt-Cloud-Anbieter über Anleitungen zum Deployment von FastAPI. |
|||
In den meisten Fällen bieten die großen Cloudanbieter Anleitungen zum Bereitstellen von FastAPI an. |
|||
|
|||
## Cloud-Anbieter – Sponsoren |
|||
## Cloudanbieter – Sponsoren { #cloud-providers-sponsors } |
|||
|
|||
Einige Cloud-Anbieter ✨ [**sponsern FastAPI**](../help-fastapi.md#den-autor-sponsern){.internal-link target=_blank} ✨, dies gewährleistet die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ökosystem**. |
|||
Einige Cloudanbieter ✨ [**sponsern FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨, dies stellt die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ökosystem** sicher. |
|||
|
|||
Und es zeigt deren wahres Engagement für FastAPI und seine **Community** (Sie), da diese Ihnen nicht nur einen **guten Service** bieten möchten, sondern auch sicherstellen möchten, dass Sie über ein **gutes und gesundes Framework** verfügen, FastAPI. 🙇 |
|||
Und es zeigt ihr wahres Engagement für FastAPI und seine **Community** (Sie), da sie Ihnen nicht nur einen **guten Service** bieten möchten, sondern auch sicherstellen möchten, dass Sie ein **gutes und gesundes Framework**, FastAPI, haben. 🙇 |
|||
|
|||
Vielleicht möchten Sie deren Dienste ausprobieren und deren Anleitungen folgen: |
|||
|
|||
* <a href="https://docs.platform.sh/languages/python.html?utm_source=fastapi-signup&utm_medium=banner&utm_campaign=FastAPI-signup-June-2023" class="external-link" target="_blank">Platform.sh</a> |
|||
* <a href="https://docs.porter.run/language-specific-guides/fastapi" class="external-link" target="_blank">Porter</a> |
|||
* <a href="https://docs.withcoherence.com/docs/configuration/frameworks?utm_medium=advertising&utm_source=fastapi&utm_campaign=banner%20january%2024#fast-api-example" class="external-link" target="_blank">Coherence</a> |
|||
* <a href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" class="external-link" target="_blank">Render</a> |
|||
* <a href="https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi" class="external-link" target="_blank">Railway</a> |
|||
|
@ -0,0 +1,298 @@ |
|||
# Umgebungsvariablen { #environment-variables } |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Wenn Sie bereits wissen, was „Umgebungsvariablen“ sind und wie man sie verwendet, können Sie dies überspringen. |
|||
|
|||
/// |
|||
|
|||
Eine Umgebungsvariable (auch bekannt als „**env var**“) ist eine Variable, die **außerhalb** des Python-Codes im **Betriebssystem** lebt und von Ihrem Python-Code (oder auch von anderen Programmen) gelesen werden kann. |
|||
|
|||
Umgebungsvariablen können nützlich sein, um **Einstellungen** der Anwendung zu handhaben, als Teil der **Installation** von Python usw. |
|||
|
|||
## Umgebungsvariablen erstellen und verwenden { #create-and-use-env-vars } |
|||
|
|||
Sie können Umgebungsvariablen in der **Shell (Terminal)** erstellen und verwenden, ohne Python zu benötigen: |
|||
|
|||
//// tab | Linux, macOS, Windows Bash |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Sie können eine Umgebungsvariable MY_NAME erstellen mit |
|||
$ export MY_NAME="Wade Wilson" |
|||
|
|||
// Dann können Sie sie mit anderen Programmen verwenden, etwa |
|||
$ echo "Hello $MY_NAME" |
|||
|
|||
Hello Wade Wilson |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
//// |
|||
|
|||
//// tab | Windows PowerShell |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Erstellen Sie eine Umgebungsvariable MY_NAME |
|||
$ $Env:MY_NAME = "Wade Wilson" |
|||
|
|||
// Verwenden Sie sie mit anderen Programmen, etwa |
|||
$ echo "Hello $Env:MY_NAME" |
|||
|
|||
Hello Wade Wilson |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
//// |
|||
|
|||
## Umgebungsvariablen in Python lesen { #read-env-vars-in-python } |
|||
|
|||
Sie können auch Umgebungsvariablen **außerhalb** von Python erstellen, im Terminal (oder mit jeder anderen Methode) und sie dann **in Python** lesen. |
|||
|
|||
Zum Beispiel könnten Sie eine Datei `main.py` haben mit: |
|||
|
|||
```Python hl_lines="3" |
|||
import os |
|||
|
|||
name = os.getenv("MY_NAME", "World") |
|||
print(f"Hello {name} from Python") |
|||
``` |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Das zweite Argument von <a href="https://docs.python.org/3.8/library/os.html#os.getenv" class="external-link" target="_blank">`os.getenv()`</a> ist der Defaultwert, der zurückgegeben wird. |
|||
|
|||
Wenn er nicht angegeben wird, ist er standardmäßig `None`. Hier geben wir `"World"` als den zu verwendenden Defaultwert an. |
|||
|
|||
/// |
|||
|
|||
Dann könnten Sie das Python-Programm aufrufen: |
|||
|
|||
//// tab | Linux, macOS, Windows Bash |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Hier setzen wir die Umgebungsvariable noch nicht |
|||
$ python main.py |
|||
|
|||
// Da wir die Umgebungsvariable nicht gesetzt haben, erhalten wir den Defaultwert |
|||
|
|||
Hello World from Python |
|||
|
|||
// Aber wenn wir zuerst eine Umgebungsvariable erstellen |
|||
$ export MY_NAME="Wade Wilson" |
|||
|
|||
// Und dann das Programm erneut aufrufen |
|||
$ python main.py |
|||
|
|||
// Jetzt kann es die Umgebungsvariable lesen |
|||
|
|||
Hello Wade Wilson from Python |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
//// |
|||
|
|||
//// tab | Windows PowerShell |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Hier setzen wir die Umgebungsvariable noch nicht |
|||
$ python main.py |
|||
|
|||
// Da wir die Umgebungsvariable nicht gesetzt haben, erhalten wir den Defaultwert |
|||
|
|||
Hello World from Python |
|||
|
|||
// Aber wenn wir zuerst eine Umgebungsvariable erstellen |
|||
$ $Env:MY_NAME = "Wade Wilson" |
|||
|
|||
// Und dann das Programm erneut aufrufen |
|||
$ python main.py |
|||
|
|||
// Jetzt kann es die Umgebungsvariable lesen |
|||
|
|||
Hello Wade Wilson from Python |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
//// |
|||
|
|||
Da Umgebungsvariablen außerhalb des Codes gesetzt werden können, aber vom Code gelesen werden können und nicht mit den restlichen Dateien gespeichert (in `git` committet) werden müssen, werden sie häufig für Konfigurationen oder **Einstellungen** verwendet. |
|||
|
|||
Sie können auch eine Umgebungsvariable nur für einen **spezifischen Programmaufruf** erstellen, die nur für dieses Programm und nur für dessen Dauer verfügbar ist. |
|||
|
|||
Um dies zu tun, erstellen Sie sie direkt vor dem Programmaufruf, in derselben Zeile: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Erstellen Sie eine Umgebungsvariable MY_NAME in der Zeile für diesen Programmaufruf |
|||
$ MY_NAME="Wade Wilson" python main.py |
|||
|
|||
// Jetzt kann es die Umgebungsvariable lesen |
|||
|
|||
Hello Wade Wilson from Python |
|||
|
|||
// Die Umgebungsvariable existiert danach nicht mehr |
|||
$ python main.py |
|||
|
|||
Hello World from Python |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Sie können mehr darüber lesen auf <a href="https://12factor.net/config" class="external-link" target="_blank">The Twelve-Factor App: Config</a>. |
|||
|
|||
/// |
|||
|
|||
## Typen und Validierung { #types-and-validation } |
|||
|
|||
Diese Umgebungsvariablen können nur **Textstrings** handhaben, da sie extern zu Python sind und kompatibel mit anderen Programmen und dem Rest des Systems (und sogar mit verschiedenen Betriebssystemen, wie Linux, Windows, macOS) sein müssen. |
|||
|
|||
Das bedeutet, dass **jeder Wert**, der in Python von einer Umgebungsvariable gelesen wird, **ein `str` sein wird**, und jede Konvertierung in einen anderen Typ oder jede Validierung muss im Code vorgenommen werden. |
|||
|
|||
Sie werden mehr darüber lernen, wie man Umgebungsvariablen zur Handhabung von **Anwendungseinstellungen** verwendet, im [Handbuch für fortgeschrittene Benutzer – Einstellungen und Umgebungsvariablen](./advanced/settings.md){.internal-link target=_blank}. |
|||
|
|||
## `PATH`-Umgebungsvariable { #path-environment-variable } |
|||
|
|||
Es gibt eine **spezielle** Umgebungsvariable namens **`PATH`**, die von den Betriebssystemen (Linux, macOS, Windows) verwendet wird, um Programme zu finden, die ausgeführt werden sollen. |
|||
|
|||
Der Wert der Variable `PATH` ist ein langer String, der aus Verzeichnissen besteht, die auf Linux und macOS durch einen Doppelpunkt `:` und auf Windows durch ein Semikolon `;` getrennt sind. |
|||
|
|||
Zum Beispiel könnte die `PATH`-Umgebungsvariable so aussehen: |
|||
|
|||
//// tab | Linux, macOS |
|||
|
|||
```plaintext |
|||
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin |
|||
``` |
|||
|
|||
Das bedeutet, dass das System nach Programmen in den Verzeichnissen suchen sollte: |
|||
|
|||
* `/usr/local/bin` |
|||
* `/usr/bin` |
|||
* `/bin` |
|||
* `/usr/sbin` |
|||
* `/sbin` |
|||
|
|||
//// |
|||
|
|||
//// tab | Windows |
|||
|
|||
```plaintext |
|||
C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32 |
|||
``` |
|||
|
|||
Das bedeutet, dass das System nach Programmen in den Verzeichnissen suchen sollte: |
|||
|
|||
* `C:\Program Files\Python312\Scripts` |
|||
* `C:\Program Files\Python312` |
|||
* `C:\Windows\System32` |
|||
|
|||
//// |
|||
|
|||
Wenn Sie einen **Befehl** im Terminal eingeben, **sucht** das Betriebssystem nach dem Programm in **jedem dieser Verzeichnisse**, die in der `PATH`-Umgebungsvariable aufgeführt sind. |
|||
|
|||
Zum Beispiel, wenn Sie `python` im Terminal eingeben, sucht das Betriebssystem nach einem Programm namens `python` im **ersten Verzeichnis** in dieser Liste. |
|||
|
|||
Wenn es es findet, wird es **benutzt**. Andernfalls sucht es weiter in den **anderen Verzeichnissen**. |
|||
|
|||
### Python installieren und den `PATH` aktualisieren { #installing-python-and-updating-the-path } |
|||
|
|||
Wenn Sie Python installieren, könnten Sie gefragt werden, ob Sie die `PATH`-Umgebungsvariable aktualisieren möchten. |
|||
|
|||
//// tab | Linux, macOS |
|||
|
|||
Angenommen, Sie installieren Python und es landet in einem Verzeichnis `/opt/custompython/bin`. |
|||
|
|||
Wenn Sie erlauben, die `PATH`-Umgebungsvariable zu aktualisieren, fügt der Installer `/opt/custompython/bin` zur `PATH`-Umgebungsvariable hinzu. |
|||
|
|||
Das könnte so aussehen: |
|||
|
|||
```plaintext |
|||
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin |
|||
``` |
|||
|
|||
Auf diese Weise, wenn Sie `python` im Terminal eingeben, findet das System das Python-Programm in `/opt/custompython/bin` (das letzte Verzeichnis) und verwendet dieses. |
|||
|
|||
//// |
|||
|
|||
//// tab | Windows |
|||
|
|||
Angenommen, Sie installieren Python und es landet in einem Verzeichnis `C:\opt\custompython\bin`. |
|||
|
|||
Wenn Sie erlauben, die `PATH`-Umgebungsvariable zu aktualisieren, fügt der Installer `C:\opt\custompython\bin` zur `PATH`-Umgebungsvariable hinzu. |
|||
|
|||
```plaintext |
|||
C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32;C:\opt\custompython\bin |
|||
``` |
|||
|
|||
Auf diese Weise, wenn Sie `python` im Terminal eingeben, findet das System das Python-Programm in `C:\opt\custompython\bin` (das letzte Verzeichnis) und verwendet dieses. |
|||
|
|||
//// |
|||
|
|||
Also, wenn Sie tippen: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ python |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
//// tab | Linux, macOS |
|||
|
|||
Das System wird das `python` Programm in `/opt/custompython/bin` **finden** und es ausführen. |
|||
|
|||
Es wäre ungefähr gleichbedeutend mit der Eingabe von: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ /opt/custompython/bin/python |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
//// |
|||
|
|||
//// tab | Windows |
|||
|
|||
Das System wird das `python` Programm in `C:\opt\custompython\bin\python` **finden** und es ausführen. |
|||
|
|||
Es wäre ungefähr gleichbedeutend mit der Eingabe von: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ C:\opt\custompython\bin\python |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
//// |
|||
|
|||
Diese Informationen werden nützlich sein, wenn Sie über [Virtuelle Umgebungen](virtual-environments.md){.internal-link target=_blank} lernen. |
|||
|
|||
## Fazit { #conclusion } |
|||
|
|||
Mit diesem Wissen sollten Sie ein grundlegendes Verständnis davon haben, was **Umgebungsvariablen** sind und wie man sie in Python verwendet. |
|||
|
|||
Sie können auch mehr darüber in der <a href="https://en.wikipedia.org/wiki/Environment_variable" class="external-link" target="_blank">Wikipedia zu Umgebungsvariablen</a> lesen. |
|||
|
|||
In vielen Fällen ist es nicht sehr offensichtlich, wie Umgebungsvariablen nützlich und sofort anwendbar sein könnten. Aber sie tauchen immer wieder in vielen verschiedenen Szenarien auf, wenn Sie entwickeln, deshalb ist es gut, darüber Bescheid zu wissen. |
|||
|
|||
Zum Beispiel werden Sie diese Informationen im nächsten Abschnitt über [Virtuelle Umgebungen](virtual-environments.md) benötigen. |
@ -0,0 +1,75 @@ |
|||
# FastAPI CLI { #fastapi-cli } |
|||
|
|||
**FastAPI CLI** ist ein Kommandozeilenprogramm, mit dem Sie Ihre FastAPI-App bereitstellen, Ihr FastAPI-Projekt verwalten und mehr. |
|||
|
|||
Wenn Sie FastAPI installieren (z. B. mit `pip install "fastapi[standard]"`), wird ein Package namens `fastapi-cli` mitgeliefert, das den Befehl `fastapi` im Terminal bereitstellt. |
|||
|
|||
Um Ihre FastAPI-App für die Entwicklung auszuführen, können Sie den Befehl `fastapi dev` verwenden: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u> |
|||
|
|||
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server 🚀 |
|||
|
|||
Searching for package file structure from directories with |
|||
<font color="#3465A4">__init__.py</font> files |
|||
Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font> |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> 🐍 main.py |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with the |
|||
following code: |
|||
|
|||
<u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u> |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font> |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font> |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000/docs</u></font> |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> tip </font></span> Running in development mode, for production use: |
|||
<b>fastapi run</b> |
|||
|
|||
Logs: |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Will watch for changes in these directories: |
|||
<b>[</b><font color="#4E9A06">'/home/user/code/awesomeapp'</font><b>]</b> |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font> <b>(</b>Press CTRL+C to |
|||
quit<b>)</b> |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started reloader process <b>[</b><font color="#34E2E2"><b>383138</b></font><b>]</b> using WatchFiles |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>383153</b></font><b>]</b> |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup. |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete. |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Das Kommandozeilenprogramm namens `fastapi` ist die **FastAPI-CLI**. |
|||
|
|||
FastAPI-CLI nimmt den Pfad zu Ihrem Python-Programm (z. B. `main.py`), erkennt automatisch die `FastAPI`-Instanz (häufig `app` genannt), bestimmt den korrekten Importprozess und stellt sie dann bereit. |
|||
|
|||
Für die Produktion würden Sie stattdessen `fastapi run` verwenden. 🚀 |
|||
|
|||
Intern verwendet die **FastAPI CLI** <a href="https://www.uvicorn.org" class="external-link" target="_blank">Uvicorn</a>, einen leistungsstarken, produktionsreifen, ASGI-Server. 😎 |
|||
|
|||
## `fastapi dev` { #fastapi-dev } |
|||
|
|||
Das Ausführen von `fastapi dev` startet den Entwicklermodus. |
|||
|
|||
Standardmäßig ist **Autoreload** aktiviert, das den Server automatisch neu lädt, wenn Sie Änderungen an Ihrem Code vornehmen. Dies ist ressourcenintensiv und könnte weniger stabil sein als wenn es deaktiviert ist. Sie sollten es nur für die Entwicklung verwenden. Es horcht auch auf der IP-Adresse `127.0.0.1`, die die IP für Ihre Maschine ist, um nur mit sich selbst zu kommunizieren (`localhost`). |
|||
|
|||
## `fastapi run` { #fastapi-run } |
|||
|
|||
Das Ausführen von `fastapi run` startet FastAPI standardmäßig im Produktionsmodus. |
|||
|
|||
Standardmäßig ist **Autoreload** deaktiviert. Es horcht auch auf der IP-Adresse `0.0.0.0`, was alle verfügbaren IP-Adressen bedeutet, so wird es öffentlich zugänglich für jeden, der mit der Maschine kommunizieren kann. So würden Sie es normalerweise in der Produktion ausführen, beispielsweise in einem Container. |
|||
|
|||
In den meisten Fällen würden (und sollten) Sie einen „Terminierungsproxy“ haben, der HTTPS für Sie verwaltet. Dies hängt davon ab, wie Sie Ihre Anwendung bereitstellen. Ihr Anbieter könnte dies für Sie erledigen, oder Sie müssen es selbst einrichten. |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Sie können mehr darüber in der [Deployment-Dokumentation](deployment/index.md){.internal-link target=_blank} erfahren. |
|||
|
|||
/// |
@ -1,39 +1,39 @@ |
|||
# Allgemeines – How-To – Rezepte |
|||
# Allgemeines – How-To – Rezepte { #general-how-to-recipes } |
|||
|
|||
Hier finden Sie mehrere Verweise auf andere Stellen in der Dokumentation, für allgemeine oder häufige Fragen. |
|||
|
|||
## Daten filtern – Sicherheit |
|||
## Daten filtern – Sicherheit { #filter-data-security } |
|||
|
|||
Um sicherzustellen, dass Sie nicht mehr Daten zurückgeben, als Sie sollten, lesen Sie die Dokumentation unter [Tutorial – Responsemodell – Rückgabetyp](../tutorial/response-model.md){.internal-link target=_blank}. |
|||
|
|||
## Dokumentations-Tags – OpenAPI |
|||
## Dokumentations-Tags – OpenAPI { #documentation-tags-openapi } |
|||
|
|||
Um Tags zu Ihren *Pfadoperationen* hinzuzufügen und diese in der Oberfläche der Dokumentation zu gruppieren, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Tags](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}. |
|||
|
|||
## Zusammenfassung und Beschreibung in der Dokumentation – OpenAPI |
|||
## Zusammenfassung und Beschreibung in der Dokumentation – OpenAPI { #documentation-summary-and-description-openapi } |
|||
|
|||
Um Ihren *Pfadoperationen* eine Zusammenfassung und Beschreibung hinzuzufügen und diese in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Zusammenfassung und Beschreibung](../tutorial/path-operation-configuration.md#zusammenfassung-und-beschreibung){.internal-link target=_blank}. |
|||
Um Ihren *Pfadoperationen* eine Zusammenfassung und Beschreibung hinzuzufügen und diese in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Zusammenfassung und Beschreibung](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}. |
|||
|
|||
## Beschreibung der Response in der Dokumentation – OpenAPI |
|||
## Beschreibung der Response in der Dokumentation – OpenAPI { #documentation-response-description-openapi } |
|||
|
|||
Um die Beschreibung der Response zu definieren, welche in der Oberfläche der Dokumentation angezeigt wird, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Beschreibung der Response](../tutorial/path-operation-configuration.md#beschreibung-der-response){.internal-link target=_blank}. |
|||
Um die Beschreibung der Response zu definieren, welche in der Oberfläche der Dokumentation angezeigt wird, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Beschreibung der Response](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}. |
|||
|
|||
## *Pfadoperation* in der Dokumentation deprecaten – OpenAPI |
|||
## *Pfadoperation* in der Dokumentation deprecaten – OpenAPI { #documentation-deprecate-a-path-operation-openapi } |
|||
|
|||
Um eine *Pfadoperation* zu deprecaten – sie als veraltet zu markieren – und das in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Deprecaten](../tutorial/path-operation-configuration.md#eine-pfadoperation-deprecaten){.internal-link target=_blank}. |
|||
Um eine *Pfadoperation* zu <abbr title="veraltet, obsolet: Es soll nicht mehr verwendet werden">deprecaten</abbr> und das in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Deprecaten](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}. |
|||
|
|||
## Daten in etwas JSON-kompatibles konvertieren |
|||
## Daten in etwas JSON-kompatibles konvertieren { #convert-any-data-to-json-compatible } |
|||
|
|||
Um Daten in etwas JSON-kompatibles zu konvertieren, lesen Sie die Dokumentation unter [Tutorial – JSON-kompatibler Encoder](../tutorial/encoder.md){.internal-link target=_blank}. |
|||
|
|||
## OpenAPI-Metadaten – Dokumentation |
|||
## OpenAPI-Metadaten – Dokumentation { #openapi-metadata-docs } |
|||
|
|||
Um Metadaten zu Ihrem OpenAPI-Schema hinzuzufügen, einschließlich einer Lizenz, Version, Kontakt, usw., lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentationen](../tutorial/metadata.md){.internal-link target=_blank}. |
|||
Um Metadaten zu Ihrem OpenAPI-Schema hinzuzufügen, einschließlich einer Lizenz, Version, Kontakt, usw., lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentation](../tutorial/metadata.md){.internal-link target=_blank}. |
|||
|
|||
## Benutzerdefinierte OpenAPI-URL |
|||
## Benutzerdefinierte OpenAPI-URL { #openapi-custom-url } |
|||
|
|||
Um die OpenAPI-URL anzupassen (oder zu entfernen), lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentationen](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}. |
|||
Um die OpenAPI-URL anzupassen (oder zu entfernen), lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentation](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}. |
|||
|
|||
## URLs der OpenAPI-Dokumentationen |
|||
## URLs der OpenAPI-Dokumentationen { #openapi-docs-urls } |
|||
|
|||
Um die URLs zu aktualisieren, die für die automatisch generierten Dokumentations-Oberflächen verwendet werden, lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentationen](../tutorial/metadata.md#urls-der-dokumentationen){.internal-link target=_blank}. |
|||
Um die URLs zu aktualisieren, die für die automatisch generierten Dokumentations-Oberflächen verwendet werden, lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentation](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}. |
|||
|
@ -0,0 +1,7 @@ |
|||
# Eine Datenbank testen { #testing-a-database } |
|||
|
|||
Sie können sich über Datenbanken, SQL und SQLModel in der <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel-Dokumentation</a> informieren. 🤓 |
|||
|
|||
Es gibt ein kurzes <a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/" class="external-link" target="_blank">Tutorial zur Verwendung von SQLModel mit FastAPI</a>. ✨ |
|||
|
|||
Dieses Tutorial enthält einen Abschnitt über das <a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/" class="external-link" target="_blank">Testen von SQL-Datenbanken</a>. 😎 |
@ -1,5 +1,5 @@ |
|||
# Lernen |
|||
# Lernen { #learn } |
|||
|
|||
Hier finden Sie die einführenden Kapitel und Tutorials zum Erlernen von **FastAPI**. |
|||
Hier sind die einführenden Abschnitte und Tutorials, um **FastAPI** zu lernen. |
|||
|
|||
Sie könnten dies als **Buch**, als **Kurs**, als **offizielle** und empfohlene Methode zum Erlernen von FastAPI betrachten. 😎 |
|||
|
@ -1,84 +1,28 @@ |
|||
# Projektgenerierung – Vorlage |
|||
|
|||
Sie können einen Projektgenerator für den Einstieg verwenden, welcher einen Großteil der Ersteinrichtung, Sicherheit, Datenbank und einige API-Endpunkte bereits für Sie erstellt. |
|||
|
|||
Ein Projektgenerator verfügt immer über ein sehr spezifisches Setup, das Sie aktualisieren und an Ihre eigenen Bedürfnisse anpassen sollten, aber es könnte ein guter Ausgangspunkt für Ihr Projekt sein. |
|||
|
|||
## Full Stack FastAPI PostgreSQL |
|||
|
|||
GitHub: <a href="https://github.com/tiangolo/full-stack-fastapi-postgresql" class="external-link" target="_blank">https://github.com/tiangolo/full-stack-fastapi-postgresql</a> |
|||
|
|||
### Full Stack FastAPI PostgreSQL – Funktionen |
|||
|
|||
* Vollständige **Docker**-Integration (Docker-basiert). |
|||
* Docker-Schwarmmodus-Deployment. |
|||
* **Docker Compose**-Integration und Optimierung für die lokale Entwicklung. |
|||
* **Produktionsbereit** Python-Webserver, verwendet Uvicorn und Gunicorn. |
|||
* Python <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">**FastAPI**</a>-Backend: |
|||
* **Schnell**: Sehr hohe Leistung, auf Augenhöhe mit **NodeJS** und **Go** (dank Starlette und Pydantic). |
|||
* **Intuitiv**: Hervorragende Editor-Unterstützung. <abbr title="Auch bekannt als automatische Vervollständigung, IntelliSense">Codevervollständigung</abbr> überall. Weniger Zeitaufwand für das Debuggen. |
|||
* **Einfach**: Einfach zu bedienen und zu erlernen. Weniger Zeit für das Lesen von Dokumentationen. |
|||
* **Kurz**: Codeverdoppelung minimieren. Mehrere Funktionalitäten aus jeder Parameterdeklaration. |
|||
* **Robust**: Erhalten Sie produktionsbereiten Code. Mit automatischer, interaktiver Dokumentation. |
|||
* **Standards-basiert**: Basierend auf (und vollständig kompatibel mit) den offenen Standards für APIs: <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> und <a href="https://json-schema.org/" class="external-link" target="_blank">JSON Schema</a>. |
|||
* <a href="https://fastapi.tiangolo.com/features/" class="external-link" target="_blank">**Viele weitere Funktionen**</a>, einschließlich automatischer Validierung, Serialisierung, interaktiver Dokumentation, Authentifizierung mit OAuth2-JWT-Tokens, usw. |
|||
* **Sicheres Passwort**-Hashing standardmäßig. |
|||
* **JWT-Token**-Authentifizierung. |
|||
* **SQLAlchemy**-Modelle (unabhängig von Flask-Erweiterungen, sodass sie direkt mit Celery-Workern verwendet werden können). |
|||
* Grundlegende Startmodelle für Benutzer (ändern und entfernen Sie nach Bedarf). |
|||
* **Alembic**-Migrationen. |
|||
* **CORS** (Cross Origin Resource Sharing). |
|||
* **Celery**-Worker, welche Modelle und Code aus dem Rest des Backends selektiv importieren und verwenden können. |
|||
* REST-Backend-Tests basierend auf **Pytest**, integriert in Docker, sodass Sie die vollständige API-Interaktion unabhängig von der Datenbank testen können. Da es in Docker ausgeführt wird, kann jedes Mal ein neuer Datenspeicher von Grund auf erstellt werden (Sie können also ElasticSearch, MongoDB, CouchDB oder was auch immer Sie möchten verwenden und einfach testen, ob die API funktioniert). |
|||
* Einfache Python-Integration mit **Jupyter-Kerneln** für Remote- oder In-Docker-Entwicklung mit Erweiterungen wie Atom Hydrogen oder Visual Studio Code Jupyter. |
|||
* **Vue**-Frontend: |
|||
* Mit Vue CLI generiert. |
|||
* Handhabung der **JWT-Authentifizierung**. |
|||
* Login-View. |
|||
* Nach der Anmeldung Hauptansicht des Dashboards. |
|||
* Haupt-Dashboard mit Benutzererstellung und -bearbeitung. |
|||
* Bearbeitung des eigenen Benutzers. |
|||
* **Vuex**. |
|||
* **Vue-Router**. |
|||
* **Vuetify** für schöne Material-Designkomponenten. |
|||
* **TypeScript**. |
|||
* Docker-Server basierend auf **Nginx** (konfiguriert, um gut mit Vue-Router zu funktionieren). |
|||
* Mehrstufigen Docker-Erstellung, sodass Sie kompilierten Code nicht speichern oder committen müssen. |
|||
* Frontend-Tests, welche zur Erstellungszeit ausgeführt werden (können auch deaktiviert werden). |
|||
* So modular wie möglich gestaltet, sodass es sofort einsatzbereit ist. Sie können es aber mit Vue CLI neu generieren oder es so wie Sie möchten erstellen und wiederverwenden, was Sie möchten. |
|||
* **PGAdmin** für die PostgreSQL-Datenbank, können Sie problemlos ändern, sodass PHPMyAdmin und MySQL verwendet wird. |
|||
* **Flower** für die Überwachung von Celery-Jobs. |
|||
* Load Balancing zwischen Frontend und Backend mit **Traefik**, sodass Sie beide unter derselben Domain haben können, getrennt durch den Pfad, aber von unterschiedlichen Containern ausgeliefert. |
|||
* Traefik-Integration, einschließlich automatischer Generierung von Let's Encrypt-**HTTPS**-Zertifikaten. |
|||
* GitLab **CI** (kontinuierliche Integration), einschließlich Frontend- und Backend-Testen. |
|||
|
|||
## Full Stack FastAPI Couchbase |
|||
|
|||
GitHub: <a href="https://github.com/tiangolo/full-stack-fastapi-couchbase" class="external-link" target="_blank">https://github.com/tiangolo/full-stack-fastapi-couchbase</a> |
|||
|
|||
⚠️ **WARNUNG** ⚠️ |
|||
|
|||
Wenn Sie ein neues Projekt von Grund auf starten, prüfen Sie die Alternativen hier. |
|||
|
|||
Zum Beispiel könnte der Projektgenerator <a href="https://github.com/tiangolo/full-stack-fastapi-postgresql" class="external-link" target="_blank">Full Stack FastAPI PostgreSQL</a> eine bessere Alternative sein, da er aktiv gepflegt und genutzt wird. Und er enthält alle neuen Funktionen und Verbesserungen. |
|||
|
|||
Es steht Ihnen weiterhin frei, den Couchbase-basierten Generator zu verwenden, wenn Sie möchten. Er sollte wahrscheinlich immer noch gut funktionieren, und wenn Sie bereits ein Projekt damit erstellt haben, ist das auch in Ordnung (und Sie haben es wahrscheinlich bereits an Ihre Bedürfnisse angepasst). |
|||
|
|||
Weitere Informationen hierzu finden Sie in der Dokumentation des Repos. |
|||
|
|||
## Full Stack FastAPI MongoDB |
|||
|
|||
... könnte später kommen, abhängig von meiner verfügbaren Zeit und anderen Faktoren. 😅 🎉 |
|||
|
|||
## Modelle für maschinelles Lernen mit spaCy und FastAPI |
|||
|
|||
GitHub: <a href="https://github.com/microsoft/cookiecutter-spacy-fastapi" class="external-link" target="_blank">https://github.com/microsoft/cookiecutter-spacy-fastapi</a> |
|||
|
|||
### Modelle für maschinelles Lernen mit spaCy und FastAPI – Funktionen |
|||
|
|||
* **spaCy** NER-Modellintegration. |
|||
* **Azure Cognitive Search**-Anforderungsformat integriert. |
|||
* **Produktionsbereit** Python-Webserver, verwendet Uvicorn und Gunicorn. |
|||
* **Azure DevOps** Kubernetes (AKS) CI/CD-Deployment integriert. |
|||
* **Mehrsprachig** Wählen Sie bei der Projekteinrichtung ganz einfach eine der integrierten Sprachen von spaCy aus. |
|||
* **Einfach erweiterbar** auf andere Modellframeworks (Pytorch, Tensorflow), nicht nur auf SpaCy. |
|||
# Full Stack FastAPI Template { #full-stack-fastapi-template } |
|||
|
|||
Vorlagen, die normalerweise mit einem bestimmten Setup geliefert werden, sind so konzipiert, dass sie flexibel und anpassbar sind. Dies ermöglicht es Ihnen, sie zu ändern und an die Anforderungen Ihres Projekts anzupassen und sie somit zu einem hervorragenden Ausgangspunkt zu machen. 🏁 |
|||
|
|||
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: <a href="https://github.com/tiangolo/full-stack-fastapi-template" class="external-link" target="_blank">Full Stack FastAPI Template</a> |
|||
|
|||
## 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. |
|||
- 🧰 [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. |
|||
- 💾 [PostgreSQL](https://www.postgresql.org) als SQL-Datenbank. |
|||
- 🚀 [React](https://react.dev) für das Frontend. |
|||
- 💃 Verwendung von TypeScript, Hooks, [Vite](https://vitejs.dev) und anderen Teilen eines modernen Frontend-Stacks. |
|||
- 🎨 [Chakra UI](https://chakra-ui.com) für die Frontend-Komponenten. |
|||
- 🤖 Ein automatisch generierter Frontend-Client. |
|||
- 🧪 [Playwright](https://playwright.dev) für End-to-End-Tests. |
|||
- 🦇 Unterstützung des Dunkelmodus. |
|||
- 🐋 [Docker Compose](https://www.docker.com) für Entwicklung und Produktion. |
|||
- 🔒 Sicheres Passwort-Hashing standardmäßig. |
|||
- 🔑 JWT-Token-Authentifizierung. |
|||
- 📫 E-Mail-basierte Passwortwiederherstellung. |
|||
- ✅ Tests mit [Pytest](https://pytest.org). |
|||
- 📞 [Traefik](https://traefik.io) als Reverse-Proxy / Load Balancer. |
|||
- 🚢 Deployment-Anleitungen unter Verwendung von Docker Compose, einschließlich der Einrichtung eines Frontend-Traefik-Proxys zur Handhabung automatischer HTTPS-Zertifikate. |
|||
- 🏭 CI (kontinuierliche Integration) und CD (kontinuierliche Bereitstellung) basierend auf GitHub Actions. |
|||
|
@ -1,3 +1,3 @@ |
|||
# Ressourcen |
|||
# Ressourcen { #resources } |
|||
|
|||
Zusätzliche Ressourcen, externe Links, Artikel und mehr. ✈️ |
|||
|
@ -0,0 +1,76 @@ |
|||
# Cookie-Parameter-Modelle { #cookie-parameter-models } |
|||
|
|||
Wenn Sie eine Gruppe von **Cookies** haben, die zusammengehören, können Sie ein **Pydantic-Modell** erstellen, um diese zu deklarieren. 🍪 |
|||
|
|||
Damit können Sie das Modell an **mehreren Stellen wiederverwenden** und auch Validierungen und Metadaten für alle Parameter gleichzeitig deklarieren. 😎 |
|||
|
|||
/// note | Hinweis |
|||
|
|||
Dies wird seit FastAPI Version `0.115.0` unterstützt. 🤓 |
|||
|
|||
/// |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Diese gleiche Technik gilt für `Query`, `Cookie` und `Header`. 😎 |
|||
|
|||
/// |
|||
|
|||
## Cookies mit einem Pydantic-Modell { #cookies-with-a-pydantic-model } |
|||
|
|||
Deklarieren Sie die **Cookie**-Parameter, die Sie benötigen, in einem **Pydantic-Modell**, und deklarieren Sie dann den Parameter als `Cookie`: |
|||
|
|||
{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *} |
|||
|
|||
**FastAPI** wird die Daten für **jedes Feld** aus den im <abbr title="Request – Anfrage: Daten, die der Client zum Server sendet">Request</abbr> empfangenen **Cookies** **extrahieren** und Ihnen das von Ihnen definierte Pydantic-Modell bereitstellen. |
|||
|
|||
## Die Dokumentation testen { #check-the-docs } |
|||
|
|||
Sie können die definierten Cookies in der Dokumentationsoberfläche unter `/docs` sehen: |
|||
|
|||
<div class="screenshot"> |
|||
<img src="/img/tutorial/cookie-param-models/image01.png"> |
|||
</div> |
|||
|
|||
/// info | Info |
|||
|
|||
Bitte beachten Sie, dass Browser Cookies auf spezielle Weise und im Hintergrund bearbeiten, sodass sie **nicht** leicht **JavaScript** erlauben, diese zu berühren. |
|||
|
|||
Wenn Sie zur **API-Dokumentationsoberfläche** unter `/docs` gehen, können Sie die **Dokumentation** für Cookies für Ihre *Pfadoperationen* sehen. |
|||
|
|||
Aber selbst wenn Sie die **Daten ausfüllen** und auf „Ausführen“ klicken, werden aufgrund der Tatsache, dass die Dokumentationsoberfläche mit **JavaScript** arbeitet, die Cookies nicht gesendet, und Sie werden eine **Fehlermeldung** sehen, als ob Sie keine Werte eingegeben hätten. |
|||
|
|||
/// |
|||
|
|||
## Zusätzliche Cookies verbieten { #forbid-extra-cookies } |
|||
|
|||
In einigen speziellen Anwendungsfällen (wahrscheinlich nicht sehr häufig) möchten Sie möglicherweise die Cookies, die Sie empfangen möchten, **einschränken**. |
|||
|
|||
Ihre API hat jetzt die Macht, ihre eigene <abbr title="Das ist ein Scherz, nur für den Fall. Es hat nichts mit Cookie-Einwilligungen zu tun, aber es ist witzig, dass selbst die API jetzt die armen Cookies ablehnen kann. Haben Sie einen Keks. 🍪">Cookie-Einwilligung</abbr> zu kontrollieren. 🤪🍪 |
|||
|
|||
Sie können die Modellkonfiguration von Pydantic verwenden, um `extra` Felder zu verbieten (`forbid`): |
|||
|
|||
{* ../../docs_src/cookie_param_models/tutorial002_an_py39.py hl[10] *} |
|||
|
|||
Wenn ein Client versucht, einige **zusätzliche Cookies** zu senden, erhält er eine **Error-<abbr title="Response – Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>**. |
|||
|
|||
Arme Cookie-Banner, wie sie sich mühen, Ihre Einwilligung zu erhalten, dass die <abbr title="Das ist ein weiterer Scherz. Beachten Sie mich nicht. Trinken Sie einen Kaffee zu Ihrem Keks. ☕">API sie ablehnen darf</abbr>. 🍪 |
|||
|
|||
Wenn der Client beispielsweise versucht, ein `santa_tracker`-Cookie mit einem Wert von `good-list-please` zu senden, erhält der Client eine **Error-Response**, die ihm mitteilt, dass das `santa_tracker` <abbr title="Santa beschwert sich über den Mangel an Cookies. 🎅 Okay, keine Cookie-Witze mehr.">Cookie nicht erlaubt ist</abbr>: |
|||
|
|||
```json |
|||
{ |
|||
"detail": [ |
|||
{ |
|||
"type": "extra_forbidden", |
|||
"loc": ["cookie", "santa_tracker"], |
|||
"msg": "Extra inputs are not permitted", |
|||
"input": "good-list-please", |
|||
} |
|||
] |
|||
} |
|||
``` |
|||
|
|||
## Zusammenfassung { #summary } |
|||
|
|||
Sie können **Pydantic-Modelle** verwenden, um <abbr title="Nehmen Sie einen letzten Keks, bevor Sie gehen. 🍪">**Cookies**</abbr> in **FastAPI** zu deklarieren. 😎 |
@ -1,35 +1,35 @@ |
|||
# Cookie-Parameter |
|||
# Cookie-Parameter { #cookie-parameters } |
|||
|
|||
So wie `Query`- und `Path`-Parameter können Sie auch <abbr title='Cookie – „Keks“: Mechanismus, der kurze Daten in Textform im Browser des Benutzers speichert und abfragt'>Cookie</abbr>-Parameter definieren. |
|||
Sie können Cookie-Parameter auf die gleiche Weise definieren wie `Query`- und `Path`-Parameter. |
|||
|
|||
## `Cookie` importieren |
|||
## `Cookie` importieren { #import-cookie } |
|||
|
|||
Importieren Sie zuerst `Cookie`: |
|||
|
|||
{* ../../docs_src/cookie_params/tutorial001_an_py310.py hl[3] *} |
|||
|
|||
## `Cookie`-Parameter deklarieren |
|||
## `Cookie`-Parameter deklarieren { #declare-cookie-parameters } |
|||
|
|||
Dann deklarieren Sie Ihre Cookie-Parameter, auf die gleiche Weise, wie Sie auch `Path`- und `Query`-Parameter deklarieren. |
|||
Deklarieren Sie dann die Cookie-Parameter mit derselben Struktur wie bei `Path` und `Query`. |
|||
|
|||
Der erste Wert ist der Typ. Sie können `Cookie` die gehabten Extra Validierungs- und Beschreibungsparameter hinzufügen. Danach können Sie einen Defaultwert vergeben: |
|||
Sie können den Defaultwert sowie alle zusätzlichen Validierungen oder Annotierungsparameter definieren: |
|||
|
|||
{* ../../docs_src/cookie_params/tutorial001_an_py310.py hl[9] *} |
|||
|
|||
/// note | Technische Details |
|||
|
|||
`Cookie` ist eine Schwesterklasse von `Path` und `Query`. Sie erbt von derselben gemeinsamen `Param`-Elternklasse. |
|||
`Cookie` ist eine „Schwester“-Klasse von `Path` und `Query`. Sie erbt auch von derselben gemeinsamen `Param`-Klasse. |
|||
|
|||
Aber erinnern Sie sich, dass, wenn Sie `Query`, `Path`, `Cookie` und andere von `fastapi` importieren, diese tatsächlich Funktionen sind, welche spezielle Klassen zurückgeben. |
|||
Aber denken Sie daran, dass, wenn Sie `Query`, `Path`, `Cookie` und andere von `fastapi` importieren, diese tatsächlich Funktionen sind, die spezielle Klassen zurückgeben. |
|||
|
|||
/// |
|||
|
|||
/// info |
|||
/// info | Info |
|||
|
|||
Um Cookies zu deklarieren, müssen Sie `Cookie` verwenden, da diese Parameter sonst als Query-Parameter interpretiert werden würden. |
|||
Um Cookies zu deklarieren, müssen Sie `Cookie` verwenden, da die Parameter sonst als Query-Parameter interpretiert würden. |
|||
|
|||
/// |
|||
|
|||
## Zusammenfassung |
|||
## Zusammenfassung { #recap } |
|||
|
|||
Deklarieren Sie Cookies mittels `Cookie`, auf die gleiche Weise wie bei `Query` und `Path`. |
|||
Deklarieren Sie Cookies mit `Cookie` und verwenden Sie dabei das gleiche allgemeine Muster wie bei `Query` und `Path`. |
|||
|
@ -0,0 +1,88 @@ |
|||
# CORS (Cross-Origin Resource Sharing) { #cors-cross-origin-resource-sharing } |
|||
|
|||
<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">CORS oder „<abbr title="Ressourcenfreigabe zwischen Ursprüngen">Cross-Origin Resource Sharing</abbr>“</a> bezieht sich auf Situationen, in denen ein Frontend, das in einem Browser läuft, JavaScript-Code enthält, der mit einem Backend kommuniziert, und das Backend sich in einem anderen „Origin“ als das Frontend befindet. |
|||
|
|||
## Origin { #origin } |
|||
|
|||
Ein <abbr title="Ursprung">Origin</abbr> ist die Kombination aus Protokoll (`http`, `https`), Domain (`myapp.com`, `localhost`, `localhost.tiangolo.com`) und Port (`80`, `443`, `8080`). |
|||
|
|||
Alle folgenden sind also unterschiedliche Origins: |
|||
|
|||
* `http://localhost` |
|||
* `https://localhost` |
|||
* `http://localhost:8080` |
|||
|
|||
Auch wenn sie alle in `localhost` sind, verwenden sie unterschiedliche Protokolle oder Ports, daher sind sie unterschiedliche „Origins“. |
|||
|
|||
## Schritte { #steps } |
|||
|
|||
Angenommen, Sie haben ein Frontend, das in Ihrem Browser unter `http://localhost:8080` läuft, und dessen JavaScript versucht, mit einem Backend zu kommunizieren, das unter `http://localhost` läuft (da wir keinen Port angegeben haben, geht der Browser vom Default-Port `80` aus). |
|||
|
|||
Dann wird der Browser ein HTTP-`OPTIONS`-<abbr title="Request – Anfrage: Daten, die der Client zum Server sendet">Request</abbr> an das `:80`-Backend senden, und wenn das Backend die entsprechenden Header sendet, die die Kommunikation von diesem anderen Origin (`http://localhost:8080`) autorisieren, lässt der `:8080`-Browser das JavaScript im Frontend seinen Request an das `:80`-Backend senden. |
|||
|
|||
Um dies zu erreichen, muss das `:80`-Backend eine Liste von „erlaubten Origins“ haben. |
|||
|
|||
In diesem Fall müsste die Liste `http://localhost:8080` enthalten, damit das `:8080`-Frontend korrekt funktioniert. |
|||
|
|||
## Wildcards { #wildcards } |
|||
|
|||
Es ist auch möglich, die Liste als `"*"` (ein „Wildcard“) zu deklarieren, um anzuzeigen, dass alle erlaubt sind. |
|||
|
|||
Aber das erlaubt nur bestimmte Arten der Kommunikation und schließt alles aus, was Anmeldeinformationen beinhaltet: Cookies, Autorisierungsheader wie die, die mit Bearer Tokens verwendet werden, usw. |
|||
|
|||
Um sicherzustellen, dass alles korrekt funktioniert, ist es besser, die erlaubten Origins explizit anzugeben. |
|||
|
|||
## `CORSMiddleware` verwenden { #use-corsmiddleware } |
|||
|
|||
Sie können das in Ihrer **FastAPI**-Anwendung mit der `CORSMiddleware` konfigurieren. |
|||
|
|||
* Importieren Sie `CORSMiddleware`. |
|||
* Erstellen Sie eine Liste der erlaubten Origins (als Strings). |
|||
* Fügen Sie es als „Middleware“ zu Ihrer **FastAPI**-Anwendung hinzu. |
|||
|
|||
Sie können auch angeben, ob Ihr Backend erlaubt: |
|||
|
|||
* Anmeldeinformationen (Autorisierungsheader, Cookies, usw.). |
|||
* Bestimmte HTTP-Methoden (`POST`, `PUT`) oder alle mit der Wildcard `"*"`. |
|||
* Bestimmte HTTP-Header oder alle mit der Wildcard `"*"`. |
|||
|
|||
{* ../../docs_src/cors/tutorial001.py hl[2,6:11,13:19] *} |
|||
|
|||
Die von der `CORSMiddleware`-Implementierung verwendeten Defaultparameter sind standardmäßig restriktiv, daher müssen Sie bestimmte Origins, Methoden oder Header ausdrücklich aktivieren, damit Browser sie in einem Cross-Domain-Kontext verwenden dürfen. |
|||
|
|||
Die folgenden Argumente werden unterstützt: |
|||
|
|||
* `allow_origins` - Eine Liste von Origins, die Cross-Origin-Requests machen dürfen. z. B. `['https://example.org', 'https://www.example.org']`. Sie können `['*']` verwenden, um jedes Origin zuzulassen. |
|||
* `allow_origin_regex` - Ein Regex-String zum Abgleichen gegen Origins, die Cross-Origin-Requests machen dürfen. z. B. `'https://.*\.example\.org'`. |
|||
* `allow_methods` - Eine Liste von HTTP-Methoden, die für Cross-Origin-Requests erlaubt sein sollen. Standardmäßig `['GET']`. Sie können `['*']` verwenden, um alle Standardmethoden zu erlauben. |
|||
* `allow_headers` - Eine Liste von HTTP-Requestheadern, die für Cross-Origin-Requests unterstützt werden sollten. Standardmäßig `[]`. Sie können `['*']` verwenden, um alle Header zu erlauben. Die Header `Accept`, `Accept-Language`, `Content-Language` und `Content-Type` sind immer für <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests" class="external-link" rel="noopener" target="_blank">einfache CORS-Requests</a> erlaubt. |
|||
* `allow_credentials` - Anzeigen, dass Cookies für Cross-Origin-Requests unterstützt werden sollten. Standardmäßig `False`. |
|||
|
|||
Keines der `allow_origins`, `allow_methods` und `allow_headers` kann auf `['*']` gesetzt werden, wenn `allow_credentials` auf `True` gesetzt ist. Alle müssen <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards" class="external-link" rel="noopener" target="_blank">explizit angegeben</a> werden. |
|||
|
|||
* `expose_headers` - Angabe der Responseheader, auf die der Browser zugreifen können soll. Standardmäßig `[]`. |
|||
* `max_age` - Legt eine maximale Zeit in Sekunden fest, die Browser CORS-Responses zwischenspeichern dürfen. Standardmäßig `600`. |
|||
|
|||
Die Middleware antwortet auf zwei besondere Arten von HTTP-Requests ... |
|||
|
|||
### CORS-Preflight-Requests { #cors-preflight-requests } |
|||
|
|||
Dies sind alle `OPTIONS`-Requests mit `Origin`- und `Access-Control-Request-Method`-Headern. |
|||
|
|||
In diesem Fall wird die Middleware den eingehenden Request abfangen und mit entsprechenden CORS-Headern, und entweder einer `200`- oder `400`-<abbr title="Response – Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr> zu Informationszwecken antworten. |
|||
|
|||
### Einfache Requests { #simple-requests } |
|||
|
|||
Jeder Request mit einem `Origin`-Header. In diesem Fall wird die Middleware den Request wie gewohnt durchlassen, aber entsprechende CORS-Header in die Response aufnehmen. |
|||
|
|||
## Weitere Informationen { #more-info } |
|||
|
|||
Weitere Informationen zu <abbr title="Cross-Origin Resource Sharing – Ressourcenfreigabe zwischen Ursprüngen">CORS</abbr> finden Sie in der <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">Mozilla CORS-Dokumentation</a>. |
|||
|
|||
/// note | Technische Details |
|||
|
|||
Sie könnten auch `from starlette.middleware.cors import CORSMiddleware` verwenden. |
|||
|
|||
**FastAPI** bietet mehrere Middlewares in `fastapi.middleware` nur als Komfort für Sie, den Entwickler. Aber die meisten der verfügbaren Middlewares stammen direkt von Starlette. |
|||
|
|||
/// |
@ -0,0 +1,113 @@ |
|||
# Debugging { #debugging } |
|||
|
|||
Sie können den Debugger in Ihrem Editor verbinden, zum Beispiel mit Visual Studio Code oder PyCharm. |
|||
|
|||
## `uvicorn` aufrufen { #call-uvicorn } |
|||
|
|||
Importieren und führen Sie `uvicorn` direkt in Ihrer FastAPI-Anwendung aus: |
|||
|
|||
{* ../../docs_src/debugging/tutorial001.py hl[1,15] *} |
|||
|
|||
### Über `__name__ == "__main__"` { #about-name-main } |
|||
|
|||
Der Hauptzweck von `__name__ == "__main__"` ist, dass Code ausgeführt wird, wenn Ihre Datei mit folgendem Befehl aufgerufen wird: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ python myapp.py |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
aber nicht aufgerufen wird, wenn eine andere Datei sie importiert, wie in: |
|||
|
|||
```Python |
|||
from myapp import app |
|||
``` |
|||
|
|||
#### Weitere Details { #more-details } |
|||
|
|||
Angenommen, Ihre Datei heißt `myapp.py`. |
|||
|
|||
Wenn Sie sie mit folgendem Befehl ausführen: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ python myapp.py |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
dann hat in Ihrer Datei die interne Variable `__name__`, die von Python automatisch erstellt wird, als Wert den String `"__main__"`. |
|||
|
|||
Daher wird der Abschnitt: |
|||
|
|||
```Python |
|||
uvicorn.run(app, host="0.0.0.0", port=8000) |
|||
``` |
|||
|
|||
ausgeführt. |
|||
|
|||
--- |
|||
|
|||
Dies wird nicht passieren, wenn Sie das Modul (die Datei) importieren. |
|||
|
|||
Wenn Sie also eine weitere Datei `importer.py` mit folgendem Inhalt haben: |
|||
|
|||
```Python |
|||
from myapp import app |
|||
|
|||
# Hier mehr Code |
|||
``` |
|||
|
|||
wird in diesem Fall in `myapp.py` die automatisch erstellte Variable `__name__` nicht den Wert `"__main__"` haben. |
|||
|
|||
Daher wird die Zeile: |
|||
|
|||
```Python |
|||
uvicorn.run(app, host="0.0.0.0", port=8000) |
|||
``` |
|||
|
|||
nicht ausgeführt. |
|||
|
|||
/// info | Info |
|||
|
|||
Für weitere Informationen besuchen Sie bitte <a href="https://docs.python.org/3/library/__main__.html" class="external-link" target="_blank">die offizielle Python-Dokumentation</a>. |
|||
|
|||
/// |
|||
|
|||
## Ihren Code mit Ihrem Debugger ausführen { #run-your-code-with-your-debugger } |
|||
|
|||
Da Sie den Uvicorn-Server direkt aus Ihrem Code ausführen, können Sie Ihr Python-Programm (Ihre FastAPI-Anwendung) direkt aus dem Debugger aufrufen. |
|||
|
|||
--- |
|||
|
|||
Zum Beispiel können Sie in Visual Studio Code: |
|||
|
|||
* Zum „Debug“-Panel gehen. |
|||
* „Konfiguration hinzufügen ...“ auswählen. |
|||
* „Python“ auswählen. |
|||
* 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. |
|||
|
|||
So könnte es aussehen: |
|||
|
|||
<img src="/img/tutorial/debugging/image01.png"> |
|||
|
|||
--- |
|||
|
|||
Wenn Sie Pycharm verwenden, können Sie: |
|||
|
|||
* Das Menü „Run“ öffnen. |
|||
* Die Option „Debug ...“ auswählen. |
|||
* Ein Kontextmenü wird angezeigt. |
|||
* Die zu debuggende Datei auswählen (in diesem Fall `main.py`). |
|||
|
|||
Der Server wird dann mit Ihrem **FastAPI**-Code gestartet, an Ihren Haltepunkten angehalten, usw. |
|||
|
|||
So könnte es aussehen: |
|||
|
|||
<img src="/img/tutorial/debugging/image02.png"> |
@ -0,0 +1,72 @@ |
|||
# Header-Parameter-Modelle { #header-parameter-models } |
|||
|
|||
Wenn Sie eine Gruppe verwandter **Header-Parameter** haben, können Sie ein **Pydantic-Modell** erstellen, um diese zu deklarieren. |
|||
|
|||
Dadurch können Sie das **Modell an mehreren Stellen wiederverwenden** und auch Validierungen und Metadaten für alle Parameter gleichzeitig deklarieren. 😎 |
|||
|
|||
/// note | Hinweis |
|||
|
|||
Dies wird seit FastAPI Version `0.115.0` unterstützt. 🤓 |
|||
|
|||
/// |
|||
|
|||
## Header-Parameter mit einem Pydantic-Modell { #header-parameters-with-a-pydantic-model } |
|||
|
|||
Deklarieren Sie die erforderlichen **Header-Parameter** in einem **Pydantic-Modell** und dann den Parameter als `Header`: |
|||
|
|||
{* ../../docs_src/header_param_models/tutorial001_an_py310.py hl[9:14,18] *} |
|||
|
|||
**FastAPI** wird die Daten für **jedes Feld** aus den **Headern** des <abbr title="Request – Anfrage: Daten, die der Client zum Server sendet">Request</abbr> extrahieren und Ihnen das von Ihnen definierte Pydantic-Modell geben. |
|||
|
|||
## Die Dokumentation testen { #check-the-docs } |
|||
|
|||
Sie können die erforderlichen Header in der Dokumentationsoberfläche unter `/docs` sehen: |
|||
|
|||
<div class="screenshot"> |
|||
<img src="/img/tutorial/header-param-models/image01.png"> |
|||
</div> |
|||
|
|||
## Zusätzliche Header verbieten { #forbid-extra-headers } |
|||
|
|||
In einigen speziellen Anwendungsfällen (wahrscheinlich nicht sehr häufig) möchten Sie möglicherweise die **Header einschränken**, die Sie erhalten möchten. |
|||
|
|||
Sie können Pydantics Modellkonfiguration verwenden, um `extra` Felder zu verbieten (`forbid`): |
|||
|
|||
{* ../../docs_src/header_param_models/tutorial002_an_py310.py hl[10] *} |
|||
|
|||
Wenn ein Client versucht, einige **zusätzliche Header** 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, einen `tool`-Header mit einem Wert von `plumbus` zu senden, erhält er eine **Error-Response**, die ihm mitteilt, dass der Header-Parameter `tool` nicht erlaubt ist: |
|||
|
|||
```json |
|||
{ |
|||
"detail": [ |
|||
{ |
|||
"type": "extra_forbidden", |
|||
"loc": ["header", "tool"], |
|||
"msg": "Extra inputs are not permitted", |
|||
"input": "plumbus", |
|||
} |
|||
] |
|||
} |
|||
``` |
|||
|
|||
## Automatische Umwandlung von Unterstrichen deaktivieren { #disable-convert-underscores } |
|||
|
|||
Ähnlich wie bei regulären Header-Parametern werden bei der Verwendung von Unterstrichen in den Parameternamen diese **automatisch in Bindestriche umgewandelt**. |
|||
|
|||
Wenn Sie beispielsweise einen Header-Parameter `save_data` im Code haben, wird der erwartete HTTP-Header `save-data` sein, und er wird auch so in der Dokumentation angezeigt. |
|||
|
|||
Falls Sie aus irgendeinem Grund diese automatische Umwandlung deaktivieren müssen, können Sie dies auch für Pydantic-Modelle für Header-Parameter tun. |
|||
|
|||
{* ../../docs_src/header_param_models/tutorial003_an_py310.py hl[19] *} |
|||
|
|||
/// warning | Achtung |
|||
|
|||
Bevor Sie `convert_underscores` auf `False` setzen, bedenken Sie, dass einige HTTP-Proxies und -Server die Verwendung von Headern mit Unterstrichen nicht zulassen. |
|||
|
|||
/// |
|||
|
|||
## Zusammenfassung { #summary } |
|||
|
|||
Sie können **Pydantic-Modelle** verwenden, um **Header** in **FastAPI** zu deklarieren. 😎 |
@ -1,83 +1,95 @@ |
|||
# Tutorial – Benutzerhandbuch |
|||
# Tutorial – Benutzerhandbuch { #tutorial-user-guide } |
|||
|
|||
Dieses Tutorial zeigt Ihnen Schritt für Schritt, wie Sie **FastAPI** und die meisten seiner Funktionen verwenden können. |
|||
Dieses Tutorial zeigt Ihnen Schritt für Schritt, wie Sie **FastAPI** mit den meisten seiner Funktionen verwenden können. |
|||
|
|||
Jeder Abschnitt baut schrittweise auf den vorhergehenden auf. Diese Abschnitte sind aber nach einzelnen Themen gegliedert, sodass Sie direkt zu einem bestimmten Thema übergehen können, um Ihre speziellen API-Anforderungen zu lösen. |
|||
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. |
|||
|
|||
Außerdem dienen diese als zukünftige Referenz. |
|||
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. |
|||
|
|||
Dadurch können Sie jederzeit zurückkommen und sehen genau das, was Sie benötigen. |
|||
## Den Code ausführen { #run-the-code } |
|||
|
|||
## Den Code ausführen |
|||
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 (da es sich um getestete Python-Dateien handelt). |
|||
|
|||
Um eines der Beispiele auszuführen, kopieren Sie den Code in eine Datei `main.py`, und starten Sie `uvicorn` mit: |
|||
Um eines der Beispiele auszuführen, kopieren Sie den Code in eine Datei `main.py` und starten Sie `fastapi dev` mit: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ uvicorn main:app --reload |
|||
$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u> |
|||
|
|||
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server 🚀 |
|||
|
|||
Searching for package file structure from directories |
|||
with <font color="#3465A4">__init__.py</font> files |
|||
Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font> |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> 🐍 main.py |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with |
|||
the following code: |
|||
|
|||
<u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u> |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font> |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font> |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000/docs</u></font> |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> tip </font></span> Running in development mode, for production use: |
|||
<b>fastapi run</b> |
|||
|
|||
<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>: Started reloader process [28720] |
|||
<span style="color: green;">INFO</span>: Started server process [28722] |
|||
<span style="color: green;">INFO</span>: Waiting for application startup. |
|||
<span style="color: green;">INFO</span>: Application startup complete. |
|||
Logs: |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Will watch for changes in these directories: |
|||
<b>[</b><font color="#4E9A06">'/home/user/code/awesomeapp'</font><b>]</b> |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font> <b>(</b>Press CTRL+C |
|||
to quit<b>)</b> |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started reloader process <b>[</b><font color="#34E2E2"><b>383138</b></font><b>]</b> using WatchFiles |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>383153</b></font><b>]</b> |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup. |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete. |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Es wird **ausdrücklich empfohlen**, dass Sie den Code schreiben oder kopieren, ihn bearbeiten und lokal ausführen. |
|||
Es wird **dringend empfohlen**, den Code zu schreiben oder zu kopieren, ihn zu bearbeiten und lokal auszuführen. |
|||
|
|||
Die Verwendung in Ihrem eigenen Editor zeigt Ihnen die Vorteile von FastAPI am besten, wenn Sie sehen, wie wenig Code Sie schreiben müssen, all die Typprüfungen, die automatische Vervollständigung usw. |
|||
|
|||
--- |
|||
|
|||
## FastAPI installieren |
|||
## FastAPI installieren { #install-fastapi } |
|||
|
|||
Der erste Schritt besteht aus der Installation von FastAPI. |
|||
Der erste Schritt besteht darin, FastAPI zu installieren. |
|||
|
|||
Für dieses Tutorial empfiehlt es sich, FastAPI mit allen optionalen Abhängigkeiten und Funktionen zu installieren: |
|||
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und dann **FastAPI installieren**: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ pip install "fastapi[all]" |
|||
$ pip install "fastapi[standard]" |
|||
|
|||
---> 100% |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
... das beinhaltet auch `uvicorn`, welchen Sie als Server verwenden können, der ihren Code ausführt. |
|||
|
|||
/// note | Hinweis |
|||
|
|||
Sie können die einzelnen Teile auch separat installieren. |
|||
|
|||
Das folgende würden Sie wahrscheinlich tun, wenn Sie Ihre Anwendung in der Produktion einsetzen: |
|||
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 <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a> ermöglicht. |
|||
|
|||
``` |
|||
pip install fastapi |
|||
``` |
|||
|
|||
Installieren Sie auch `uvicorn` als Server: |
|||
|
|||
``` |
|||
pip install "uvicorn[standard]" |
|||
``` |
|||
Wenn Sie diese optionalen Abhängigkeiten nicht haben möchten, können Sie stattdessen `pip install fastapi` installieren. |
|||
|
|||
Das gleiche gilt für jede der optionalen Abhängigkeiten, die Sie verwenden möchten. |
|||
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. |
|||
|
|||
/// |
|||
|
|||
## Handbuch für fortgeschrittene Benutzer |
|||
## Handbuch für fortgeschrittene Benutzer { #advanced-user-guide } |
|||
|
|||
Es gibt auch ein **Handbuch für fortgeschrittene Benutzer**, welches Sie später nach diesem **Tutorial – Benutzerhandbuch** lesen können. |
|||
Es gibt auch ein **Handbuch für fortgeschrittene Benutzer**, das Sie nach diesem **Tutorial – Benutzerhandbuch** lesen können. |
|||
|
|||
Das **Handbuch für fortgeschrittene Benutzer** baut auf diesem Tutorial auf, verwendet dieselben Konzepte und bringt Ihnen einige zusätzliche Funktionen bei. |
|||
Das **Handbuch für fortgeschrittene Benutzer** baut hierauf auf, verwendet dieselben Konzepte und bringt Ihnen einige zusätzliche Funktionen bei. |
|||
|
|||
Allerdings sollten Sie zuerst das **Tutorial – Benutzerhandbuch** lesen (was Sie hier gerade tun). |
|||
Sie sollten jedoch zuerst das **Tutorial – Benutzerhandbuch** lesen (was Sie gerade tun). |
|||
|
|||
Die Dokumentation ist so konzipiert, dass Sie mit dem **Tutorial – Benutzerhandbuch** eine vollständige Anwendung erstellen können und diese dann je nach Bedarf mit einigen der zusätzlichen Ideen aus dem **Handbuch für fortgeschrittene Benutzer** vervollständigen können. |
|||
Es ist so konzipiert, dass Sie mit dem **Tutorial – Benutzerhandbuch** eine vollständige Anwendung erstellen können und diese dann je nach Bedarf mit einigen der zusätzlichen Ideen aus dem **Handbuch für fortgeschrittene Benutzer** erweitern können. |
|||
|
@ -0,0 +1,68 @@ |
|||
# Query-Parameter-Modelle { #query-parameter-models } |
|||
|
|||
Wenn Sie eine Gruppe von **Query-Parametern** haben, die miteinander in Beziehung stehen, können Sie ein **Pydantic-Modell** erstellen, um diese zu deklarieren. |
|||
|
|||
Dadurch können Sie das **Modell an mehreren Stellen wiederverwenden** und gleichzeitig Validierungen und Metadaten für alle Parameter auf einmal deklarieren. 😎 |
|||
|
|||
/// note | Hinweis |
|||
|
|||
Dies wird seit FastAPI Version `0.115.0` unterstützt. 🤓 |
|||
|
|||
/// |
|||
|
|||
## Query-Parameter mit einem Pydantic-Modell { #query-parameters-with-a-pydantic-model } |
|||
|
|||
Deklarieren Sie die benötigten **Query-Parameter** in einem **Pydantic-Modell** und dann den Parameter als `Query`: |
|||
|
|||
{* ../../docs_src/query_param_models/tutorial001_an_py310.py hl[9:13,17] *} |
|||
|
|||
**FastAPI** wird die Daten für **jedes Feld** aus den **Query-Parametern** des <abbr title="Request – Anfrage: Daten, die der Client zum Server sendet">Request</abbr> extrahieren und Ihnen das definierte Pydantic-Modell bereitstellen. |
|||
|
|||
## Die Dokumentation testen { #check-the-docs } |
|||
|
|||
Sie können die Query-Parameter in der Dokumentations-Oberfläche unter `/docs` einsehen: |
|||
|
|||
<div class="screenshot"> |
|||
<img src="/img/tutorial/query-param-models/image01.png"> |
|||
</div> |
|||
|
|||
## Zusätzliche Query-Parameter verbieten { #forbid-extra-query-parameters } |
|||
|
|||
In einigen speziellen Anwendungsfällen (wahrscheinlich nicht sehr häufig) möchten Sie möglicherweise die Query-Parameter, die Sie empfangen möchten, **beschränken**. |
|||
|
|||
Sie können die Modellkonfiguration von Pydantic verwenden, um jegliche `extra` Felder zu `verbieten`: |
|||
|
|||
{* ../../docs_src/query_param_models/tutorial002_an_py310.py hl[10] *} |
|||
|
|||
Wenn ein Client versucht, einige **zusätzliche** Daten in den **Query-Parametern** zu senden, erhält er eine **Error-<abbr title="Response – Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>**. |
|||
|
|||
Wenn der Client beispielsweise versucht, einen `tool` Query-Parameter mit dem Wert `plumbus` zu senden, wie: |
|||
|
|||
```http |
|||
https://example.com/items/?limit=10&tool=plumbus |
|||
``` |
|||
|
|||
erhält er eine **Error-Response**, die ihm mitteilt, dass der Query-Parameter `tool` nicht erlaubt ist: |
|||
|
|||
```json |
|||
{ |
|||
"detail": [ |
|||
{ |
|||
"type": "extra_forbidden", |
|||
"loc": ["query", "tool"], |
|||
"msg": "Extra inputs are not permitted", |
|||
"input": "plumbus" |
|||
} |
|||
] |
|||
} |
|||
``` |
|||
|
|||
## Zusammenfassung { #summary } |
|||
|
|||
Sie können **Pydantic-Modelle** verwenden, um **Query-Parameter** in **FastAPI** zu deklarieren. 😎 |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Spoiler-Alarm: Sie können auch Pydantic-Modelle verwenden, um Cookies und Header zu deklarieren, aber darüber werden Sie später im Tutorial lesen. 🤫 |
|||
|
|||
/// |
@ -0,0 +1,78 @@ |
|||
# Formularmodelle { #form-models } |
|||
|
|||
Sie können **Pydantic-Modelle** verwenden, um **Formularfelder** in FastAPI zu deklarieren. |
|||
|
|||
/// info | Info |
|||
|
|||
Um Formulare zu verwenden, installieren Sie zuerst <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>. |
|||
|
|||
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und es dann installieren, zum Beispiel: |
|||
|
|||
```console |
|||
$ pip install python-multipart |
|||
``` |
|||
|
|||
/// |
|||
|
|||
/// note | Hinweis |
|||
|
|||
Dies wird seit FastAPI Version `0.113.0` unterstützt. 🤓 |
|||
|
|||
/// |
|||
|
|||
## Pydantic-Modelle für Formulare { #pydantic-models-for-forms } |
|||
|
|||
Sie müssen nur ein **Pydantic-Modell** mit den Feldern deklarieren, die Sie als **Formularfelder** erhalten möchten, und dann den Parameter als `Form` deklarieren: |
|||
|
|||
{* ../../docs_src/request_form_models/tutorial001_an_py39.py hl[9:11,15] *} |
|||
|
|||
**FastAPI** wird die Daten für **jedes Feld** aus den **Formulardaten** im <abbr title="Request – Anfrage: Daten, die der Client zum Server sendet">Request</abbr> **extrahieren** und Ihnen das von Ihnen definierte Pydantic-Modell übergeben. |
|||
|
|||
## Die Dokumentation testen { #check-the-docs } |
|||
|
|||
Sie können dies in der Dokumentations-UI unter `/docs` testen: |
|||
|
|||
<div class="screenshot"> |
|||
<img src="/img/tutorial/request-form-models/image01.png"> |
|||
</div> |
|||
|
|||
## 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**. |
|||
|
|||
/// note | Hinweis |
|||
|
|||
Dies wird seit FastAPI Version `0.114.0` unterstützt. 🤓 |
|||
|
|||
/// |
|||
|
|||
Sie können die Modellkonfiguration von Pydantic verwenden, um jegliche `extra` Felder zu `verbieten`: |
|||
|
|||
{* ../../docs_src/request_form_models/tutorial002_an_py39.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>**. |
|||
|
|||
Zum Beispiel, wenn der Client versucht, folgende Formularfelder zu senden: |
|||
|
|||
* `username`: `Rick` |
|||
* `password`: `Portal Gun` |
|||
* `extra`: `Mr. Poopybutthole` |
|||
|
|||
erhält er eine Error-Response, die ihm mitteilt, dass das Feld `extra` nicht erlaubt ist: |
|||
|
|||
```json |
|||
{ |
|||
"detail": [ |
|||
{ |
|||
"type": "extra_forbidden", |
|||
"loc": ["body", "extra"], |
|||
"msg": "Extra inputs are not permitted", |
|||
"input": "Mr. Poopybutthole" |
|||
} |
|||
] |
|||
} |
|||
``` |
|||
|
|||
## Zusammenfassung { #summary } |
|||
|
|||
Sie können Pydantic-Modelle verwenden, um Formularfelder in FastAPI zu deklarieren. 😎 |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue