Pourquoi Flask avec MongoDB : guide pratique ?
Le développement web moderne nécessite une solution flexible et évolutrice pour gérer les données de manière efficace. C'est là que Flask, avec sa simplicité et son extensibilité, se marie parfaitement à MongoDB, un système de base de données NoSQL performant. Un contexte réel où cela peut être utile est le développement d'applications web scalables pour les entreprises qui ont besoin de stocker des millions d'objets de manière réactive et efficace.
Un cas d'utilisation concret serait la création d'une application de gestion des tâches personnelles (todo list) où chaque utilisateur peut créer, lire, mettre à jour et supprimer leurs tâches. Avec Flask et MongoDB, cette application peut facilement s'échaler avec le nombre croissant d'utilisateurs et de tâches en utilisant les capacités scalables de MongoDB.
Prerequis
Avant de commencer ce tutoriel, assurez-vous que vous avez les connaissances suivantes :
- Python : Vous devriez être familier avec les concepts de base de Python.
- MongoDB : Comprendre les bases de la structure de données MongoDB et comment utiliser l'interface MongoDB Shell ou une bibliothèque comme
pymongo. - Flask : Connaissance des routes, des templates, et des variables de session.
Vous aurez besoin des outils suivants installés sur votre système :
- Python 3.8+
- MongoDB 4.0+
- pip (pour installer les bibliothèques Python)
Concepts fondamentaux
Flask
Flask est un framework web en Python qui permet de créer des applications web rapidement et facilement. Il est connu pour sa simplicité et sa flexibilité.
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
MongoDB avec PyMongo
PyMongo est la bibliothèque Python officielle pour MongoDB. Elle permet d'interagir avec MongoDB à partir de Python.
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client['todo_app']
tasks = db['tasks']
## Insertion d'un document
task = {"name": "Faire les courses", "completed": False}
result = tasks.insert_one(task)
print(result.inserted_id)
## Récupération de tous les documents
all_tasks = tasks.find()
for task in all_tasks:
print(task)
Mise en pratique : projet fil rouge
Nous allons créer un simple application Flask qui utilise MongoDB pour gérer une liste de tâches.
Étape 1 : Initialisation du projet
Créez un nouveau dossier pour votre projet et initialisez un environnement virtuel.
mkdir todo_app
cd todo_app
python -m venv venv
source venv/bin/activate # Sur Windows utilisez `venv\Scripts\activate`
Installez Flask et PyMongo.
pip install flask pymongo
Étape 2 : Création des fichiers
Créez les fichiers suivants :
app.py: Le fichier principal de l'application.templates/index.html: Le template HTML pour la liste des tâches.
app.py
from flask import Flask, request, render_template, redirect, url_for
from pymongo import MongoClient
app = Flask(__name__)
client = MongoClient('mongodb://localhost:27017/')
db = client['todo_app']
tasks = db['tasks']
@app.route('/')
def index():
all_tasks = list(tasks.find())
return render_template('index.html', tasks=all_tasks)
@app.route('/add', methods=['POST'])
def add_task():
task_name = request.form['task_name']
task = {"name": task_name, "completed": False}
result = tasks.insert_one(task)
return redirect(url_for('index'))
@app.route('/toggle/<int:task_id>', methods=['POST'])
def toggle_task(task_id):
task = tasks.find_one({"_id": task_id})
if task:
new_completed = not task['completed']
tasks.update_one({"_id": task_id}, {"$set": {"completed": new_completed}})
return redirect(url_for('index'))
@app.route('/delete/<int:task_id>', methods=['POST'])
def delete_task(task_id):
tasks.delete_one({"_id": task_id})
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True)
templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Todo List</title>
</head>
<body>
<h1>Todo List</h1>
<form action="/add" method="post">
<input type="text" name="task_name" placeholder="Add new task">
<button type="submit">Add</button>
</form>
<ul>
{% for task in tasks %}
<li>
task.name
<form action="/toggle/task._id" method="post">
<input type="checkbox" name="completed" {% if task.completed %}checked{% endif %}>
</form>
<form action="/delete/task._id" method="post" style="display:inline;">
<button type="submit">Delete</button>
</form>
</li>
{% endfor %}
</ul>
</body>
</html>
Étape 3 : Exécution de l'application
Assurez-vous que MongoDB est en cours d'exécution, puis exécutez votre application.
python app.py
Ouvrez un navigateur et allez sur http://127.0.0.1:5000/. Vous devriez voir une liste de tâches vide où vous pouvez ajouter des nouvelles tâches.
Erreurs frequentes et debugging
1. MongoDB ne se connecte pas
Code incorrect :
client = MongoClient('mongodb://localhost:27018/')
Correction :
client = MongoClient('mongodb://localhost:27017/')
2. Erreur de connexion à la base de données MongoDB
Code incorrect :
db = client['non_existent_database']
Correction :
if 'non_existent_database' in client.list_database_names():
db = client['non_existent_database']
else:
print("Database does not exist")
3. Erreur d'insertion dans MongoDB
Code incorrect :
task = {"name": "Faire les courses", "completed": False}
result = tasks.insert_one(task)
print(result.inserted_id)
Correction :
try:
task = {"name": "Faire les courses", "completed": False}
result = tasks.insert_one(task)
print(result.inserted_id)
except Exception as e:
print("Error inserting document:", e)
Pour aller plus loin
- Intégration de Flask-Admin : Ajoutez une interface admin pour gérer facilement vos données sans écrire de code.
- Utilisation de Blueprints : Organisez votre application en modèles distincts pour un meilleur maintien et scalability.
- Ajout d'authentification : Sécurisez votre application avec des fonctionnalités comme Flask-Login.
Défi pratique :
Créez une API simple qui permet de gérer des articles (un blog). L'API devrait avoir les endpoints suivants :
GET /articles: Récupère tous les articlesPOST /articles: Crée un nouvel articlePUT /articles/<id>: Met à jour un article existantDELETE /articles/<id>: Supprime un article
Assurez-vous que votre API est sécurisée et répond aux normes RESTful.