Aller au contenu

Frontend

🌐 Traduction par IA et humains

Cette traduction a Ă©tĂ© rĂ©alisĂ©e par une IA guidĂ©e par des humains. đŸ€

Elle peut contenir des erreurs d'interprĂ©tation du sens original, ou paraĂźtre peu naturelle, etc. đŸ€–

Vous pouvez améliorer cette traduction en nous aidant à mieux guider le LLM d'IA.

Version anglaise

Vous pouvez servir des applications frontend statiques avec app.frontend() (ou router.frontend()).

C'est utile pour les outils frontend qui génÚrent des fichiers statiques, comme React avec Vite, TanStack Router, Astro, Vue, Svelte, Angular, Solid, et d'autres.

Avec ces outils, vous avez normalement une étape qui build le frontend, avec une commande comme :

npm run build

Cela générerait un répertoire comme ./dist/ avec vos fichiers frontend.

Vous pouvez utiliser app.frontend() pour servir ce répertoire en suivant les conventions nécessaires à ces frameworks frontend.

FastAPI vérifie d'abord les chemins d'accÚs. Les fichiers frontend ne sont vérifiés que si aucune route normale ne correspond, donc votre API ne sera pas affectée.

Servir un frontend

AprÚs avoir build votre frontend, par exemple avec npm run build, placez les fichiers générés dans un répertoire, par exemple dist.

La structure de votre projet pourrait ressembler Ă  ceci :

.
├── pyproject.toml
├── app
│   ├── __init__.py
│   └── main.py
└── dist
    ├── index.html
    └── assets
        └── app.js

Servez-le ensuite avec app.frontend() :

from fastapi import FastAPI

app = FastAPI()

app.frontend("/", directory="dist")

Avec cela, une requĂȘte vers /assets/app.js peut servir dist/assets/app.js.

Si vous avez également un chemin d'accÚs FastAPI, le chemin d'accÚs est prioritaire.

Routage cÎté client

De nombreuses applications frontend, y compris les applications monopages (SPAs), utilisent le routage cĂŽtĂ© client. Un chemin comme /dashboard/settings peut ne pas ĂȘtre un vrai fichier, mais le framework se chargerait de le gĂ©rer.

Ainsi, si vous accédez directement à cette URL (au lieu de naviguer via l'application), le backend doit servir l'application frontend depuis index.html, afin que le framework frontend puisse ensuite gérer le routage cÎté client.

Pour cela, utilisez fallback="index.html" :

from fastapi import FastAPI

app = FastAPI()

app.frontend("/", directory="dist", fallback="index.html")

FastAPI utilise ce fallback uniquement pour les requĂȘtes GET et HEAD qui ressemblent Ă  une navigation de navigateur. Les fichiers manquants comme JavaScript, CSS et les images renvoient toujours 404.

Les requĂȘtes avec d'autres mĂ©thodes, comme POST ou PUT, vers des chemins qui ne correspondent qu'au fallback frontend renvoient Ă©galement 404. Les chemins d'accĂšs FastAPI rĂ©guliers ont toujours une prioritĂ© plus Ă©levĂ©e que les routes frontend.

Astuce

Par défaut, fallback a une valeur de fallback="auto". Dans la plupart des cas, vous n'avez pas besoin de spécifier fallback. Lisez ci-dessous pour plus de détails.

C'est ce que vous souhaitez avec de nombreuses applications frontend qui utilisent le routage cÎté client, par exemple React avec TanStack Router, Vue, Angular, SvelteKit ou Solid.

Page 404 personnalisée

Vous pouvez également servir une page statique 404.html pour les chemins frontend manquants :

from fastapi import FastAPI

app = FastAPI()

app.frontend("/", directory="dist", fallback="404.html")

Cette réponse conserve un code de statut 404.

Dans ce cas, FastAPI ne servira pas index.html pour les chemins frontend manquants. Il renverra le fichier 404.html Ă  la place.

Astuce

Par défaut, fallback a une valeur de fallback="auto". Avec cela, si un fichier 404.html est trouvé, il sera utilisé automatiquement comme fallback.

Vous pouvez donc normalement omettre l'argument fallback.

C'est utile avec les outils frontend qui génÚrent des fichiers HTML statiques pour chaque page, comme Astro.

Fallback automatique

Par défaut, app.frontend() utilise fallback="auto".

S'il y a un fichier 404.html dans le répertoire frontend, les chemins frontend manquants servent ce fichier avec le code de statut 404.

Sinon, s'il y a un fichier index.html, les chemins de navigation de navigateur manquants servent index.html, ce qui est attendu par de nombreuses applications frontend avec routage cÎté client.

Ainsi, dans la plupart des cas, vous pouvez utiliser app.frontend("/", directory="dist") sans spécifier l'argument fallback.

from fastapi import FastAPI

app = FastAPI()

app.frontend("/", directory="dist")

Désactiver le fallback

Si vous ne souhaitez pas servir de fichier fallback pour les chemins frontend manquants, utilisez fallback=None :

from fastapi import FastAPI

app = FastAPI()

app.frontend("/", directory="dist", fallback=None)

Les chemins frontend manquants renvoient alors le 404 normal.

Vérifier le répertoire

Par défaut, app.frontend() vérifie que le répertoire existe lorsque l'application est créée.

Cela permet de détecter tÎt les erreurs de configuration. Par exemple, si le répertoire de sortie du build frontend est manquant, FastAPI lÚvera une erreur au démarrage.

Si vos fichiers frontend sont créés plus tard, par exemple par une étape de build séparée aprÚs la création de l'objet app, définissez check_dir=False :

from fastapi import FastAPI

app = FastAPI()

app.frontend("/", directory="dist", check_dir=False)

Avec check_dir=False, FastAPI ne vĂ©rifiera pas le rĂ©pertoire lorsque l'application est créée. Si le rĂ©pertoire configurĂ© est toujours manquant lorsqu'une requĂȘte est traitĂ©e, FastAPI lĂšvera alors une erreur.

L'utiliser avec APIRouter

Vous pouvez également ajouter des fichiers frontend à un APIRouter et l'inclure avec un préfixe :

from fastapi import APIRouter, FastAPI

app = FastAPI()
router = APIRouter()

router.frontend("/", directory="dist", fallback="index.html")
app.include_router(router, prefix="/app")

Dans cet exemple, les chemins frontend sont servis sous /app.

Tous les chemins d'accÚs réguliers dans l'application seront toujours prioritaires, y compris dans d'autres routers.

Sortie de build statique uniquement

app.frontend() sert des fichiers déjà générés par votre build frontend.

Il n'exĂ©cute pas de rendu cĂŽtĂ© serveur. Il est destinĂ© aux frameworks frontend qui gĂ©nĂšrent des fichiers statiques, pas aux frameworks qui nĂ©cessitent un rendu dynamique sur le serveur pour chaque requĂȘte.