Cours Python · Module 5: Flask et applications web
Déploiement - publier sur Internet
Dans cette leçon15
Félicitations ! Darwin est là avec la dernière leçon du Module 5 - le déploiement d'une application Flask !
Tu as construit une application Safari Database fonctionnelle avec formulaires, authentification et templates. Il est maintenant temps de la publier sur Internet pour que le monde entier puisse l'utiliser !
Analogie Safari : Le déploiement, c'est comme ouvrir le parc au public - jusqu'ici le parc ne fonctionnait qu'en interne (localhost), maintenant tu ouvres les portes aux touristes du monde entier (Internet) !
Développement vs Production
Développement (localhost)
app.run(debug=True) - serveur de développement
Rechargement automatique après les modifications du code
Erreurs détaillées dans le navigateur
Localhost uniquement - inaccessible depuis Internet
Lent - non optimisé
Production (Internet)
Serveur WSGI (Gunicorn, uWSGI)
Pas de debug=True - sécurité !
Variables d'environnement - SECRET_KEY, DATABASE_URL
Accessible publiquement - tout le monde peut le visiter
Rapide - optimisé
N'utilise JAMAIS app.run(debug=True) en production !
Serveur WSGI - Gunicorn
Gunicorn (Green Unicorn) est un serveur WSGI populaire pour les applications Flask/Django.
WSGI = Web Server Gateway Interface - un standard de communication entre un serveur et une application Python.
Installation
1pip install gunicornLancement
1# De base
2gunicorn app:app
3
4# Avec port et workers spécifiés
5gunicorn app:app --bind 0.0.0.0:8000 --workers 4
6
7# Avec rechargement (dev uniquement)
8gunicorn app:app --reloadFormat : gunicorn <module>:<variable_app>
app- nom du fichier (app.py)app- nom de la variable Flask (app = Flask(name))
Préparer le déploiement
1. Fichier requirements.txt
Enregistre toutes les dépendances :
1pip freeze > requirements.txtrequirements.txt :
1Flask==3.0.0
2Flask-WTF==1.2.1
3Flask-Login==0.6.3
4Werkzeug==3.0.1
5gunicorn==21.2.02. Variables d'environnement
Ne committe JAMAIS SECRET_KEY et les données sensibles sur git !
Utilise des variables d'environnement :
1# app.py
2import os
3
4app = Flask(__name__)
5
6# Récupérer depuis les variables d'environnement
7app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY') or 'dev-fallback-key'
8app.config['DATABASE_URL'] = os.environ.get('DATABASE_URL') or 'sqlite:///dev.db'
9
10# Débogage uniquement en dev
11app.config['DEBUG'] = os.environ.get('FLASK_ENV') == 'development'3. .gitignore
1# .gitignore
2venv/
3__pycache__/
4*.pyc
5*.pyo
6.env
7instance/
8.DS_Store4. Procfile (pour les plateformes comme Render/Heroku)
1web: gunicorn app:appLe Procfile indique à la plateforme comment lancer ton application.
5. runtime.txt (facultatif)
1python-3.11.0Spécifie la version de Python.
Déploiement sur Render (GRATUIT !)
Render est une plateforme d'hébergement moderne avec un plan gratuit. Une excellente alternative à Heroku !
Étape 1 : Préparer l'application
Structure du projet :
1safari_web/
2├── app.py
3├── models.py
4├── forms.py
5├── requirements.txt
6├── Procfile
7├── .gitignore
8├── templates/
9│ └── ...
10└── static/
11 └── ...app.py - dernières lignes :
1if __name__ == '__main__':
2 # Uniquement pour le développement local
3 app.run(debug=True)Render lance via le Procfile, donc le if __name__ ne s'exécutera pas !
Étape 2 : Pousser sur GitHub
1git init
2git add .
3git commit -m "Initial commit - Safari Database"
4git branch -M main
5git remote add origin https://github.com/your-username/safari-web.git
6git push -u origin mainÉtape 3 : Créer un Web Service sur Render
Va sur https://render.com et inscris-toi (GRATUIT)
Clique sur « New + » → « Web Service »
Connecte ton dépôt GitHub
Sélectionne le dépôt
safari-webConfiguration :
- Name : safari-database
- Environment : Python 3
- Build Command :
pip install -r requirements.txt - Start Command :
gunicorn app:app - Plan : Free
Environment Variables - ajoute :
SECRET_KEY=your-random-secret-key-hereFLASK_ENV=production
Clique sur « Create Web Service »
Étape 4 : Déploie !
Render fait automatiquement :
- Installe les dépendances (
pip install -r requirements.txt) - Lance Gunicorn (
gunicorn app:app) - Attribue un domaine (
https://safari-database.onrender.com)
Félicitations ! Ton application est EN LIGNE !
Déploiement sur Railway (aussi GRATUIT !)
Railway est une autre excellente plateforme avec une configuration simple.
Étapes :
- https://railway.app - inscris-toi
- « New Project » → « Deploy from GitHub repo »
- Sélectionne le dépôt
- Railway détecte automatiquement Flask !
- Ajoute les Environment Variables :
SECRET_KEYFLASK_ENV=production
- Railway déploie automatiquement !
Domaine : https://safari-database.up.railway.app
Checklist de déploiement
Avant le déploiement, assure-toi de :
Sécurité
DEBUG = Falseen production- SECRET_KEY en variable d'environnement
- Mots de passe hachés (werkzeug.security)
- Protection CSRF activée (Flask-WTF)
- .gitignore contient
venv/,.env
Fichiers
- requirements.txt à jour
- Procfile créé
- .gitignore créé
- Fichiers statiques correctement configurés
Base de données
- En dev : SQLite
- En prod : PostgreSQL (offre gratuite Render/Railway !)
- DATABASE_URL en variable d'environnement
Tests
- L'application fonctionne en local
- Toutes les routes fonctionnent
- Les formulaires fonctionnent
- La connexion/inscription fonctionne
Base de données en production
SQLite (Développement)
1app.config['DATABASE_URL'] = 'sqlite:///safari.db'Problèmes : SQLite n'est pas recommandé en production (problèmes de concurrence).
PostgreSQL (Production)
Render/Railway offrent PostgreSQL GRATUIT !
Render : Ajoute une base de données PostgreSQL → copie DATABASE_URL
1import os
2
3database_url = os.environ.get('DATABASE_URL')
4
5if database_url and database_url.startswith('postgres://'):
6 # Render utilise postgres://, mais SQLAlchemy a besoin de postgresql://
7 database_url = database_url.replace('postgres://', 'postgresql://', 1)
8
9app.config['SQLALCHEMY_DATABASE_URI'] = database_url or 'sqlite:///dev.db'Fichiers statiques en production
Flask sert automatiquement les fichiers depuis static/, mais en production il vaut mieux utiliser un CDN ou Nginx.
Configuration Flask de base :
1# app.py
2app = Flask(__name__)
3
4# Flask sert automatiquement les fichiers statiques depuis /static/
5# http://yourapp.com/static/css/style.cssDans les templates :
1<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
2<script src="{{ url_for('static', filename='js/script.js') }}"></script>Surveillance et journaux
Logs Render
Dashboard → Ton Web Service → Logs
Logs Railway
Project → Ton Service → Logs
Exemple de logs :
1[2024-01-15 10:23:45] INFO: Starting gunicorn 21.2.0
2[2024-01-15 10:23:45] INFO: Listening at: http://0.0.0.0:10000
3[2024-01-15 10:23:45] INFO: Using worker: sync
4[2024-01-15 10:23:45] INFO: Booting worker with pid: 42Mettre à jour l'application
Render/Railway
- Fais les modifications du code en local
- Committe sur git :
1git add . 2git commit -m "Update: Add new feature" 3git push origin main - Render/Railway déploie automatiquement la nouvelle version !
Auto-deploy = push sur GitHub → déploiement automatique !
Domaine personnalisé (facultatif)
Au lieu de safari-database.onrender.com tu peux utiliser ton propre domaine :
- Achète un domaine (par ex.
safaridatabase.com) - Render/Railway → Settings → Custom Domain
- Ajoute un enregistrement CNAME chez ton registrar de domaine
- Terminé !
https://safaridatabase.com→ Ton application
Plateformes alternatives
1. Fly.io
- Offre gratuite
- Déploiement mondial
- Excellente documentation
2. PythonAnywhere
- Offre gratuite pour Flask
- Configuration simple
- Bon pour les débutants
3. DigitalOcean App Platform
- 5 $/mois
- Plus de contrôle
- Évolutif
4. AWS/Google Cloud/Azure
- Avancé
- Plus cher
- Contrôle total
Exemple d'app.py prêt pour la production
1# app.py
2import os
3from flask import Flask, render_template, redirect, url_for, flash
4from flask_login import LoginManager, login_user, logout_user, login_required, current_user
5from flask_sqlalchemy import SQLAlchemy
6
7app = Flask(__name__)
8
9# Configuration depuis les variables d'environnement
10app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY') or 'dev-key-change-in-production'
11app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('DATABASE_URL') or 'sqlite:///dev.db'
12app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
13
14# Correctif pour l'URL PostgreSQL de Render
15if app.config['SQLALCHEMY_DATABASE_URI'].startswith('postgres://'):
16 app.config['SQLALCHEMY_DATABASE_URI'] = app.config['SQLALCHEMY_DATABASE_URI'].replace('postgres://', 'postgresql://', 1)
17
18db = SQLAlchemy(app)
19login_manager = LoginManager(app)
20login_manager.login_view = 'login'
21
22# Modèles, routes, etc...
23
24if __name__ == '__main__':
25 # Uniquement pour le développement local
26 port = int(os.environ.get('PORT', 5000))
27 app.run(host='0.0.0.0', port=port, debug=os.environ.get('FLASK_ENV') == 'development')Résumé
Dans cette leçon tu as appris :
- La différence entre développement et production
- Les serveurs WSGI (Gunicorn)
- Préparer les applications au déploiement
- Les variables d'environnement (SECRET_KEY, DATABASE_URL)
- Le déploiement sur Render (GRATUIT !)
- Le déploiement sur Railway (GRATUIT !)
- La checklist de déploiement
- Les bases de données en production (PostgreSQL)
- Les fichiers statiques en production
- La surveillance et les journaux
- La mise à jour des applications (auto-deploy)
Analogie Safari finale : Le déploiement, c'est comme la grande ouverture d'un parc de safari - tu as préparé l'infrastructure (le code), embauché du personnel (le serveur WSGI), sécurisé le parc (SECRET_KEY, HTTPS) et ouvert les portes aux touristes du monde entier (Internet) ! Ton application Flask vit et tourne 24h/24 et 7j/7 dans le cloud !
Félicitations pour le Module 5 !
Tu as construit une application web complète avec :
- Frontend (HTML, CSS, JavaScript)
- Backend (Flask)
- Routage et fonctions de vue
- Templates Jinja2
- Formulaires avec validation (Flask-WTF)
- Authentification (Flask-Login)
- Déploiement sur Internet (Render/Railway)
Safari Database est maintenant EN LIGNE et accessible à tous sur Internet !
Darwin est fier de toi ! Prépare-toi pour les prochains modules, où tu apprendras des techniques avancées de Python et d'IA !
Tu as repéré une erreur dans cette leçon ?
Teste tes connaissances
Réponds aux questions de cette leçon. Choisis une réponse pour voir tout de suite si elle est correcte.
1. Qu'est-ce que le déploiement d'une application web ?
2. Qu'est-ce que Gunicorn ?
Voici 2 des 3 questions de cette leçon. Réponds aux autres dans le jeu.
Tâches pratiques dans le jeu
- Tri vertical
Range les étapes typiques du déploiement d'une application Flask :
- Clique dans l'ordre
Range la commande qui génère requirements.txt :
- Éditeur de code
Écris une classe Config avec SECRET_KEY récupérée depuis une variable d'environnement.
- Tri horizontal
Range les éléments d'un décorateur de route :
- Tri vertical
Range les étapes de création d'une application Flask :
- Éditeur de code
Écris une route '/api/species' qui renvoie une liste d'espèces au format JSON.
- Éditeur de code
Crée une route '/' dans Flask qui renvoie « Bienvenue au Safari ! ».
- Éditeur de code
Rends le template 'index.html' en lui passant une variable title.
- Tri vertical
Range les étapes du traitement d'une requête HTTP :
- Éditeur de code
Définis une classe LoginForm avec des champs username et password.
- Éditeur de code
Construis une application Portail des espèces du Safari avec : une liste des espèces, l'ajout de nouvelles espèces, la connexion des utilisateurs et un style CSS de base.