committed by
GitHub
643 changed files with 37192 additions and 21693 deletions
@ -8,14 +8,17 @@ Aus diesem Grund werden diese รผblicherweise in Umgebungsvariablen bereitgestell |
|||
|
|||
## Umgebungsvariablen |
|||
|
|||
!!! tip "Tipp" |
|||
/// tip | "Tipp" |
|||
|
|||
Wenn Sie bereits wissen, was โUmgebungsvariablenโ sind und wie man sie verwendet, kรถnnen Sie gerne mit dem nรคchsten Abschnitt weiter unten fortfahren. |
|||
|
|||
/// |
|||
|
|||
Eine <a href="https://de.wikipedia.org/wiki/Umgebungsvariable" class="external-link" target="_blank">Umgebungsvariable</a> (auch bekannt als โenv varโ) ist eine Variable, die sich auรerhalb des Python-Codes im Betriebssystem befindet und von Ihrem Python-Code (oder auch von anderen Programmen) gelesen werden kann. |
|||
|
|||
Sie kรถnnen Umgebungsvariablen in der Shell erstellen und verwenden, ohne Python zu benรถtigen: |
|||
|
|||
=== "Linux, macOS, Windows Bash" |
|||
//// tab | Linux, macOS, Windows Bash |
|||
|
|||
<div class="termy"> |
|||
|
|||
@ -31,7 +34,9 @@ Sie kรถnnen Umgebungsvariablen in der Shell erstellen und verwenden, ohne Python |
|||
|
|||
</div> |
|||
|
|||
=== "Windows PowerShell" |
|||
//// |
|||
|
|||
//// tab | Windows PowerShell |
|||
|
|||
<div class="termy"> |
|||
|
|||
@ -47,6 +52,8 @@ Sie kรถnnen Umgebungsvariablen in der Shell erstellen und verwenden, ohne Python |
|||
|
|||
</div> |
|||
|
|||
//// |
|||
|
|||
### Umgebungsvariablen mit Python auslesen |
|||
|
|||
Sie kรถnnen Umgebungsvariablen auch auรerhalb von Python im Terminal (oder mit einer anderen Methode) erstellen und diese dann mit Python auslesen. |
|||
@ -60,11 +67,14 @@ name = os.getenv("MY_NAME", "World") |
|||
print(f"Hello {name} from Python") |
|||
``` |
|||
|
|||
!!! tip "Tipp" |
|||
/// tip | "Tipp" |
|||
|
|||
Das zweite Argument fรผr <a href="https://docs.python.org/3.8/library/os.html#os.getenv" class="external-link" target="_blank">`os.getenv()`</a> ist der zurรผckzugebende Defaultwert. |
|||
|
|||
Wenn nicht angegeben, ist er standardmรครig `None`. Hier รผbergeben wir `"World"` als Defaultwert. |
|||
|
|||
/// |
|||
|
|||
Dann kรถnnten Sie dieses Python-Programm aufrufen: |
|||
|
|||
<div class="termy"> |
|||
@ -114,9 +124,12 @@ Hello World from Python |
|||
|
|||
</div> |
|||
|
|||
!!! tip "Tipp" |
|||
/// tip | "Tipp" |
|||
|
|||
Weitere Informationen dazu finden Sie unter <a href="https://12factor.net/config" class="external-link" target="_blank">The Twelve-Factor App: Config</a>. |
|||
|
|||
/// |
|||
|
|||
### Typen und Validierung |
|||
|
|||
Diese Umgebungsvariablen kรถnnen nur Text-Zeichenketten verarbeiten, da sie auรerhalb von Python liegen und mit anderen Programmen und dem Rest des Systems (und sogar mit verschiedenen Betriebssystemen wie Linux, Windows, macOS) kompatibel sein mรผssen. |
|||
@ -151,9 +164,12 @@ $ pip install "fastapi[all]" |
|||
|
|||
</div> |
|||
|
|||
!!! info |
|||
/// info |
|||
|
|||
In Pydantic v1 war das im Hauptpackage enthalten. Jetzt wird es als unabhรคngiges Package verteilt, sodass Sie wรคhlen kรถnnen, ob Sie es installieren mรถchten oder nicht, falls Sie die Funktionalitรคt nicht benรถtigen. |
|||
|
|||
/// |
|||
|
|||
### Das `Settings`-Objekt erstellen |
|||
|
|||
Importieren Sie `BaseSettings` aus Pydantic und erstellen Sie eine Unterklasse, ganz รคhnlich wie bei einem Pydantic-Modell. |
|||
@ -162,24 +178,34 @@ Auf die gleiche Weise wie bei Pydantic-Modellen deklarieren Sie Klassenattribute |
|||
|
|||
Sie kรถnnen dieselben Validierungs-Funktionen und -Tools verwenden, die Sie fรผr Pydantic-Modelle verwenden, z. B. verschiedene Datentypen und zusรคtzliche Validierungen mit `Field()`. |
|||
|
|||
=== "Pydantic v2" |
|||
//// tab | Pydantic v2 |
|||
|
|||
```Python hl_lines="2 5-8 11" |
|||
{!> ../../../docs_src/settings/tutorial001.py!} |
|||
``` |
|||
|
|||
=== "Pydantic v1" |
|||
//// |
|||
|
|||
//// tab | Pydantic v1 |
|||
|
|||
/// info |
|||
|
|||
!!! info |
|||
In Pydantic v1 wรผrden Sie `BaseSettings` direkt von `pydantic` statt von `pydantic_settings` importieren. |
|||
|
|||
/// |
|||
|
|||
```Python hl_lines="2 5-8 11" |
|||
{!> ../../../docs_src/settings/tutorial001_pv1.py!} |
|||
``` |
|||
|
|||
!!! tip "Tipp" |
|||
//// |
|||
|
|||
/// tip | "Tipp" |
|||
|
|||
Fรผr ein schnelles Copy-and-paste verwenden Sie nicht dieses Beispiel, sondern das letzte unten. |
|||
|
|||
/// |
|||
|
|||
Wenn Sie dann eine Instanz dieser `Settings`-Klasse erstellen (in diesem Fall als `settings`-Objekt), liest Pydantic die Umgebungsvariablen ohne Berรผcksichtigung der Groร- und Kleinschreibung. Eine Variable `APP_NAME` in Groรbuchstaben wird also als Attribut `app_name` gelesen. |
|||
|
|||
Als Nรคchstes werden die Daten konvertiert und validiert. Wenn Sie also dieses `settings`-Objekt verwenden, verfรผgen Sie รผber Daten mit den von Ihnen deklarierten Typen (z. B. ist `items_per_user` ein `int`). |
|||
@ -206,9 +232,12 @@ $ ADMIN_EMAIL="[email protected]" APP_NAME="ChimichangApp" uvicorn main:app |
|||
|
|||
</div> |
|||
|
|||
!!! tip "Tipp" |
|||
/// tip | "Tipp" |
|||
|
|||
Um mehrere Umgebungsvariablen fรผr einen einzelnen Befehl festzulegen, trennen Sie diese einfach durch ein Leerzeichen und fรผgen Sie alle vor dem Befehl ein. |
|||
|
|||
/// |
|||
|
|||
Und dann wรผrde die Einstellung `admin_email` auf `"[email protected]"` gesetzt. |
|||
|
|||
Der `app_name` wรคre `"ChimichangApp"`. |
|||
@ -231,9 +260,12 @@ Und dann verwenden Sie diese in einer Datei `main.py`: |
|||
{!../../../docs_src/settings/app01/main.py!} |
|||
``` |
|||
|
|||
!!! tip "Tipp" |
|||
/// tip | "Tipp" |
|||
|
|||
Sie benรถtigen auรerdem eine Datei `__init__.py`, wie in [Grรถรere Anwendungen โ mehrere Dateien](../tutorial/bigger-applications.md){.internal-link target=_blank} gesehen. |
|||
|
|||
/// |
|||
|
|||
## Einstellungen in einer Abhรคngigkeit |
|||
|
|||
In manchen Fรคllen kann es nรผtzlich sein, die Einstellungen mit einer Abhรคngigkeit bereitzustellen, anstatt ein globales Objekt `settings` zu haben, das รผberall verwendet wird. |
|||
@ -254,55 +286,76 @@ Beachten Sie, dass wir jetzt keine Standardinstanz `settings = Settings()` erste |
|||
|
|||
Jetzt erstellen wir eine Abhรคngigkeit, die ein neues `config.Settings()` zurรผckgibt. |
|||
|
|||
=== "Python 3.9+" |
|||
//// tab | Python 3.9+ |
|||
|
|||
```Python hl_lines="6 12-13" |
|||
{!> ../../../docs_src/settings/app02_an_py39/main.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
//// |
|||
|
|||
//// tab | Python 3.8+ |
|||
|
|||
```Python hl_lines="6 12-13" |
|||
{!> ../../../docs_src/settings/app02_an/main.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+ nicht annotiert" |
|||
//// |
|||
|
|||
//// tab | Python 3.8+ nicht annotiert |
|||
|
|||
/// tip | "Tipp" |
|||
|
|||
!!! tip "Tipp" |
|||
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. |
|||
|
|||
/// |
|||
|
|||
```Python hl_lines="5 11-12" |
|||
{!> ../../../docs_src/settings/app02/main.py!} |
|||
``` |
|||
|
|||
!!! tip "Tipp" |
|||
//// |
|||
|
|||
/// tip | "Tipp" |
|||
|
|||
Wir werden das `@lru_cache` in Kรผrze besprechen. |
|||
|
|||
Im Moment nehmen Sie an, dass `get_settings()` eine normale Funktion ist. |
|||
|
|||
/// |
|||
|
|||
Und dann kรถnnen wir das von der *Pfadoperation-Funktion* als Abhรคngigkeit einfordern und es รผberall dort verwenden, wo wir es brauchen. |
|||
|
|||
=== "Python 3.9+" |
|||
//// tab | Python 3.9+ |
|||
|
|||
```Python hl_lines="17 19-21" |
|||
{!> ../../../docs_src/settings/app02_an_py39/main.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
//// |
|||
|
|||
//// tab | Python 3.8+ |
|||
|
|||
```Python hl_lines="17 19-21" |
|||
{!> ../../../docs_src/settings/app02_an/main.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+ nicht annotiert" |
|||
//// |
|||
|
|||
//// tab | Python 3.8+ nicht annotiert |
|||
|
|||
/// tip | "Tipp" |
|||
|
|||
!!! tip "Tipp" |
|||
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. |
|||
|
|||
/// |
|||
|
|||
```Python hl_lines="16 18-20" |
|||
{!> ../../../docs_src/settings/app02/main.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
### Einstellungen und Tests |
|||
|
|||
Dann wรคre es sehr einfach, beim Testen ein anderes Einstellungsobjekt bereitzustellen, indem man eine Abhรคngigkeitsรผberschreibung fรผr `get_settings` erstellt: |
|||
@ -321,16 +374,22 @@ Wenn Sie viele Einstellungen haben, die sich mรถglicherweise oft รคndern, vielle |
|||
|
|||
Diese Praxis ist so weit verbreitet, dass sie einen Namen hat. Diese Umgebungsvariablen werden รผblicherweise in einer Datei `.env` abgelegt und die Datei wird โdotenvโ genannt. |
|||
|
|||
!!! tip "Tipp" |
|||
/// tip | "Tipp" |
|||
|
|||
Eine Datei, die mit einem Punkt (`.`) beginnt, ist eine versteckte Datei in Unix-รคhnlichen Systemen wie Linux und macOS. |
|||
|
|||
Aber eine dotenv-Datei muss nicht unbedingt genau diesen Dateinamen haben. |
|||
|
|||
/// |
|||
|
|||
Pydantic unterstรผtzt das Lesen dieser Dateitypen mithilfe einer externen Bibliothek. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support" class="external-link" target="_blank">Pydantic Settings: Dotenv (.env) support</a>. |
|||
|
|||
!!! tip "Tipp" |
|||
/// tip | "Tipp" |
|||
|
|||
Damit das funktioniert, mรผssen Sie `pip install python-dotenv` ausfรผhren. |
|||
|
|||
/// |
|||
|
|||
### Die `.env`-Datei |
|||
|
|||
Sie kรถnnten eine `.env`-Datei haben, mit: |
|||
@ -344,27 +403,40 @@ APP_NAME="ChimichangApp" |
|||
|
|||
Und dann aktualisieren Sie Ihre `config.py` mit: |
|||
|
|||
=== "Pydantic v2" |
|||
//// tab | Pydantic v2 |
|||
|
|||
```Python hl_lines="9" |
|||
{!> ../../../docs_src/settings/app03_an/config.py!} |
|||
``` |
|||
|
|||
!!! tip "Tipp" |
|||
/// tip | "Tipp" |
|||
|
|||
Das Attribut `model_config` wird nur fรผr die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/latest/concepts/config/" class="external-link" target="_blank">Pydantic: Configuration</a>. |
|||
|
|||
=== "Pydantic v1" |
|||
/// |
|||
|
|||
//// |
|||
|
|||
//// tab | Pydantic v1 |
|||
|
|||
```Python hl_lines="9-10" |
|||
{!> ../../../docs_src/settings/app03_an/config_pv1.py!} |
|||
``` |
|||
|
|||
!!! tip "Tipp" |
|||
/// tip | "Tipp" |
|||
|
|||
Die Klasse `Config` wird nur fรผr die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/1.10/usage/model_config/" class="external-link" target="_blank">Pydantic Model Config</a>. |
|||
|
|||
!!! info |
|||
/// |
|||
|
|||
//// |
|||
|
|||
/// info |
|||
|
|||
In Pydantic Version 1 erfolgte die Konfiguration in einer internen Klasse `Config`, in Pydantic Version 2 erfolgt sie in einem Attribut `model_config`. Dieses Attribut akzeptiert ein `dict`. Um automatische Codevervollstรคndigung und Inline-Fehlerberichte zu erhalten, kรถnnen Sie `SettingsConfigDict` importieren und verwenden, um dieses `dict` zu definieren. |
|||
|
|||
/// |
|||
|
|||
Hier definieren wir die Konfiguration `env_file` innerhalb Ihrer Pydantic-`Settings`-Klasse und setzen den Wert auf den Dateinamen mit der dotenv-Datei, die wir verwenden mรถchten. |
|||
|
|||
### Die `Settings` nur einmal laden mittels `lru_cache` |
|||
@ -390,27 +462,36 @@ wรผrden wir dieses Objekt fรผr jeden Request erstellen und die `.env`-Datei fรผr |
|||
|
|||
Da wir jedoch den `@lru_cache`-Dekorator oben verwenden, wird das `Settings`-Objekt nur einmal erstellt, nรคmlich beim ersten Aufruf. โ๏ธ |
|||
|
|||
=== "Python 3.9+" |
|||
//// tab | Python 3.9+ |
|||
|
|||
```Python hl_lines="1 11" |
|||
{!> ../../../docs_src/settings/app03_an_py39/main.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
//// |
|||
|
|||
//// tab | Python 3.8+ |
|||
|
|||
```Python hl_lines="1 11" |
|||
{!> ../../../docs_src/settings/app03_an/main.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+ nicht annotiert" |
|||
//// |
|||
|
|||
//// tab | Python 3.8+ nicht annotiert |
|||
|
|||
/// tip | "Tipp" |
|||
|
|||
!!! tip "Tipp" |
|||
Bevorzugen Sie die `Annotated`-Version, falls mรถglich. |
|||
|
|||
/// |
|||
|
|||
```Python hl_lines="1 10" |
|||
{!> ../../../docs_src/settings/app03/main.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
Dann wird bei allen nachfolgenden Aufrufen von `get_settings()`, in den Abhรคngigkeiten fรผr darauffolgende Requests, dasselbe Objekt zurรผckgegeben, das beim ersten Aufruf zurรผckgegeben wurde, anstatt den Code von `get_settings()` erneut auszufรผhren und ein neues `Settings`-Objekt zu erstellen. |
|||
|
|||
#### Technische Details zu `lru_cache` |
|||
|
File diff suppressed because it is too large
@ -16,18 +16,22 @@ |
|||
|
|||
โก๏ธ โถ๏ธ โฎ๏ธ ๐
FastAPI ๐ธ: |
|||
|
|||
=== "๐ 3๏ธโฃ.6๏ธโฃ & ๐" |
|||
//// tab | ๐ 3๏ธโฃ.6๏ธโฃ & ๐ |
|||
|
|||
```Python hl_lines="9-11 14-15 18 19 23" |
|||
{!> ../../../docs_src/generate_clients/tutorial001.py!} |
|||
``` |
|||
|
|||
=== "๐ 3๏ธโฃ.9๏ธโฃ & ๐" |
|||
//// |
|||
|
|||
//// tab | ๐ 3๏ธโฃ.9๏ธโฃ & ๐ |
|||
|
|||
```Python hl_lines="7-9 12-13 16-17 21" |
|||
{!> ../../../docs_src/generate_clients/tutorial001_py39.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
๐ ๐ *โก ๐ ๏ธ* ๐ฌ ๐ท ๐ซ โ๏ธ ๐จ ๐ & ๐จ ๐, โ๏ธ ๐ท `Item` & `ResponseMessage`. |
|||
|
|||
### ๐ ๏ธ ๐ฉบ |
|||
@ -111,9 +115,12 @@ [email protected] generate-client /home/user/code/frontend-app |
|||
|
|||
<img src="/img/tutorial/generate-clients/image03.png"> |
|||
|
|||
!!! tip |
|||
/// tip |
|||
|
|||
๐ โ `name` & `price`, ๐ ๐ฌ FastAPI ๐ธ, `Item` ๐ท. |
|||
|
|||
/// |
|||
|
|||
๐ ๐ โ๏ธ โธ โ ๐ ๐ ๐ ๐จ: |
|||
|
|||
<img src="/img/tutorial/generate-clients/image04.png"> |
|||
@ -129,18 +136,22 @@ [email protected] generate-client /home/user/code/frontend-app |
|||
๐ผ, ๐ ๐ช โ๏ธ ๐ **๐ฌ** & โ1๏ธโฃ ๐ **๐ฉโ๐ป**, & ๐ซ ๐ช ๐ฝ ๐: |
|||
|
|||
|
|||
=== "๐ 3๏ธโฃ.6๏ธโฃ & ๐" |
|||
//// tab | ๐ 3๏ธโฃ.6๏ธโฃ & ๐ |
|||
|
|||
```Python hl_lines="23 28 36" |
|||
{!> ../../../docs_src/generate_clients/tutorial002.py!} |
|||
``` |
|||
|
|||
=== "๐ 3๏ธโฃ.9๏ธโฃ & ๐" |
|||
//// |
|||
|
|||
//// tab | ๐ 3๏ธโฃ.9๏ธโฃ & ๐ |
|||
|
|||
```Python hl_lines="21 26 34" |
|||
{!> ../../../docs_src/generate_clients/tutorial002_py39.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
### ๐ ๐ ๐ฉโ๐ป โฎ๏ธ ๐ |
|||
|
|||
๐ฅ ๐ ๐ ๐ฉโ๐ป FastAPI ๐ฑ โ๏ธ ๐, โซ๏ธ ๐ ๐ ๐ ๐ฉโ๐ป ๐ โ๏ธ ๐ ๐. |
|||
@ -186,18 +197,22 @@ FastAPI โ๏ธ **๐ ๐** ๐ *โก ๐ ๏ธ*, โซ๏ธ โ๏ธ **๐ ๏ธ ๐** |
|||
|
|||
๐ ๐ช โคด๏ธ ๐ถโโ๏ธ ๐ ๐ ๐ข **FastAPI** `generate_unique_id_function` ๐ข: |
|||
|
|||
=== "๐ 3๏ธโฃ.6๏ธโฃ & ๐" |
|||
//// tab | ๐ 3๏ธโฃ.6๏ธโฃ & ๐ |
|||
|
|||
```Python hl_lines="8-9 12" |
|||
{!> ../../../docs_src/generate_clients/tutorial003.py!} |
|||
``` |
|||
|
|||
=== "๐ 3๏ธโฃ.9๏ธโฃ & ๐" |
|||
//// |
|||
|
|||
//// tab | ๐ 3๏ธโฃ.9๏ธโฃ & ๐ |
|||
|
|||
```Python hl_lines="6-7 10" |
|||
{!> ../../../docs_src/generate_clients/tutorial003_py39.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
### ๐ ๐ ๐ฉโ๐ป โฎ๏ธ ๐ ๐ ๏ธ ๐ |
|||
|
|||
๐ ๐ฅ ๐ ๐ ๐ฉโ๐ป ๐, ๐ ๐ ๐ ๐ โซ๏ธ โ๏ธ ๐ ๐ฉโ๐ฌ ๐: |
|||
|
Some files were not shown because too many files changed in this diff
Loadingโฆ
Reference in new issue