committed by
GitHub
713 changed files with 7759 additions and 5041 deletions
@ -14,13 +14,13 @@ Um Umgebungsvariablen zu verstehen, können Sie [Umgebungsvariablen](../environm |
|||
|
|||
## Typen und Validierung { #types-and-validation } |
|||
|
|||
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. |
|||
Diese Umgebungsvariablen können nur Text-Strings verarbeiten, da sie außerhalb von Python liegen und mit anderen Programmen und dem Rest des Systems (und sogar mit verschiedenen Betriebssystemen wie Linux, Windows, macOS) kompatibel sein müssen. |
|||
|
|||
Das bedeutet, dass jeder in Python aus einer Umgebungsvariablen gelesene Wert ein `str` ist und jede Konvertierung in einen anderen Typ oder jede Validierung im Code erfolgen muss. |
|||
|
|||
## Pydantic `Settings` { #pydantic-settings } |
|||
|
|||
Glücklicherweise bietet Pydantic ein großartiges Werkzeug zur Verarbeitung dieser Einstellungen, die von Umgebungsvariablen stammen, mit [Pydantic: Settings Management](https://docs.pydantic.dev/latest/concepts/pydantic_settings/). |
|||
Glücklicherweise bietet Pydantic ein großartiges Werkzeug zur Verarbeitung dieser Einstellungen, die von Umgebungsvariablen stammen, mit [Pydantic: Settings-Verwaltung](https://docs.pydantic.dev/latest/concepts/pydantic_settings/). |
|||
|
|||
### `pydantic-settings` installieren { #install-pydantic-settings } |
|||
|
|||
@ -92,9 +92,9 @@ Um mehrere Umgebungsvariablen für einen einzelnen Befehl festzulegen, trennen S |
|||
|
|||
/// |
|||
|
|||
Und dann würde die Einstellung `admin_email` auf „[email protected]“ gesetzt. |
|||
Und dann würde die Einstellung `admin_email` auf `"[email protected]"` gesetzt. |
|||
|
|||
Der `app_name` wäre „ChimichangApp“. |
|||
Der `app_name` wäre `"ChimichangApp"`. |
|||
|
|||
Und `items_per_user` würde seinen Defaultwert von `50` behalten. |
|||
|
|||
@ -128,7 +128,7 @@ Ausgehend vom vorherigen Beispiel könnte Ihre Datei `config.py` so aussehen: |
|||
|
|||
{* ../../docs_src/settings/app02_an_py310/config.py hl[10] *} |
|||
|
|||
Beachten Sie, dass wir jetzt keine Standardinstanz `settings = Settings()` erstellen. |
|||
Beachten Sie, dass wir jetzt keine Defaultinstanz `settings = Settings()` erstellen. |
|||
|
|||
### Die Haupt-Anwendungsdatei { #the-main-app-file } |
|||
|
|||
@ -158,7 +158,7 @@ Bei der Abhängigkeitsüberschreibung legen wir einen neuen Wert für `admin_ema |
|||
|
|||
Dann können wir testen, ob das verwendet wird. |
|||
|
|||
## Lesen einer `.env`-Datei { #reading-a-env-file } |
|||
## Eine `.env`-Datei lesen { #reading-a-env-file } |
|||
|
|||
Wenn Sie viele Einstellungen haben, die sich möglicherweise oft ändern, vielleicht in verschiedenen Umgebungen, kann es nützlich sein, diese in eine Datei zu schreiben und sie dann daraus zu lesen, als wären sie Umgebungsvariablen. |
|||
|
|||
@ -172,7 +172,7 @@ Aber eine dotenv-Datei muss nicht unbedingt genau diesen Dateinamen haben. |
|||
|
|||
/// |
|||
|
|||
Pydantic unterstützt das Lesen dieser Dateitypen mithilfe einer externen Bibliothek. Weitere Informationen finden Sie unter [Pydantic Settings: Dotenv (.env) support](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support). |
|||
Pydantic unterstützt das Lesen dieser Dateitypen mithilfe einer externen Bibliothek. Weitere Informationen finden Sie unter [Pydantic Settings: Dotenv (.env)-Unterstützung](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support). |
|||
|
|||
/// tip | Tipp |
|||
|
|||
@ -197,13 +197,13 @@ Und dann aktualisieren Sie Ihre `config.py` mit: |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Das Attribut `model_config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter [Pydantic: Concepts: Configuration](https://docs.pydantic.dev/latest/concepts/config/). |
|||
Das Attribut `model_config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter [Pydantic: Konzepte: Konfiguration](https://docs.pydantic.dev/latest/concepts/config/). |
|||
|
|||
/// |
|||
|
|||
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` { #creating-the-settings-only-once-with-lru-cache } |
|||
### Die `Settings` nur einmal mittels `lru_cache` erstellen { #creating-the-settings-only-once-with-lru-cache } |
|||
|
|||
Das Lesen einer Datei von der Festplatte ist normalerweise ein kostspieliger (langsamer) Vorgang, daher möchten Sie ihn wahrscheinlich nur einmal ausführen und dann dasselbe Einstellungsobjekt erneut verwenden, anstatt es für jeden <abbr title="Request – Anfrage: Daten, die der Client zum Server sendet">Request</abbr> zu lesen. |
|||
|
|||
@ -291,7 +291,7 @@ Im Fall unserer Abhängigkeit `get_settings()` akzeptiert die Funktion nicht ein |
|||
|
|||
Auf diese Weise verhält es sich fast so, als wäre es nur eine globale Variable. Da es jedoch eine Abhängigkeitsfunktion verwendet, können wir diese zu Testzwecken problemlos überschreiben. |
|||
|
|||
`@lru_cache` ist Teil von `functools`, welches Teil von Pythons Standardbibliothek ist. Weitere Informationen dazu finden Sie in der [Python Dokumentation für `@lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache). |
|||
`@lru_cache` ist Teil von `functools`, welches Teil von Pythons Standardbibliothek ist. Weitere Informationen dazu finden Sie in der [Python-Dokumentation für `@lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache). |
|||
|
|||
## Zusammenfassung { #recap } |
|||
|
|||
|
|||
@ -0,0 +1,133 @@ |
|||
# Frontend { #frontend } |
|||
|
|||
Sie können statische Frontend-Apps mit `app.frontend()` (oder `router.frontend()`) bereitstellen. |
|||
|
|||
Das ist nützlich für Frontend-Tools, die statische Dateien generieren, wie React mit Vite, TanStack Router, Astro, Vue, Svelte, Angular, Solid und andere. |
|||
|
|||
Mit diesen Tools haben Sie normalerweise einen Schritt, der das Frontend baut, mit einem Befehl wie: |
|||
|
|||
```bash |
|||
npm run build |
|||
``` |
|||
|
|||
Das würde ein Verzeichnis wie `./dist/` mit Ihren Frontend-Dateien generieren. |
|||
|
|||
Sie können `app.frontend()` verwenden, um dieses Verzeichnis gemäß den Konventionen bereitzustellen, die von diesen Frontend-Frameworks benötigt werden. |
|||
|
|||
**FastAPI** prüft zuerst *Pfadoperationen*. Die Frontend-Dateien werden nur geprüft, wenn keine normale Route gepasst hat, sodass Ihre API nicht beeinträchtigt wird. |
|||
|
|||
## Ein Frontend bereitstellen { #serve-a-frontend } |
|||
|
|||
Nachdem Sie Ihr Frontend gebaut haben, zum Beispiel mit `npm run build`, legen Sie die generierten Dateien in ein Verzeichnis, zum Beispiel `dist`. |
|||
|
|||
Ihre Projektstruktur könnte so aussehen: |
|||
|
|||
```text |
|||
. |
|||
├── pyproject.toml |
|||
├── app |
|||
│ ├── __init__.py |
|||
│ └── main.py |
|||
└── dist |
|||
├── index.html |
|||
└── assets |
|||
└── app.js |
|||
``` |
|||
|
|||
Stellen Sie es dann mit `app.frontend()` bereit: |
|||
|
|||
{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} |
|||
|
|||
Damit kann ein Request für `/assets/app.js` `dist/assets/app.js` ausliefern. |
|||
|
|||
Wenn Sie außerdem eine **FastAPI**-*Pfadoperation* haben, gewinnt die *Pfadoperation*. |
|||
|
|||
## Clientseitiges Routing { #client-side-routing } |
|||
|
|||
Viele Frontend-Apps, einschließlich **Single-Page-Apps** (SPAs), verwenden clientseitiges Routing. Ein Pfad wie `/dashboard/settings` ist möglicherweise keine echte Datei, aber das Framework würde sich darum kümmern, ihn zu handhaben. |
|||
|
|||
Wenn also direkt auf diese URL zugegriffen wird (statt durch die App zu navigieren), sollte das Backend die Frontend-App von `index.html` bereitstellen, sodass das Frontend-Framework anschließend das clientseitige Routing handhaben kann. |
|||
|
|||
Verwenden Sie dafür `fallback="index.html"`: |
|||
|
|||
{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *} |
|||
|
|||
**FastAPI** verwendet diesen Fallback nur für `GET`- und `HEAD`-Requests, die wie Browser-Navigation aussehen. Fehlende Dateien wie JavaScript, CSS und Bilder geben weiterhin `404` zurück. |
|||
|
|||
Requests mit anderen Methoden, wie `POST` oder `PUT`, an Pfade, die nur zum Frontend-Fallback passen, geben ebenfalls `404` zurück. Reguläre **FastAPI**-*Pfadoperationen* haben weiterhin eine höhere Priorität als Frontend-Routen. |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Standardmäßig hat `fallback` einen Wert von `fallback="auto"`. In den meisten Fällen müssen Sie `fallback` nicht angeben. Lesen Sie weiter unten die Details. |
|||
|
|||
/// |
|||
|
|||
Das ist das, was Sie bei vielen Frontend-Apps möchten, die clientseitiges Routing verwenden, zum Beispiel React mit TanStack Router, Vue, Angular, SvelteKit oder Solid. |
|||
|
|||
## Benutzerdefinierte 404-Seite { #custom-404-page } |
|||
|
|||
Sie können auch eine statische `404.html`-Seite für fehlende Frontend-Pfade ausliefern: |
|||
|
|||
{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *} |
|||
|
|||
Diese Response behält einen Statuscode von `404`. |
|||
|
|||
In diesem Fall liefert **FastAPI** für fehlende Frontend-Pfade nicht `index.html` aus. Stattdessen wird die Datei `404.html` zurückgegeben. |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Standardmäßig hat `fallback` einen Wert von `fallback="auto"`. Damit wird, wenn eine `404.html`-Datei gefunden wird, diese automatisch als Fallback verwendet. |
|||
|
|||
Sie können das `fallback`-Argument also normalerweise weglassen. |
|||
|
|||
/// |
|||
|
|||
Das ist nützlich bei Frontend-Tools, die für jede Seite statische HTML-Dateien generieren, wie Astro. |
|||
|
|||
## Automatischer Fallback { #fallback-auto } |
|||
|
|||
Standardmäßig verwendet `app.frontend()` `fallback="auto"`. |
|||
|
|||
Wenn es im Frontend-Verzeichnis eine `404.html`-Datei gibt, liefern fehlende Frontend-Pfade diese Datei mit dem Statuscode `404` aus. |
|||
|
|||
Andernfalls, wenn es eine `index.html`-Datei gibt, liefern fehlende Browser-Navigationspfade `index.html` aus, was viele Frontend-Apps mit clientseitigem Routing erwarten. |
|||
|
|||
In den meisten Fällen können Sie also `app.frontend("/", directory="dist")` verwenden, ohne das `fallback`-Argument anzugeben. |
|||
|
|||
{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} |
|||
|
|||
## Fallback deaktivieren { #disable-fallback } |
|||
|
|||
Wenn Sie keine Fallback-Datei für fehlende Frontend-Pfade ausliefern möchten, verwenden Sie `fallback=None`: |
|||
|
|||
{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *} |
|||
|
|||
Dann geben fehlende Frontend-Pfade das normale `404` zurück. |
|||
|
|||
## Verzeichnis prüfen { #check-directory } |
|||
|
|||
Standardmäßig prüft `app.frontend()`, dass das Verzeichnis existiert, wenn die App erstellt wird. |
|||
|
|||
Das hilft, Konfigurationsfehler früh zu erkennen. Wenn zum Beispiel das Output-Verzeichnis des Frontend-Builds fehlt, löst **FastAPI** beim Startup einen Fehler aus. |
|||
|
|||
Wenn Ihre Frontend-Dateien später erstellt werden, zum Beispiel durch einen separaten Build-Schritt, nachdem das App-Objekt erstellt wurde, setzen Sie `check_dir=False`: |
|||
|
|||
{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *} |
|||
|
|||
Mit `check_dir=False` prüft **FastAPI** das Verzeichnis nicht, wenn die App erstellt wird. Wenn das konfigurierte Verzeichnis beim Verarbeiten eines Requests immer noch fehlt, löst **FastAPI** dann einen Fehler aus. |
|||
|
|||
## Mit `APIRouter` verwenden { #use-it-with-apirouter } |
|||
|
|||
Sie können Frontend-Dateien auch zu einem `APIRouter` hinzufügen und ihn mit einem Präfix einbinden: |
|||
|
|||
{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *} |
|||
|
|||
In diesem Beispiel werden Frontend-Pfade unter `/app` bereitgestellt. |
|||
|
|||
Alle regulären *Pfadoperationen* in der App haben weiterhin Vorrang, auch in anderen Routern. |
|||
|
|||
## Nur statischer Build-Output { #static-build-output-only } |
|||
|
|||
`app.frontend()` liefert Dateien aus, die bereits von Ihrem Frontend-Build generiert wurden. |
|||
|
|||
Es führt kein serverseitiges Rendering aus. Es ist für Frontend-Frameworks gedacht, die statische Dateien generieren, nicht für Frameworks, die dynamisches Rendering auf dem Server für jeden Request benötigen. |
|||
@ -0,0 +1,48 @@ |
|||
<div class="item"> |
|||
<a title="BlockBee Cryptocurrency Payment Gateway" style="display: block; position: relative;" href="https://blockbee.io?ref=fastapi" target="_blank"> |
|||
<span class="sponsor-badge">sponsor</span> |
|||
<img class="sponsor-image" src="/img/sponsors/blockbee-banner.png" alt="BlockBee Cryptocurrency Payment Gateway" /> |
|||
</a> |
|||
</div> |
|||
<div class="item"> |
|||
<a title="Auth, user management and more for your B2B product" style="display: block; position: relative;" href="https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=topbanner" target="_blank"> |
|||
<span class="sponsor-badge">sponsor</span> |
|||
<img class="sponsor-image" src="/img/sponsors/propelauth-banner.png" alt="Auth, user management and more for your B2B product" /> |
|||
</a> |
|||
</div> |
|||
<div class="item"> |
|||
<a title="Deploy & scale any full-stack web app on Render. Focus on building apps, not infra." style="display: block; position: relative;" href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" target="_blank"> |
|||
<span class="sponsor-badge">sponsor</span> |
|||
<img class="sponsor-image" src="/img/sponsors/render-banner.svg" alt="Deploy & scale any full-stack web app on Render. Focus on building apps, not infra." /> |
|||
</a> |
|||
</div> |
|||
<div class="item"> |
|||
<a title="Cut Code Review Time & Bugs in Half with CodeRabbit" style="display: block; position: relative;" href="https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=banner&utm_campaign=fastapi" target="_blank"> |
|||
<span class="sponsor-badge">sponsor</span> |
|||
<img class="sponsor-image" src="/img/sponsors/coderabbit-banner.png" alt="Cut Code Review Time & Bugs in Half with CodeRabbit" /> |
|||
</a> |
|||
</div> |
|||
<div class="item"> |
|||
<a title="Making Retail Purchases Actionable for Brands and Developers" style="display: block; position: relative;" href="https://subtotal.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=open-source" target="_blank"> |
|||
<span class="sponsor-badge">sponsor</span> |
|||
<img class="sponsor-image" src="/img/sponsors/subtotal-banner.svg" alt="Making Retail Purchases Actionable for Brands and Developers" /> |
|||
</a> |
|||
</div> |
|||
<div class="item"> |
|||
<a title="Deploy enterprise applications at startup speed" style="display: block; position: relative;" href="https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi" target="_blank"> |
|||
<span class="sponsor-badge">sponsor</span> |
|||
<img class="sponsor-image" src="/img/sponsors/railway-banner.png" alt="Deploy enterprise applications at startup speed" /> |
|||
</a> |
|||
</div> |
|||
<div class="item"> |
|||
<a title="SerpApi: Web Search API" style="display: block; position: relative;" href="https://serpapi.com/?utm_source=fastapi_website" target="_blank"> |
|||
<span class="sponsor-badge">sponsor</span> |
|||
<img class="sponsor-image" src="/img/sponsors/serpapi-banner.png" alt="SerpApi: Web Search API" /> |
|||
</a> |
|||
</div> |
|||
<div class="item"> |
|||
<a title="Greptile: The AI Code Reviewer" style="display: block; position: relative;" href="https://www.greptile.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=fastapi_sponsor_page" target="_blank"> |
|||
<span class="sponsor-badge">sponsor</span> |
|||
<img class="sponsor-image" src="/img/sponsors/greptile-banner.png" alt="Greptile: The AI Code Reviewer" /> |
|||
</a> |
|||
</div> |
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue