Cours Python · Module 5: Flask et applications web
Les bases du frontend pour les développeurs Python
Dans cette leçon7
Bienvenue dans le Module 5 ! Darwin est là avec un nouveau chapitre - le développement web !
Jusqu'ici tu as travaillé exclusivement sur le backend - Python, bases de données, API. Il est maintenant temps d'apprendre le frontend - l'interface utilisateur que voient les visiteurs de ton site web !
Analogie Safari : Le backend est comme le laboratoire de recherche en coulisses - Python, bases de données, logique. Le frontend, c'est le centre d'information touristique - des panneaux colorés, des cartes interactives, des boutons « En savoir plus sur les lions » !
Pourquoi un dev Python a-t-il besoin du frontend ?
En tant que développeur Python, tu vas construire des applications web - il te faut donc les bases du frontend !
Frontend = HTML + CSS + JavaScript
- HTML - la structure (ce qu'il y a sur la page)
- CSS - l'apparence (à quoi ça ressemble)
- JavaScript - l'interaction (ce qui se passe au clic)
Analogie : Le HTML est le squelette du dinosaure, le CSS est la peau et les couleurs, le JavaScript ce sont les muscles qui permettent le mouvement !
HTML - la structure de la page
Le HTML (HyperText Markup Language) est un langage de balisage qui définit la structure d'une page.
Structure de base
1<!DOCTYPE html>
2<html lang="fr">
3<head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>Safari Database</title>
7</head>
8<body>
9 <h1>Bienvenue sur Safari Database</h1>
10 <p>Système de gestion des données d'espèces</p>
11</body>
12</html>Structure :
<!DOCTYPE html>- déclaration du type de document<html>- élément racine<head>- métadonnées (titre, charset, styles)<body>- contenu visible sur la page
Balises HTML importantes
1<!-- Titres (h1 le plus important, h6 le moins) -->
2<h1>Safari Database</h1>
3<h2>Espèces africaines</h2>
4<h3>Lion (Panthera leo)</h3>
5
6<!-- Paragraphe -->
7<p>Le lion est le plus grand prédateur d'Afrique...</p>
8
9<!-- Lien -->
10<a href="/species/lion">Voir les détails du lion</a>
11
12<!-- Image -->
13<img src="/static/images/lion.jpg" alt="Lion dans le Serengeti">
14
15<!-- Liste non ordonnée -->
16<ul>
17 <li>Lion</li>
18 <li>Éléphant</li>
19 <li>Guépard</li>
20</ul>
21
22<!-- Liste ordonnée -->
23<ol>
24 <li>Récupérer les données</li>
25 <li>Traiter</li>
26 <li>Afficher</li>
27</ol>
28
29<!-- Bouton -->
30<button>Ajouter une observation</button>
31
32<!-- Formulaire -->
33<form action="/add-species" method="POST">
34 <label for="name">Nom :</label>
35 <input type="text" id="name" name="name" required>
36
37 <label for="population">Population :</label>
38 <input type="number" id="population" name="population">
39
40 <button type="submit">Enregistrer</button>
41</form>
42
43<!-- Tableau -->
44<table>
45 <thead>
46 <tr>
47 <th>Espèce</th>
48 <th>Population</th>
49 <th>Habitat</th>
50 </tr>
51 </thead>
52 <tbody>
53 <tr>
54 <td>Lion</td>
55 <td>120</td>
56 <td>Savane</td>
57 </tr>
58 <tr>
59 <td>Éléphant</td>
60 <td>450</td>
61 <td>Savane</td>
62 </tr>
63 </tbody>
64</table>
65
66<!-- Div - conteneur de type bloc -->
67<div class="species-card">
68 <h3>Lion</h3>
69 <p>Population : 120</p>
70</div>
71
72<!-- Span - conteneur en ligne -->
73<p>Statut : <span class="endangered">En danger</span></p>Attributs HTML
1<!-- class - classe CSS -->
2<div class="species-card endangered">...</div>
3
4<!-- id - identifiant unique -->
5<div id="lion-details">...</div>
6
7<!-- data-* - attributs de données personnalisés -->
8<div class="species" data-id="123" data-population="120">...</div>
9
10<!-- href - lien -->
11<a href="https://example.com">Lien</a>
12
13<!-- src, alt - images -->
14<img src="image.jpg" alt="Description de l'image">
15
16<!-- placeholder, required - formulaires -->
17<input type="text" placeholder="Saisis un nom" required>CSS - styliser la page
Le CSS (Cascading Style Sheets) définit l'apparence des éléments HTML.
Façons d'ajouter du CSS
1<!-- 1. CSS en ligne (déconseillé) -->
2<p style="color: green; font-size: 18px;">Texte</p>
3
4<!-- 2. CSS interne (dans <head>) -->
5<head>
6 <style>
7 p {
8 color: green;
9 font-size: 18px;
10 }
11 </style>
12</head>
13
14<!-- 3. CSS externe (recommandé) -->
15<head>
16 <link rel="stylesheet" href="/static/css/style.css">
17</head>Sélecteurs CSS
1/* Sélecteur de balise */
2p {
3 color: #333;
4 line-height: 1.6;
5}
6
7/* Sélecteur de classe */
8.species-card {
9 border: 2px solid #ddd;
10 padding: 20px;
11 margin: 10px;
12 border-radius: 8px;
13}
14
15/* Sélecteur d'ID */
16#lion-details {
17 background-color: #f9f9f9;
18}
19
20/* Sélecteur d'attribut */
21[data-endangered="true"] {
22 border-color: red;
23}
24
25/* Sélecteur d'enfant */
26.species-card > h3 {
27 color: #2c5f2d;
28}
29
30/* État hover (survol) */
31button:hover {
32 background-color: #45a049;
33 cursor: pointer;
34}Propriétés CSS de base
1/* Couleurs */
2.endangered {
3 color: red;
4 background-color: #ffe6e6;
5}
6
7/* Typographie */
8h1 {
9 font-family: 'Arial', sans-serif;
10 font-size: 32px;
11 font-weight: bold;
12 text-align: center;
13}
14
15/* Modèle de boîte */
16.species-card {
17 width: 300px;
18 height: 200px;
19 padding: 20px; /* Espacement intérieur */
20 margin: 10px; /* Espacement extérieur */
21 border: 2px solid #ddd;
22}
23
24/* Flexbox - disposition */
25.species-list {
26 display: flex;
27 flex-wrap: wrap;
28 gap: 20px;
29 justify-content: center;
30}
31
32/* Grid - disposition */
33.species-grid {
34 display: grid;
35 grid-template-columns: repeat(3, 1fr);
36 gap: 20px;
37}Exemple Safari - styliser une fiche d'espèce
1<!DOCTYPE html>
2<html lang="fr">
3<head>
4 <meta charset="UTF-8">
5 <title>Safari Database</title>
6 <style>
7 body {
8 font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
9 background-color: #f4f1de;
10 margin: 0;
11 padding: 20px;
12 }
13
14 h1 {
15 text-align: center;
16 color: #2c5f2d;
17 }
18
19 .species-list {
20 display: flex;
21 flex-wrap: wrap;
22 gap: 20px;
23 justify-content: center;
24 max-width: 1200px;
25 margin: 0 auto;
26 }
27
28 .species-card {
29 background-color: white;
30 border: 2px solid #e0afa0;
31 border-radius: 12px;
32 padding: 20px;
33 width: 280px;
34 box-shadow: 0 4px 6px rgba(0,0,0,0.1);
35 transition: transform 0.2s;
36 }
37
38 .species-card:hover {
39 transform: translateY(-5px);
40 box-shadow: 0 6px 12px rgba(0,0,0,0.15);
41 }
42
43 .species-card.endangered {
44 border-color: #d62828;
45 border-width: 3px;
46 }
47
48 .species-name {
49 color: #2c5f2d;
50 font-size: 24px;
51 margin-top: 0;
52 }
53
54 .badge {
55 display: inline-block;
56 padding: 4px 8px;
57 border-radius: 4px;
58 font-size: 12px;
59 font-weight: bold;
60 }
61
62 .badge-endangered {
63 background-color: #d62828;
64 color: white;
65 }
66
67 .badge-safe {
68 background-color: #4caf50;
69 color: white;
70 }
71 </style>
72</head>
73<body>
74 <h1>Safari Database</h1>
75
76 <div class="species-list">
77 <div class="species-card endangered">
78 <h3 class="species-name">Lion</h3>
79 <p><strong>Population :</strong> 120 individus</p>
80 <p><strong>Habitat :</strong> Savane</p>
81 <span class="badge badge-endangered">En danger</span>
82 </div>
83
84 <div class="species-card endangered">
85 <h3 class="species-name">Éléphant d'Afrique</h3>
86 <p><strong>Population :</strong> 450 individus</p>
87 <p><strong>Habitat :</strong> Savane</p>
88 <span class="badge badge-endangered">En danger</span>
89 </div>
90
91 <div class="species-card">
92 <h3 class="species-name">Girafe</h3>
93 <p><strong>Population :</strong> 850 individus</p>
94 <p><strong>Habitat :</strong> Savane</p>
95 <span class="badge badge-safe">Non menacée</span>
96 </div>
97 </div>
98</body>
99</html>JavaScript - l'interactivité
Le JavaScript ajoute de l'interaction - des réactions aux clics, des animations, des changements dynamiques.
Les bases du JavaScript
1<!DOCTYPE html>
2<html>
3<head>
4 <title>Safari JS</title>
5</head>
6<body>
7 <h1 id="title">Safari Database</h1>
8 <button onclick="changeName()">Changer le titre</button>
9 <button id="addBtn">Ajouter une espèce</button>
10
11 <div id="species-count">Espèces : 0</div>
12
13 <script>
14 // Variables
15 let speciesCount = 3;
16 const databaseName = "Safari DB";
17
18 // Fonction
19 function changeName() {
20 document.getElementById("title").textContent = "Nouveau titre !";
21 }
22
23 // Écouteur d'événement (meilleure méthode que onclick)
24 document.getElementById("addBtn").addEventListener("click", function() {
25 speciesCount++;
26 document.getElementById("species-count").textContent = `Espèces : ${speciesCount}`;
27 });
28
29 // Log console
30 console.log("Page chargée !");
31
32 // Récupérer des données depuis une API
33 fetch("/api/species")
34 .then(response => response.json())
35 .then(data => {
36 console.log("Données récupérées :", data);
37 })
38 .catch(error => console.error("Erreur :", error));
39 </script>
40</body>
41</html>Manipulation du DOM
1// Récupérer un élément
2const title = document.getElementById("title");
3const cards = document.querySelectorAll(".species-card");
4const firstCard = document.querySelector(".species-card");
5
6// Changer le contenu
7title.textContent = "Nouveau titre";
8title.innerHTML = "<strong>Titre en gras</strong>";
9
10// Changer les styles
11title.style.color = "red";
12title.style.fontSize = "32px";
13
14// Ajouter/retirer des classes
15title.classList.add("highlight");
16title.classList.remove("old-class");
17title.classList.toggle("active");
18
19// Créer un nouvel élément
20const newCard = document.createElement("div");
21newCard.className = "species-card";
22newCard.innerHTML = `
23 <h3>Guépard</h3>
24 <p>Population : 7100</p>
25`;
26
27// Ajouter à la page
28document.querySelector(".species-list").appendChild(newCard);
29
30// Retirer un élément
31const cardToRemove = document.querySelector(".species-card");
32cardToRemove.remove();Exemple Safari - liste interactive
1<!DOCTYPE html>
2<html lang="fr">
3<head>
4 <meta charset="UTF-8">
5 <title>Safari interactif</title>
6 <style>
7 body {
8 font-family: Arial, sans-serif;
9 max-width: 800px;
10 margin: 0 auto;
11 padding: 20px;
12 background-color: #f4f1de;
13 }
14
15 .add-form {
16 background: white;
17 padding: 20px;
18 border-radius: 8px;
19 margin-bottom: 20px;
20 }
21
22 input, button {
23 padding: 10px;
24 margin: 5px;
25 border-radius: 4px;
26 border: 1px solid #ddd;
27 }
28
29 button {
30 background-color: #2c5f2d;
31 color: white;
32 cursor: pointer;
33 border: none;
34 }
35
36 button:hover {
37 background-color: #45a049;
38 }
39
40 .species-card {
41 background: white;
42 padding: 15px;
43 margin: 10px 0;
44 border-radius: 8px;
45 border-left: 4px solid #2c5f2d;
46 display: flex;
47 justify-content: space-between;
48 align-items: center;
49 }
50
51 .delete-btn {
52 background-color: #d62828;
53 padding: 8px 12px;
54 font-size: 14px;
55 }
56
57 .delete-btn:hover {
58 background-color: #9d0208;
59 }
60 </style>
61</head>
62<body>
63 <h1>Safari Database - Liste interactive</h1>
64
65 <div class="add-form">
66 <h3>Ajouter une nouvelle espèce</h3>
67 <input type="text" id="speciesName" placeholder="Nom de l'espèce">
68 <input type="number" id="speciesPopulation" placeholder="Population">
69 <button id="addBtn">Ajouter</button>
70 </div>
71
72 <div id="speciesList"></div>
73
74 <p><strong>Total des espèces :</strong> <span id="totalCount">0</span></p>
75
76 <script>
77 // État de l'application
78 let species = [
79 { id: 1, name: "Lion", population: 120 },
80 { id: 2, name: "Éléphant", population: 450 },
81 { id: 3, name: "Guépard", population: 7100 }
82 ];
83 let nextId = 4;
84
85 // Afficher la liste
86 function renderSpecies() {
87 const listElement = document.getElementById("speciesList");
88 listElement.innerHTML = "";
89
90 species.forEach(spec => {
91 const card = document.createElement("div");
92 card.className = "species-card";
93 card.innerHTML = `
94 <div>
95 <strong>${spec.name}</strong> - Population : ${spec.population} individus
96 </div>
97 <button class="delete-btn" onclick="deleteSpecies(${spec.id})">Supprimer</button>
98 `;
99 listElement.appendChild(card);
100 });
101
102 // Mettre à jour le compteur
103 document.getElementById("totalCount").textContent = species.length;
104 }
105
106 // Ajouter une espèce
107 document.getElementById("addBtn").addEventListener("click", function() {
108 const nameInput = document.getElementById("speciesName");
109 const popInput = document.getElementById("speciesPopulation");
110
111 const name = nameInput.value.trim();
112 const population = parseInt(popInput.value);
113
114 if (name && population) {
115 species.push({
116 id: nextId++,
117 name: name,
118 population: population
119 });
120
121 // Vider le formulaire
122 nameInput.value = "";
123 popInput.value = "";
124
125 // Réafficher
126 renderSpecies();
127 } else {
128 alert("Merci de remplir tous les champs !");
129 }
130 });
131
132 // Supprimer une espèce
133 function deleteSpecies(id) {
134 if (confirm("Es-tu sûr de vouloir supprimer cette espèce ?")) {
135 species = species.filter(s => s.id !== id);
136 renderSpecies();
137 }
138 }
139
140 // Affichage initial
141 renderSpecies();
142 </script>
143</body>
144</html>Comment tout cela fonctionne-t-il ensemble ?
HTML → Structure (« quoi ») CSS → Apparence (« à quoi ça ressemble ») JavaScript → Interaction (« ce qui se passe »)
1<!-- HTML - structure -->
2<button id="likeBtn" class="btn">J'aime !</button>
3
4<!-- CSS - apparence -->
5<style>
6 .btn {
7 background-color: #4CAF50;
8 color: white;
9 padding: 15px 32px;
10 border: none;
11 border-radius: 4px;
12 cursor: pointer;
13 }
14 .btn.liked {
15 background-color: #f44336;
16 }
17</style>
18
19<!-- JavaScript - interaction -->
20<script>
21 document.getElementById("likeBtn").addEventListener("click", function() {
22 this.classList.toggle("liked");
23 this.textContent = this.classList.contains("liked")
24 ? "Je n'aime pas :("
25 : "J'aime !";
26 });
27</script>Développeurs Python - que faut-il savoir ?
Le minimum de frontend pour Flask :
- HTML - les bases (balises, formulaires, tableaux)
- CSS - les bases (sélecteurs, modèle de boîte, flexbox)
- JavaScript - les bases (DOM, écouteurs d'événements, fetch)
Tu n'as pas besoin d'être un expert du frontend - Flask avec Jinja2 génère le HTML pour toi !
Ce que tu feras avec Flask :
- Créer des templates (HTML avec Jinja2)
- Du CSS de base pour le style
- Un minimum de JS pour les formulaires/la validation
Les frameworks CSS (styles prêts à l'emploi) t'aideront à créer rapidement de belles interfaces :
- Bootstrap - le plus populaire
- Tailwind CSS - utility-first
- Bulma - simple et léger
Résumé
Dans cette leçon tu as appris :
- Pourquoi un dev Python a besoin du frontend
- HTML - la structure (balises, attributs, formulaires)
- CSS - le style (sélecteurs, couleurs, disposition)
- JavaScript - l'interaction (DOM, écouteurs d'événements)
- Comment HTML, CSS et JS fonctionnent ensemble
- Des exemples Safari concrets
Analogie Safari finale : Le frontend, c'est le centre d'information du parc - des panneaux colorés (CSS), des cartes de sentiers (HTML), des boutons interactifs « En savoir plus » (JavaScript). Le backend, c'est le laboratoire en coulisses (Python + bases de données) !
Dans la prochaine leçon, Darwin te montrera Flask - un microframework pour construire des applications web en Python !
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. Que définit le HTML (HyperText Markup Language) ?
2. Quelles technologies composent le frontend web classique ?
Voici 2 des 3 questions de cette leçon. Réponds aux autres dans le jeu.
Tâches pratiques dans le jeu
- Clique dans l'ordre
Range la structure de base d'un document HTML dans l'ordre, depuis le début :
- Tri horizontal
À quoi ressemble un titre de premier niveau correct en HTML ?
- Tri horizontal
À quoi ressemble un lien (ancre) correct en HTML ?
- Éditeur de code
Écris une page HTML de base avec un titre h1 « Safari Database » et un paragraphe de description.