Pourquoi Flask ?
Le développement web en Python est un domaine très actif et évoluant rapidement. Flask, une micro-framework pour Python, a gagné en popularité au fil des années. Elle offre un bon équilibre entre simplicité et fonctionnalités nécessaires, ce qui la rend parfaitement adaptée aux projets de toutes tailles.
Un cas d'usage concret est l'élaboration d'un site web simple pour une petite entreprise. Flask permet de créer cette application en quelques heures, sans avoir besoin de vastes connaissances sur les bases du développement web.
Prerequis
- Python 3.6 ou ultérieur
- Un environnement virtuel (venv)
- Un éditeur de code préféré (VSCode, PyCharm, etc.)
Pour créer un environnement virtuel et installer Flask, suivez ces étapes :
## Créer un environnement virtuel
python3 -m venv venv
## Activer l'environnement virtuel
source venv/bin/activate # Sous Unix/macOS
venv\Scripts\activate # Sous Windows
## Installer Flask
pip install Flask
Concepts fondamentaux
Application Flask
Une application Flask est une instance de la classe Flask. Pour créer une application simple, procédez comme suit :
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
Routes
Les routes déterminent les URL qui correspondent à des vues spécifiques de l'application. Dans le code précédent, la route / est associée à la fonction hello_world.
@app.route('/bonjour/<nom>')
def saluer(nom):
return f'Bonjour, {nom}!'
Templates
Les templates permettent de générer du contenu HTML dynamique. Flask utilise Jinja2 pour les templates.
Créer un fichier templates/hello.html :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Bonjour</title>
</head>
<body>
<h1>Bonjour, nom!</h1>
</body>
</html>
Et modifier la fonction saluer pour utiliser le template :
from flask import render_template
@app.route('/bonjour/<nom>')
def saluer(nom):
return render_template('hello.html', nom=nom)
Handlers de requêtes
Pour gérer les requêtes POST, utilisez le décorateur @app.route avec la méthode POST.
from flask import request
@app.route('/ajouter', methods=['POST'])
def ajouter():
item = request.form['item']
# Ajoutez l'élément à une liste ou enregistrez-le dans la base de données
return f'L\'élément "{item}" a été ajouté.'
Mise en pratique : projet fil rouge
Créeons un simple gestionnaire de tâches. L'application permettra d'afficher, ajouter et supprimer des tâches.
Étape 1 : Créer l'application Flask
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
tasks = []
@app.route('/')
def index():
return render_template('index.html', tasks=tasks)
@app.route('/ajouter', methods=['POST'])
def ajouter():
item = request.form['item']
if item:
tasks.append(item)
return redirect(url_for('index'))
@app.route('/supprimer/<int:index>')
def supprimer(index):
if index < len(tasks):
del tasks[index]
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True)
Étape 2 : Créer le template HTML
Créez un fichier templates/index.html :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Gestionnaire de Tâches</title>
</head>
<body>
<h1>Tâches à Faire</h1>
<form action="url_for('ajouter')" method="post">
<input type="text" name="item" placeholder="Ajouter une tâche" required>
<button type="submit">Ajouter</button>
</form>
<ul>
{% for task in tasks %}
<li>
task
<a href="url_for('supprimer', index=loop.index0)">Supprimer</a>
</li>
{% endfor %}
</ul>
</body>
</html>
Étape 3 : Créer le fichier app.py et exécuter l'application
python app.py
Accédez à http://127.0.0.1:5000/ pour voir votre gestionnaire de tâches en action.
Erreurs frequentes et debugging
Erreur 404 : Page non trouvée
## ❌ Mauvais
@app.route('/tache/<int:index>')
def tache(index):
return tasks[index]
Correction :
from flask import abort
## ✅ Correct
@app.route('/tache/<int:index>')
def tache(index):
if index < len(tasks):
return tasks[index]
else:
abort(404)
Erreur 500 : Internal Server Error
## ❌ Mauvais
@app.route('/ajouter', methods=['POST'])
def ajouter():
item = request.form['item']
tasks.append(item)
return redirect(url_for('index'))
Correction :
## ✅ Correct
@app.route('/ajouter', methods=['POST'])
def ajouter():
try:
item = request.form['item']
if item:
tasks.append(item)
return redirect(url_for('index'))
except Exception as e:
print(e)
return 'Une erreur est survenue', 500
Erreur de template
<!-- ❌ Mauvais -->
<li>
task
<a href="url_for('supprimer', index=loop.index)">Supprimer</a>
</li>
Correction :
<!-- ✅ Correct -->
<li>
task
<a href="url_for('supprimer', index=loop.index0)">Supprimer</a>
</li>
Pour aller plus loin
1. Authentification et Sécurité
Ajoutez une authentification basique à votre application pour protéger les routes sensibles.
from flask_login import LoginManager, login_required, logout_user, login_user
login_manager = LoginManager()
login_manager.init_app(app)
class User:
def __init__(self, id):
self.id = id
@login_manager.user_loader
def load_user(user_id):
return User(user_id)
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('index'))
2. ORM avec SQLAlchemy
Utilisez SQLAlchemy pour gérer la base de données.
from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///tasks.db'
db = SQLAlchemy(app)
class Task(db.Model):
id = db.Column(db.Integer, primary_key=True)
description = db.Column(db.String(100), nullable=False)
@app.route('/ajouter', methods=['POST'])
def ajouter():
item = request.form['item']
if item:
new_task = Task(description=item)
db.session.add(new_task)
db.session.commit()
return redirect(url_for('index'))
3. APIs RESTful
Créez une API RESTful pour gérer les tâches.
from flask import jsonify, request
@app.route('/api/tasks', methods=['GET'])
def get_tasks():
tasks_json = [{'id': task.id, 'description': task.description} for task in Task.query.all()]
return jsonify(tasks_json)
@app.route('/api/task/<int:id>', methods=['DELETE'])
def delete_task(id):
task = Task.query.get_or_404(id)
db.session.delete(task)
db.session.commit()
return '', 204
Défi pratique
Créez une application web complète avec Flask qui inclut les fonctionnalités suivantes :
- Authentification utilisateurs.
- Gestion de notes privées.
- API pour ajouter et récupérer des notes.
En suivant ces étapes, vous serez en mesure d'approfondir vos connaissances sur Flask et créer une application web robuste et sécurisée.