AnnoncePrésentation de MongoDB 8.0, la plus rapide des MongoDB ! En savoir plus >
AnnonceVoyage AI rejoint MongoDB pour développer des applications d'IA plus précises et plus fiables sur Atlas. En savoir plus >

Qu'est-ce que PyMongo ? Prise en main de Python et MongoDB

Essayez MongoDB Atlas dès aujourd’hui

PyMongo est le pilote MongoDB officiel pour les applications Python synchrones. Si vous souhaitez découvrir comment connecter et utiliser MongoDB depuis votre application Python, vous êtes au bon endroit. Dans ce tutoriel PyMongo, nous allons créer une application CRUD (Create, Read, Update, Delete) simple en utilisant FastAPI et MongoDB Atlas. L’application pourra créer, lire, mettre à jour et supprimer des documents dans une base de données MongoDB, en exposant la fonctionnalité par le biais d’une API REST. Vous pouvez consulter l’application terminée sur Github.

Qu'est-ce que PyMongo ? Prise en main de Python et MongoDB

Application CRUD de gestion de livres

Ma façon préférée de découvrir de nouvelles technologies est d’en créer une. Nous allons donc coder une application backend très simple mais très utile : une application CRUD pour la gestion de livres. Les opérations CRUD seront disponibles via une API REST. L’API comportera cinq points de terminaison :

 

 

Pour construire l’API, nous utiliserons le framework FastAPI. C’est un framework léger, moderne et facile à utiliser pour créer des API. Il génère également une documentation de l’API avec Swagger que nous utiliserons pour tester l’application.

Nous stockerons les livres dans un cluster MongoDB Atlas. MongoDB Atlas est la plateforme Database-as-a-Service de MongoDB. Elle est hébergée sur le cloud et vous permet de créer un compte et un cluster gratuits en quelques minutes, sans rien installer sur votre machine. Nous utiliserons PyMongo pour nous connecter au cluster et interroger les données.

Exigences

Le projet terminé est disponible sur Github. Vous pouvez également suivre les instructions étape par étape pour créer le projet à partir de zéro. Pour cela, vous aurez besoin des éléments suivants :

Configuration et mise en place du projet

Avant de commencer, nous allons créer un environnement virtuel Python pour isoler le projet des autres paquets Python installés globalement. Nous allons utiliser le paquet `venv`, qui est fourni avec votre installation de Python. Exécutez la commande suivante depuis le terminal :

 

 

Remarque : vous devrez peut-être exécuter cette commande à l’aide de l’exécutable python3. En effet, sur certains systèmes d’exploitation, les versions 2 et 3 de Python sont toutes deux installées. Une fois connecté à votre environnement virtuel, l’exécutable python utilisera automatiquement la version 3.

Maintenant que nous avons un environnement virtuel, nous pouvons installer les paquets requis. Nous allons utiliser pip, le gestionnaire de paquets pour Python, qui est également inclus dans votre installation Python :

 

 

Ensuite, nous allons créer un répertoire pour notre projet, y naviguer, et mettre en place les fichiers nécessaires au projet.

 

 

Remarque : nous utiliserons des commandes shell pour créer des fichiers et des répertoires, et pour naviguer dedans. Si vous préférez, vous pouvez utiliser un explorateur de fichiers graphique.

Commençons par implémenter un point de terminaison racine `/` simple qui renvoie un message de bienvenue. Ouvrez le fichier main.py dans votre éditeur de code préféré et ajoutez ce qui suit :

pymongo-fastapi-crud/main.py

 

 

Enregistrez le fichier et exécutez l’application avec le paquet uvicorn, qui a été installé en même temps que le paquet fastapi.

 

 

Vous devriez voir la réponse suivante :

 

 

Ouvrez http://127.0.0.1:8000 dans votre navigateur. Le message de bienvenue devrait s’afficher.

Bien joué ! Nous avons un serveur qui fonctionne. Dans la section suivante, nous allons nous connecter à notre cluster MongoDB Atlas.

Connexion à votre cluster MongoDB Atlas

Ensuite, nous devons nous connecter au cluster MongoDB Atlas que nous avons créé précédemment. Localisez votre string de connexion et ajoutez-le au fichier .env. Remplacez le nom d’utilisateur et le mot de passe par vos identifiants.

pymongo-fastapi-crud/.env

 

Nous utiliserons le paquet python-dotenv pour charger les variables d’environnement ATLAS_URI et DB_NAME depuis le fichier .env. Ensuite, nous utiliserons le paquet pymongo pour nous connecter au cluster Atlas au démarrage de l’application. Nous ajouterons un autre gestionnaire d’événements pour fermer la connexion lorsque l’application s’arrête. Ouvrez à nouveau le fichier main.py et remplacez son contenu par ce qui suit :

 

 

Le processus uvicorn détectera la modification du fichier et redémarrera le serveur. Le message « Connecté à la base de données MongoDB ! » devrait s’afficher dans le terminal.

Créer des modèles pour les requêtes et réponses d'API

MongoDB possède un modèle de schéma flexible qui permet de regrouper des documents de structure différente au sein de la même collection. En pratique, les documents d’une collection partagent généralement la même structure. Si besoin, vous pouvez même appliquer des règles de validation par collection. Notre tutoriel PyMongo ne couvre pas la validation des bases de données. Nous nous assurerons à la place que les données passant par l’API REST sont valides avant de les stocker dans la base de données.

Nous allons créer quelques modèles de requêtes et de réponses de l’API et laisser FastAPI faire le gros du travail à notre place. Le framework se chargera de la validation, de la conversion vers les bons types de données et même de la génération de la documentation de l’API. Ouvrez le fichier models.py et ajoutez ce qui suit :

pymongo-fastapi-crud/models.py

 

Nous étendons le BaseModel du paquet pydantic et ajoutons les champs pour nos modèles. Pour le modèle Book, nous avons quatre champs obligatoires : id, title, author et synopsis. Le champ id est automatiquement rempli avec un UUID (identifiant universel unique). Nous avons également un exemple pour le modèle Book qui sera affiché dans la documentation de l’API.

Les champs du modèle BookUpdate sont facultatifs. Cela nous permettra d’effectuer des mises à jour partielles. Nous n’avons pas de champ id dans le modèle BookUpdate car nous ne voulons pas permettre à l’utilisateur de modifier l’id.

Maintenant que nous avons défini nos modèles, mettons en œuvre les points de terminaison de l'API REST et utilisons les modèles pour valider les données.

Implémenter les points de terminaison de l’API REST

Passons maintenant à la partie amusante ! Nous allons créer les points de terminaison de l’API REST pour nos livres. Nous ajouterons l’implémentation des points de terminaison dans le fichier routes.py, et chargerons les routes dans le fichier main.py. Nous allons commencer par initialiser un objet APIRouter dans le fichier routes.py :

pymongo-fastapi-crud/routes.py

 

 

Comme vous pouvez le constater, nous importons APIRouter depuis le paquet fastapi. Nous allons utiliser cet objet pour définir les points de terminaison de notre API REST. Nous importons également les modèles Book et BookUpdate que nous avons définis précédemment.

POST /book

Le premier point de terminaison que nous allons implémenter est POST /books pour créer un nouveau livre. Ajoutez ce qui suit après la ligne router = APIRouter() :

pymongo-fastapi-crud/routes.py

 

La route est / parce que nous allons préfixer tous les points de terminaison des livres par /books. L’attribut response_description sera affiché dans la documentation de l’API. L’attribut status_code est le code d’état HTTP renvoyé lorsque la requête est réussie. Nous utilisons le modèle Book pour valider à la fois les données transmises dans le corps de la requête et la réponse envoyée. FastAPI se charge de la validation. Dans le corps de la fonction, nous utilisons la méthode insert_one() de PyMongo pour ajouter le nouveau livre à la collection books. Nous utilisons la méthode find_one() pour retrouver le livre nouvellement créé dans la base de données. Pour en savoir plus sur les méthodes insert_one() et find_one(), consultez l’article de documentation de PyMongo pour les opérations au niveau de la collection.

Enfin, nous renvoyons le livre créé.

GET /book

Ensuite, nous allons implémenter le point de terminaison GET /book pour renvoyer une liste contenant tous les documents de la collection books. Ajoutez ce qui suit à la fin du fichier routes.py :

pymongo-fastapi-crud/routes.py

 

 

Pour le modèle de réponse, nous utilisons le type List[Book]. Cela signifie que la réponse sera une liste d’objets Book. Nous utilisons également la méthode find() pour extraire au maximum 100 livres de la base de données. Pour en savoir plus sur la limite et les autres paramètres de la méthode find(), consultez la page dédiée de la documentation PyMongo.

GET /book/{id}

Créons un autre point de terminaison GET pour récupérer un seul livre par son id. Ajoutez ce qui suit à la fin du fichier routes.py :

pymongo-fastapi-crud/routes.py

 

Ici, nous utilisons la méthode find_one() pour extraire un seul livre de la base de données. Si le livre est trouvé, nous le renvoyons. Si le livre est introuvable, nous lançons une HTTPException avec un code d’état 404 Not Found et un message approprié.

PUT /book/{id}

Le point de terminaison le plus important de notre API REST est sans doute PUT /book/{id}. Ce point de terminaison nous permet de mettre à jour un seul livre. Ajoutez l’implémentation suivante à la fin du fichier routes.py :

pymongo-fastapi-crud/routes.py

 

Passons en revue le code. Tout d’abord, nous créons un objet que nous utiliserons pour mettre à jour le livre. Ensuite, s’il existe des champs dans l’objet book, nous utilisons la méthode update_one() pour mettre à jour le livre dans la base de données. Il est important de noter que nous utilisons l’opérateur de mise à jour $set pour garantir que seuls les champs spécifiés sont mis à jour, plutôt que de réécrire l’ensemble du document.

Ensuite, nous vérifions l’attribut modified_count de update_result pour vérifier que le livre a été mis à jour. Si c’est le cas, nous utilisons la méthode find_one() pour extraire le livre mis à jour de la base de données et le renvoyer.

S’il n’y a pas de champs dans l’objet book, nous renvoyons simplement le livre existant. Cependant, si le livre est introuvable, nous lançons une commande HTTPException avec un code d’état 404 Not Found.

SUPPRIMER /book/{id}

Le dernier point de terminaison que nous allons implémenter est DELETE /book/{id} pour supprimer un seul livre par son ID. Ajoutez ce qui suit à la fin du fichier routes.py :

pymongo-fastapi-crud/routes.py

 

Ici, notons que si le livre a été supprimé, nous renvoyons un code d’état 204 No Content. Il s’agit d’un code d’état réussi indiquant que la requête a abouti et qu’il n’y a pas de contenu à envoyer dans le corps de la réponse.

Enregistrer

Enfin, nous devons enregistrer les points de terminaison /book. Ouvrez le fichier main.py, importez le module routes et enregistrez le routeur de livres. Votre version finale du fichier main.py devrait ressembler à ceci :

pymongo-fastapi-crud/main.py

Explorer la page de documentation de l’API et tester les points de terminaison

Assurez-vous que votre processus uvicorn est toujours en cours avant de continuer. Si ce n’est pas le cas, vous pouvez commencer avec la même commande dans le terminal :

 

 

Accédez à l’URL http://localhost:8000/docs dans votre navigateur. Voici la page de documentation de l’API que FastAPI et Swagger ont générée pour nous.

Nous voyons tous les points de terminaison que nous avons créés et nous pouvons même envoyer des requêtes directement depuis cette page. Ouvrez l’onglet POST et cliquez sur le bouton Try it out. Un corps de requête prérempli avec notre livre d’exemple devrait s’afficher. Cliquez sur Exécuter pour envoyer la requête. Une réponse de réussite avec le livre que nous avons créé devrait s’afficher. Vous pouvez copier l’id du livre à partir de la réponse et l’utiliser dans l’un des autres points de terminaison : GET /book/{id}, PUT /book/{id} ou DELETE /book/{id}.

Que se passe-t-il si nous essayons de créer le même livre deux fois ? Nous obtenons une réponse 500 Internal Server Error. Si nous vérifions le terminal dans lequel le processus du serveur s’exécute, nous devrions voir un message d’erreur contenant ce qui suit :

 

 

Nous avons reçu une erreur DuplicateKeyError car nous avons essayé d’insérer un livre avec le même champ _id deux fois. Le champ _id est un index unique que MongoDB crée pour chaque collection. Nous ne pouvons pas avoir deux livres avec le même _id. Le véritable problème ici est que nous ne gérons pas cette erreur dans notre code. L’erreur remonte et le serveur répond par un message 500 Internal Server Error. À titre d’exercice, vous pouvez penser à une réponse appropriée à renvoyer au client et à la manière de gérer cette erreur.

Vous pouvez également tester les règles de validation que nous avons créées. Par exemple, essayez de supprimer le champ obligatoire title du corps de la requête et cliquez sur Execute. Un message d’erreur devrait s’afficher indiquant que le champ title est obligatoire.

La page de documentation de l'API générée est très utile pour tester différents scénarios et observer le comportement de l'API. Amusez-vous à explorer l'API que nous avons créée.

Conclusion

Dans ce tutoriel, nous avons vu comment créer une application CRUD simple avec FastAPI et PyMongo, le pilote officiel MongoDB pour les applications Python synchrones. Nous avons également vu comment configurer rapidement un cluster MongoDB Atlas gratuit et nous y connecter. MongoDB Atlas est bien plus qu’une simple base de données cloud MongoDB. Par exemple, vous pouvez facilement étendre votre API pour fournir une recherche en texte intégral avec Atlas Search. Tous ces services sont disponibles dans MongoDB Atlas. Si vous voulez les essayer, créez votre compte gratuit.

FAQ

Commencez avec MongoDB Atlas dès aujourd’hui

Commencez en quelques secondes. Nos clusters gratuits sont fournis avec une capacité de stockage de 512 Mo afin que vous puissiez tester des exemples de données et vous familiariser avec notre plateforme.
Essai gratuitContacter le service commercial
PREMIERS PAS :
  • Plus de 125 régions dans le monde
  • Exemples de jeux de données
  • Authentification permanente
  • Chiffrement de bout en bout
  • Outils de ligne de commande