- Version : Strawberry GraphQL 0.315.4 + FastAPI 0.136.1 + Python 3.10+
- Ce que vous allez construire : une API GraphQL complète avec queries, mutations et playground GraphiQL en 30 minutes
- Piège fréquent : les enums Strawberry utilisent le nom Python et non la valeur — utilisez
@strawberry.enum(value=..)pour forcer la valeur - Délai : 30 minutes de l'installation au premier déploiement
Introduction
Vous allez construire une API GraphQL complète avec Python, Strawberry GraphQL 0.315.4 et FastAPI 0.136.1, prête pour la production en 30 minutes. Strawberry génère automatiquement le schéma GraphQL à partir de vos types Python, éliminant les fichiers de configuration redondants. Documentation officielle Strawberry.
Ce que vous allez construire et pourquoi en 2026
Une API GraphQL pour gérer un catalogue de livres avec requêtes (lecture), mutations (création, mise à jour, suppression) et documentation interactive GraphiQL. L'API tourne sur http://localhost:8000/graphql avec un playground pour tester chaque requête en temps réel. Prérequis : Python 3.10 ou supérieur, 4 Go de RAM minimum, macOS/Linux/Windows. Temps estimé : 30 minutes sur n'importe quelle machine récente. Guide de démarrage Strawberry.
Installation : commandes exactes à copier
mkdir graphql-livres && cd graphql-livres
python3 -m venv venv
source venv/bin/activate
pip install 'strawberry-graphql[fastapi]' fastapi uvicorn
Résultat attendu : Strawberry 0.315.4, FastAPI 0.136.1 et Uvicorn 0.46.0 s'installent. Erreur courante : ERROR: No matching distribution found for strawberry-graphql → vérifiez que Python ≥ 3.10 avec python3 --version.
Configuration : les fichiers et variables à définir
Créez le fichier main.py à la racine du projet. Aucune variable d'environnement n'est requise pour le développement local. Pour la production, définissez :
DATABASE_URL: URL de connexion PostgreSQL (ex:postgresql://user:pass@localhost:5432/livres)SECRET_KEY: clé secrète pour l'authentification JWTALLOWED_ORIGINS: domaines autorisés pour CORS (ex:https://monsite.com)
Créez un fichier .env :
DATABASE_URL=sqlite:///./livres.db
SECRET_KEY=votre-cle-secrete-changez-moi
ALLOWED_ORIGINS=http://localhost:3000 Le code du projet : construire l'API GraphQL complète
Créez main.py avec le code complet suivant :
import strawberry
from fastapi import FastAPI
from strawberry.fastapi import GraphQLRouter
from typing import Optional, List # --- Modèle de données en mémoire ---
@strawberry.type
class Livre: id: int titre: str auteur: str annee: Optional[int] = None # Base de données en mémoire pour le tutoriel
livres_db: List[Livre] = [ Livre(id=1, titre="Le Petit Prince", auteur="Antoine de Saint-Exupéry", annee=1943), Livre(id=2, titre="L'Étranger", auteur="Albert Camus", annee=1942), Livre(id=3, titre="Vingt Mille Lieues sous les mers", auteur="Jules Verne", annee=1870),
]
compteur_id = 3 # --- Queries (lecture) ---
@strawberry.type
class Query: @strawberry.field def livre(self, id: int) -> Optional[Livre]: for l in livres_db: if l.id == id: return l return None @strawberry.field def livres(self) -> List[Livre]: return livres_db @strawberry.field def livres_par_auteur(self, auteur: str) -> List[Livre]: return [l for l in livres_db if l.auteur.lower() == auteur.lower()] # --- Mutations (écriture) ---
@strawberry.type
class Mutation: @strawberry.mutation def creer_livre(self, titre: str, auteur: str, annee: Optional[int] = None) -> Livre: global compteur_id compteur_id += 1 nouveau = Livre(id=compteur_id, titre=titre, auteur=auteur, annee=annee) livres_db.append(nouveau) return nouveau @strawberry.mutation def modifier_livre(self, id: int, titre: Optional[str] = None, auteur: Optional[str] = None, annee: Optional[int] = None) -> Optional[Livre]: for l in livres_db: if l.id == id: if titre: l.titre = titre if auteur: l.auteur = auteur if annee is not None: l.annee = annee return l return None @strawberry.mutation def supprimer_livre(self, id: int) -> bool: global livres_db avant = len(livres_db) livres_db = [l for l in livres_db if l.id != id] return len(livres_db) < avant # --- Schéma et application ---
schema = strawberry.Schema(query=Query, mutation=Mutation)
graphql_app = GraphQLRouter(schema) app = FastAPI(title="API Livres GraphQL", version="1.0.0")
app.include_router(graphql_app, prefix="/graphql")
Chaque @strawberry.type définit un type GraphQL automatiquement. Les @strawberry.field deviennent des champs de query, les @strawberry.mutation des mutations. Le schéma est généré sans fichier de configuration supplémentaire.
Tester et valider que ça fonctionne
uvicorn main:app --reload
Ouvrez http://localhost:8000/graphql dans votre navigateur. Le playground GraphiQL s'affiche. Testez ces requêtes :
Lister tous les livres :
query { livres { id titre auteur annee }
}
Ajouter un livre :
mutation { creerLivre(titre: "Les Misérables", auteur: "Victor Hugo", annee: 1862) { id titre }
}
Chercher par auteur :
query { livresParAuteur(auteur: "Victor Hugo") { id titre annee }
}
Si vous voyez les résultats JSON sous le playground, l'API fonctionne. Erreur courante : "Cannot query field \"livres\" on type \"Query\"" → vérifiez que @strawberry.field est bien au-dessus de chaque méthode de Query.
Déployer et utiliser en production
Pour la production, passez de SQLite à PostgreSQL avec SQLModel et lancez avec Gunicorn + Uvicorn workers :
pip install gunicorn sqlmodel psycopg2-binary
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000
Pour Docker, créez un Dockerfile :
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY .
CMD ["gunicorn", "main:app", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:8000"]
Pour mettre à jour Strawberry : pip install --upgrade 'strawberry-graphql[fastapi]'. Consultez les releases sur GitHub Releases.
Aller plus loin : 3 extensions concrètes
1. Authentification JWT — Ajoutez un middleware FastAPI qui vérifie le header Authorization: Bearer <token>. Utilisez python-jose pour encoder/décoder les tokens. Protégez chaque mutation en ajoutant un paramètre context au résolveur.
2. Pagination avec les connexions relay — Strawberry supporte strawberry.pagination depuis la version 0.315. Importez ListConnection depuis strawberry.pagination et remplacez List[Livre] par ListConnection[Livre] dans votre query pour obtenir une pagination curseur-compatible.
3. Souscriptions en temps réel — Ajoutez strawberry.subscription avec WebSocket pour notifier les clients quand un livre est ajouté. Utilisez async for dans votre générateur Python pour émettre les événements.
Comment refuser un loyer supérieur à 30 % du revenu en 2026 ?
Étapes à suivre5
Étape 1 — Installer Python, Strawberry et FastAPI
Vérifiez votre version de Python :python3 --version→ doit afficher 3.10 ou plus. Strawberry requiert au minimum Python 3.8, mais la version 3.10+ est recommandée pour le support complet des types union et de la syntaxematch.
Créez le dossier projet et l'environnement virtuel :
Installez les dépendances :mkdir graphql-livres && cd graphql-livres python3 -m venv venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate # Windows
Vérifiez l'installation :pip install "strawberry-graphql[fastapi]" fastapi uvicorn
La version doit êtrepython3 -c "import strawberry; print(strawberry.__version__)"0.315.4ou supérieure. Strawberry publie une nouvelle version toutes les 2 semaines — consultez les releases sur GitHub Releases.
Erreur courante :ModuleNotFoundError: No module named 'strawberry'→ vous avez oublié d'activer le venv. Relancezsource venv/bin/activatepuis réessayez. Sur certains systèmes Linux, sipippointe vers Python 2, utilisezpip3explicitement.Étape 2 — Configurer le projet et créer les modèles
Créez le fichiermain.pyà la racine. Définissez votre type GraphQL avec@strawberry.type: chaque classe décorée devient un type GraphQL automatiquement. Les champs Python typés (titre: str,auteur: str) sont convertis en champs GraphQL sans configuration supplémentaire.
Exemple complet du modèle :
Le typeimport strawberry from typing import Optional, List @strawberry.type class Livre: id: int titre: str auteur: str annee: Optional[int] = None # Base de données en mémoire pour le tutoriel livres_db: List[Livre] = [ Livre(id=1, titre="Le Petit Prince", auteur="Saint-Exupéry", annee=1943), Livre(id=2, titre="1984", auteur="George Orwell", annee=1949), Livre(id=3, titre="Dune", auteur="Frank Herbert", annee=1965), ]Optional[int]génère un champ GraphQL nullable —anneepeut êtrenulldans les résultats. Pour la production, remplacez la liste Python par SQLModel + PostgreSQL : créez un fichier.envavecDATABASE_URL=postgresql://user:pass@localhost:5432/livreset utilisezcreate_engine(os.environ["DATABASE_URL"])avec une session par requête viaDepends(get_session)de FastAPI.Étape 3 — Construire les queries et mutations
Les queries définissent les opérations de lecture. Ajoutez une classeQuerydécorée par@strawberry.typeavec des méthodes décorées par@strawberry.field. Chaque méthode devient un champ de query :
Testez :@strawberry.type class Query: @strawberry.field def livres(self) -> List[Livre]: return livres_db @strawberry.field def livre(self, id: int) -> Optional[Livre]: return next((l for l in livres_db if l.id == id), None)query { livres { id titre auteur } }renvoie les 3 livres.
Les mutations définissent les opérations d'écriture :
Le schéma se crée avec@strawberry.type class Mutation: @strawberry.mutation def creer_livre(self, titre: str, auteur: str, annee: Optional[int] = None) -> Livre: nouveau = Livre(id=len(livres_db)+1, titre=titre, auteur=auteur, annee=annee) livres_db.append(nouveau) return nouveau @strawberry.mutation def supprimer_livre(self, id: int) -> bool: global livres_db avant = len(livres_db) livres_db = [l for l in livres_db if l.id != id] return len(livres_db) < avantstrawberry.Schema(query=Query, mutation=Mutation)— Strawberry inspecte les classes et génère le schéma GraphQL automatiquement. Testez la mutation :mutation { creerLivre(titre: "Test", auteur: "Auteur") { id titre } }.Étape 4 — Tester avec GraphiQL et résoudre les erreurs
Lancez le serveur :uvicorn main:app --reload. Ouvrezhttp://localhost:8000/graphqldans votre navigateur. Le playground GraphiQL s'affiche avec documentation automatique à droite.
Testez d'abord la query de lecture :
Vous devez voir les 3 livres initiaux. Testez ensuite une mutation d'écriture :query { livres { id titre auteur annee } }
L'ID doit s'incrémenter automatiquement.mutation { creerLivre(titre: "Fondation", auteur: "Asimov", annee: 1951) { id titre } }
Erreurs fréquentes et leurs solutions :
-"Cannot query field"→ vérifiez l'orthographe du champ (GraphQL est sensible à la casse :titre≠Tire).
-"Int cannot represent non-integer value"→ vous avez passé une string pour un paramètre int, retirez les guillemets.
-"Cannot query field "livres" on type "Mutation""→ vous avez mis une query dans le bloc mutation, déplacez-la dansquery { }.
-500 Internal Server Error→ vérifiez les imports Python dansmain.pyavecpython3 -c "from main import schema".Étape 5 — Déployer en production avec Gunicorn et Docker
Pour la production, ne jamais utiliseruvicorn main:appseul — un seul worker ne résiste pas au trafic. Utilisez Gunicorn avec 4 workers Uvicorn :
Créez un fichiergunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000requirements.txt:
Pour Docker, créez unstrawberry-graphql[fastapi]>=0.315.0 fastapi>=0.110.0 uvicorn>=0.29.0 gunicorn>=22.0.0 sqlmodel>=0.0.18 psycopg2-binary>=2.9.9Dockerfile:
Remplacez la liste Python par SQLModel + PostgreSQL en production :FROM python:3.12-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . EXPOSE 8000 CMD ["gunicorn", "main:app", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:8000"]engine = create_engine(os.environ["DATABASE_URL"])avec une session par requête viaDepends(get_session). Pour mettre à jour Strawberry :pip install --upgrade 'strawberry-graphql[fastapi]'puis vérifiez les changements sur GitHub Releases. Configurez les variables d'environnement dans le conteneur :DATABASE_URL,SECRET_KEY,ALLOWED_ORIGINSpour CORS.
Conseils pratiques
- Strawberry génère le schéma GraphQL à partir de vos types Python — pas besoin de fichier
.graphqlséparé. Modifiez le type Python et le schéma se met à jour automatiquement. - Utilisez
strawberry.Privatepour masquer des champs :mot_de_passe: strawberry.Private[str]n'apparaîtra jamais dans la réponse GraphQL. - Activez le mode debug en développement :
app = FastAPI(debug=True)pour voir les traces complètes des erreurs. En production, laissezdebug=False(valeur par défaut).
Points d'attention
- Erreur
"Cannot query field \"livres\" on type \"Query\"": vous avez oublié le décorateur@strawberry.fieldau-dessus de votre méthode. Ajoutez-le et redémarrez. - Erreur
"ModuleNotFoundError: No module named 'strawberry'": l'environnement virtuel n'est pas activé. Exécutezsource venv/bin/activateavant de lancer uvicorn. - Les enums Strawberry utilisent le nom Python par défaut, pas la valeur. Si votre enum a
STATUT_ACTIF = "actif", GraphQL renvoieACTIFet non"actif". Utilisez@strawberry.enum(value=..)pour forcer la valeur.
Questions fréquentes5
Strawberry GraphQL fonctionne-t-il sans GPU ?
Oui. Strawberry est une bibliothèque Python pure qui ne nécessite aucun GPU. Elle tourne sur n'importe quel serveur avec Python 3.10+. Les performances dépendent de la complexité de vos résolveurs et du nombre de requêtes simultanées, pas du matériel graphique.
Quelle version de Python est nécessaire pour Strawberry ?
Strawberry 0.315.4 nécessite Python 3.10 minimum (contrainte >=3.10,<4.0). Vérifiez avec python3 --version. Python 3.12 est recommandé pour les meilleures performances et la compatibilité avec les annotations de type.
Strawberry GraphQL est-il gratuit et open-source ?
Oui. Strawberry est sous licence MIT, gratuite pour tout usage y compris commercial. Le code source est disponible sur GitHub (github.com/strawberry-graphql/strawberry). Il n'y a pas de version premium ni de fonctionnalités payantes.
Comment debugger si Strawberry ne démarre pas ?
Vérifiez 3 choses : 1) python3 -c "import strawberry" → si erreur, réinstallez avec pip install 'strawberry-graphql[fastapi]'. 2) uvicorn main:app --log-level debug pour voir les logs détaillés. 3) Vérifiez que votre fichier s'appelle main.py et contient bien app = FastAPI() au niveau module.
Strawberry vs Graphene : lequel choisir pour mon projet ?
Strawberry utilise les annotations de type Python natives (str, Optional[int]) tandis que Graphene nécessite des classes spécifiques (graphene.String(), graphene.Int()). Strawberry génère le schéma automatiquement depuis vos types, ce qui réduit le code boilerplate de 40 à 60%. Graphene reste pertinent si vous avez un projet existant en Graphene-Django. Pour un nouveau projet en 2026, Strawberry est le choix recommandé par la documentation officielle (strawberry.rocks/docs).
Guides Technologie & IA
Voir toutConstruire un chatbot local avec Ollama et Python en 30 minutes
Utiliser DeepSeek V4 en 2026 pour améliorer la recherche
Utiliser Claude Opus 4.7 en 2026 pour améliorer la productivité
Comment créer et gérer ses mots de passe de manière sécurisée en 2026
Reconnaître un deepfake en 2026 — Comment ça marche
Poursuivez votre lecture
Multi-catégoriesComment refuser un loyer supérieur à 30 % du revenu en 2026 ?
Transmission d'entreprise 2026 : dispositifs fiscaux et étapes clés pour vendre ou céder son affaire
"Impôts du Cœur" : les agents des finances publiques proposent leur aide à la déclaration de revenus sur le marché
Équipe éditoriale GuidePratiquefr
Rédacteurs spécialisés en droit, fiscalité et finances
Rédigé et vérifié par notre équipe de rédacteurs spécialisés. Sources officielles consultées : service-public.fr, legifrance.gouv.fr, impots.gouv.fr, ameli.fr. Dernière vérification : 14 mai 2026.
Sources officielles consultées
Les informations contenues dans ce guide sont fournies à titre indicatif et ne remplacent pas un conseil professionnel personnalisé.