Frontend¶
đ Ăbersetzung durch KI und Menschen
Diese Ăbersetzung wurde von KI erstellt, angeleitet von Menschen. đ€
Sie könnte Fehler enthalten, etwa MissverstĂ€ndnisse des ursprĂŒnglichen Sinns oder unnatĂŒrliche Formulierungen, usw. đ€
Sie können diese Ăbersetzung verbessern, indem Sie uns helfen, die KI-LLM besser anzuleiten.
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:
npmrunbuild
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¶
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:
.
âââ pyproject.toml
âââ app
â âââ __init__.py
â âââ main.py
âââ dist
âââ index.html
âââ assets
âââ app.js
Stellen Sie es dann mit app.frontend() bereit:
fromfastapiimport FastAPI
app = FastAPI()
app.frontend("/", directory="dist")
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¶
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":
fromfastapiimport FastAPI
app = FastAPI()
app.frontend("/", directory="dist", fallback="index.html")
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.
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¶
Sie können auch eine statische 404.html-Seite fĂŒr fehlende Frontend-Pfade ausliefern:
fromfastapiimport FastAPI
app = FastAPI()
app.frontend("/", directory="dist", fallback="404.html")
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.
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¶
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.
fromfastapiimport FastAPI
app = FastAPI()
app.frontend("/", directory="dist")
Fallback deaktivieren¶
Wenn Sie keine Fallback-Datei fĂŒr fehlende Frontend-Pfade ausliefern möchten, verwenden Sie fallback=None:
fromfastapiimport FastAPI
app = FastAPI()
app.frontend("/", directory="dist", fallback=None)
Dann geben fehlende Frontend-Pfade das normale 404 zurĂŒck.
Verzeichnis prĂŒfen¶
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:
fromfastapiimport FastAPI
app = FastAPI()
app.frontend("/", directory="dist", check_dir=False)
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¶
Sie können Frontend-Dateien auch zu einem APIRouter hinzufĂŒgen und ihn mit einem PrĂ€fix einbinden:
fromfastapiimport APIRouter, FastAPI
app = FastAPI()
router = APIRouter()
router.frontend("/", directory="dist", fallback="index.html")
app.include_router(router, prefix="/app")
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¶
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.