Pourquoi Deployer Flask sur DigitalOcean ?
Deploiement d'applications web nécessite une infrastructure solide et évolutrice. Les fournisseurs de services cloud comme DigitalOcean offrent des solutions robustes et évoluées pour héberger n'importe quel type d'application, y compris les applications web Python avec Flask. En déployant sur DigitalOcean, vous pouvez profiter de la performance élevée, de la disponibilité accrue et des capacités de scale-out, tout en ayant un contrôle total sur votre environnement.
Un cas d'utilisation concret est le déploiement d'une application Flask pour une petite entreprise ou une start-up. Avec DigitalOcean, on peut facilement adapter l'infrastructure à la demande en ajoutant plus de ressources quand nécessaire. Cela permet une évolutivité flexible tout en maintenant les coûts bas.
Prerequis
- Connaissance approfondie du langage Python
- Familiarité avec le framework Flask
- Compréhension des bases de la gestion de base de données SQL (optionnel)
- Installation de Git pour le contrôle de version
- Un compte DigitalOcean et un solde suffisant
Concepts fondamentaux
1. Environnement virtuel
Un environnement virtuel est une instance Python isolée sur votre système, avec ses propres bibliothèques et paquets installés. Cela aide à éviter les conflits entre les dépendances de différents projets.
Schéma mental :
+-------------------+
| Système |
| |
| +------------+ |
| | Environ- | |
| | ment Virtuel| |
| +------------+ |
| |
| Python |
| Bibliothèques |
| et Paquets |
+-------------------+
Code :
## Créer un environnement virtuel
python3 -m venv myenv
## Activer l'environnement virtuel (Linux/Mac)
source myenv/bin/activate
## Activer l'environnement virtuel (Windows)
myenv\Scripts\activate
2. Gestion des paquets avec pip
Pip est le gestionnaire de paquets Python standard. Il permet d'installer, mettre à jour et supprimer les bibliothèques Python.
Schéma mental :
+-------------------+
| pip |
| |
| +------------+ |
| | Installation| |
| | de Paquets | |
| +------------+ |
| |
| Bibliothèques |
| Python |
+-------------------+
Code :
## Installer une bibliothèque avec pip
pip install flask
## Mettre à jour une bibliothèque
pip install --upgrade flask
3. Structure du projet Flask
La structure d'un projet Flask typique est organisée en plusieurs fichiers et dossiers.
Schéma mental :
+-------------------+
| Projet Flask |
| |
| +------------+ |
| | app.py | |
| | templates/ | |
| | static/ | |
| +------------+ |
| |
| Fichiers |
| Python |
+-------------------+
Code :
## app.py - Point d'entrée de l'application Flask
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
Mise en pratique : projet fil rouge
1. Création du projet
Commencez par créer un nouveau dossier pour votre projet et initialisez-le avec Git.
mkdir todo_app
cd todo_app
git init
2. Création de l'environnement virtuel
Créez et activez un environnement virtuel dans le dossier du projet.
python3 -m venv myenv
source myenv/bin/activate
3. Installation des dépendances
Installez Flask et d'autres bibliothèques nécessaires.
pip install flask
pip freeze > requirements.txt
4. Création du fichier app.py
Créez un fichier app.py avec le code suivant :
## app.py - Point d'entrée de l'application Flask
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
## Base de données en mémoire (pour les tests)
tasks = []
@app.route('/')
def home():
return render_template('index.html', tasks=tasks)
@app.route('/add', methods=['POST'])
def add_task():
task = request.form['task']
if task:
tasks.append(task)
return redirect(url_for('home'))
@app.route('/delete/<int:index>')
def delete_task(index):
if index < len(tasks):
del tasks[index]
return redirect(url_for('home'))
if __name__ == '__main__':
app.run(debug=True)
5. Création du template HTML
Créez un dossier templates et y ajoutez un fichier index.html.
<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Todo App</title>
</head>
<body>
<h1>Todo List</h1>
<form method="POST" action="/add">
<input type="text" name="task" placeholder="Add a new task" required>
<button type="submit">Add Task</button>
</form>
<ul>
{% for task in tasks %}
<li>task <a href="/delete/loop.index0">Delete</a></li>
{% endfor %}
</ul>
</body>
</html>
6. Configuration de la base de données
Pour une application plus robuste, vous pouvez utiliser une base de données comme SQLite ou PostgreSQL.
Code :
## app.py - Point d'entrée de l'application Flask avec SQL Alchemy
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todo.db'
db = SQLAlchemy(app)
class Task(db.Model):
id = db.Column(db.Integer, primary_key=True)
description = db.Column(db.String(255), nullable=False)
@app.route('/')
def home():
tasks = Task.query.all()
return render_template('index.html', tasks=tasks)
@app.route('/add', methods=['POST'])
def add_task():
task = request.form['task']
if task:
new_task = Task(description=task)
db.session.add(new_task)
db.session.commit()
return redirect(url_for('home'))
@app.route('/delete/<int:id>')
def delete_task(id):
task = Task.query.get_or_404(id)
db.session.delete(task)
db.session.commit()
return redirect(url_for('home'))
if __name__ == '__main__':
app.run(debug=True)
## Créer la base de données
with app.app_context():
db.create_all()
7. Exécution de l'application
Exécutez votre application Flask.
python app.py
Accédez à http://127.0.0.1:5000/ dans votre navigateur pour voir l'application en cours d'exécution.
Erreurs frequentes et debugging
1. L'erreur "ModuleNotFoundError"
Code incorrect :
from flask_sqlalchemy import SQLAlchemy
Code correct :
from flask_sqlalchemy import SQLAlchemy
2. L'erreur "AttributeError: 'NoneType' object has no attribute 'commit'"
Code incorrect :
db.session.add(new_task)
db.commit()
Code correct :
db.session.add(new_task)
db.session.commit()
3. L'erreur "405 Method Not Allowed"
Code incorrect :
<form method="POST" action="/add">
<input type="text" name="task" placeholder="Add a new task" required>
<button type="submit">Add Task</button>
</form>
Code correct :
<form method="POST" action="/add">
<input type="text" name="task" placeholder="Add a new task" required>
<button type="submit">Add Task</button>
</form>
Pour aller plus loin
1. Utilisation de Docker pour containeriser votre application
Docker permet de créer des images standardisées qui peuvent être déployées n'importe où.
2. Configuration du déploiement sur DigitalOcean
Utilisez le panel de contrôle DigitalOcean pour configurer le déploiement automatique de votre application Flask.
3. Ajout d'une authentification et de la gestion des utilisateurs
Ajoutez une interface utilisateur pour gérer les utilisateurs et leur tâches.
Défi pratique :
Créez un mini-projet complet avec une interface utilisateur pour ajouter, modifier et supprimer des tâches, ainsi qu'une gestion des utilisateurs. Utilisez Flask pour le backend et Bootstrap pour le frontend.