Automation & Scripting
Piloter un projet de développement d’une application R&T (Niveau 3).
Apprentissages Critiques - Niveau 3 :
➥ Piloter un projet de développement
AC33.01 | Élaborer les spécifications techniques et le cahier des charges d'une application informatique
Analyse Structurelle et Modélisation de Données
Le développement de l'application ASAE23 a débuté par une phase d'analyse approfondie pour traduire les besoins métier en spécifications techniques précises. J'ai opté pour une architecture MVC (Modèle-Vue-Contrôleur) web classique, séparant la logique de traitement (Python/Flask) de l'interface utilisateur (HTML/Jinja2).
La modélisation de la base de données a été cruciale. J'ai conçu un schéma relationnel normalisé (3NF) comprenant plusieurs tables interconnectées pour gérer la complexité des compétences : une table BlocsCompetences pour la catégorisation, une table Competences liée par clé étrangère, et une table de jointure CompetencesNiveaux faisant le lien avec NiveauxAcquisition. Cette structure permet une évolutivité des données sans redondance.
AC33.02 | Mettre en place un environnement de travail collaboratif
Standardisation de l'Environnement de Développement
Pour assurer la cohérence du code au sein de l'équipe et éviter les problèmes de type "ça marche sur ma machine", j'ai mis en place un environnement de développement conteneurisé strict. L'utilisation de Docker et Docker Compose a permis de définir l'infrastructure sous forme de code (IaC).
Le fichier docker-compose.yml orchestre deux services distincts : un service web pour l'application Flask et un service db pour la base de données MySQL 8.0. Cette approche garantit que chaque développeur dispose exactement des mêmes versions de langages et de bases de données, facilitant ainsi l'intégration continue et le travail collaboratif via Git.
AC33.03 | Participer à la formation des utilisateurs
Conception Centrée Utilisateur (UX)
L'ergonomie de l'application a été pensée pour minimiser la courbe d'apprentissage des utilisateurs finaux. J'ai développé des interfaces intuitives utilisant le moteur de template Jinja2 pour générer dynamiquement le contenu HTML.
Pour prévenir les erreurs de saisie lors de l'ajout ou de la modification de compétences, j'ai remplacé les champs texte libres par des menus déroulants (<select>) qui récupèrent automatiquement les données valides (Blocs, Niveaux) depuis la base de données. Cette approche guide l'utilisateur pas à pas, rendant la formation technique quasi superflue grâce à une interface auto-explicative.
AC33.04 | Déployer et maintenir une solution informatique
Orchestration et Maintenance Préventive
Le déploiement de la solution repose sur une configuration Docker Compose robuste (version 3.7). J'ai configuré le mappage des ports (5001:5000) pour exposer l'application Flask tout en isolant la base de données dans un réseau interne virtuel, inaccessible directement depuis l'extérieur pour des raisons de sécurité.
Pour faciliter la maintenance et le débogage, j'ai mis en place des volumes Docker (.:/web) permettant la persistance des données et le rechargement à chaud du code (Hot-Reloading) via la variable d'environnement FLASK_ENV=development. Cela permet d'appliquer des correctifs en temps réel sans interrompre le service de base de données.
AC33.05 | S'informer sur les évolutions et les nouveautés technologiques
Veille Technologique et Choix Stratégiques
Face à l'évolution rapide des frameworks web, j'ai effectué une veille active pour sélectionner la stack technique la plus pérenne. J'ai choisi Flask pour sa légèreté et sa flexibilité par rapport à Django, mieux adapté à notre architecture micro-services.
Concernant la base de données, j'ai dû adapter la configuration de MySQL 8.0 en forçant le plugin d'authentification mysql_native_password dans le fichier Docker Compose. Cette décision technique a été prise suite à l'analyse des incompatibilités récentes avec certains connecteurs Python, démontrant ma capacité à adapter l'infrastructure aux contraintes logicielles modernes.
AC33.06 | Sécuriser l'environnement numérique d'une application
Implémentation de la Sécurité Back-End
La sécurité a été une priorité absolue, intégrée directement dans le code source (Security by Design). J'ai implémenté plusieurs couches de protection critiques :
- Hachage des Mots de Passe : Refusant de stocker les mots de passe en clair, j'ai utilisé la bibliothèque
bcrypt. Chaque mot de passe est salé et haché viabcrypt.hashpwavant insertion en base. - Prévention des Injections SQL : Pour sécuriser les interactions avec la base de données, j'ai banni la concaténation de chaînes. Toutes les requêtes utilisent des requêtes préparées paramétrées (ex:
cursor.execute(query, (username,))), neutralisant toute tentative d'injection de code malveillant. - Gestion de Session Sécurisée : L'accès aux fonctionnalités administratives est protégé par une vérification de session stricte (
session['utilisateur_authentifie']).
Projet de référence : SAE2.03 - Mettre en place une solution informatique pour l'entreprise
SAE 2.03 - Application Web Fullstack de Suivi de Compétences
Conception et développement d'une plateforme centralisée pour la gestion dynamique des blocs de compétences et niveaux d'acquisition, avec une architecture sécurisée par conteneurs.
1. Architecture Backend et Logique Métier
Le cœur de l'application repose sur une API robuste développée en Python avec le framework Flask. J'ai structuré l'application autour de routes RESTful claires pour gérer les différentes interactions utilisateurs (GET pour l'affichage, POST pour le traitement). La logique métier intègre une gestion d'erreurs systématique : chaque interaction avec la base de données est encapsulée dans des blocs try...except mysql.connector.Error pour capturer les échecs de connexion ou les erreurs SQL et éviter le crash du serveur.
Le backend assure également la persistance et l'intégrité des données grâce à une gestion rigoureuse des transactions SQL. Pour chaque opération d'écriture (INSERT, UPDATE, DELETE), j'utilise explicitement conn.commit() pour valider les changements uniquement si aucune erreur ne survient, garantissant l'atomicité des transactions. La configuration de l'application utilise une clé secrète indispensable pour signer les cookies de session de manière cryptographique.
2. Sécurisation Avancée et Authentification
La sécurité a été placée au centre du développement, respectant les principes de l'OWASP pour protéger les données sensibles et les accès :
- Cryptographie des Mots de Passe : J'ai proscrit le stockage en clair. À l'inscription, chaque mot de passe est converti en octets (UTF-8) puis haché avec l'algorithme Bcrypt et un sel unique généré par
bcrypt.gensalt(). Lors de la connexion,bcrypt.checkpw()vérifie la correspondance sans jamais décrypter le mot de passe original. - Protection contre les Injections SQL : Toutes les données issues des formulaires HTML (
request.form) sont considérées comme non fiables. J'ai systématiquement utilisé des requêtes préparées (ex:cursor.execute(query, (param1, param2))) où les paramètres sont passés séparément de la requête SQL, empêchant tout attaquant d'injecter du code SQL malveillant. - Gestion de Session et Isolation : L'accès aux pages internes est verrouillé par une variable de session
session['utilisateur_authentifie']. De plus, les identifiants de base de données (User/Pass) sont isolés dans des variables d'environnement via Docker Compose.
# Hashage avec sel unique à l'inscription (Exemple théorique basé sur l'import)
hashed_password = bcrypt.hashpw(mot_de_passe, bcrypt.gensalt())
# Requête préparée paramétrée (Anti-Injection SQL) - [Extrait app.py]
query = "INSERT INTO user (nom, mot_de_passe) VALUES (%s, %s)"
cursor.execute(query, (nom, hashed_password))
3. Fonctionnalités CRUD et Interface Dynamique
L'application offre une interface complète (CRUD - Create, Read, Update, Delete) permettant une administration totale des compétences sans passer par des requêtes manuelles :
- Lecture et Agrégation : La vue principale n'est pas une simple liste. Le backend exécute des requêtes SQL pour structurer les données hiérarchiquement. Les données sont regroupées permettant à Jinja2 de générer un affichage organisé et lisible par Blocs.
- Mise à jour Intelligente : Le formulaire de modification (
/modifier_competence) utilise une logique en deux temps : il recherche d'abord l'ID du nouveau niveau sélectionné, puis met à jour la table de liaisonCompetencesNiveauxvia une requête UPDATE ciblée. Cela garantit l'intégrité référentielle de la base.
4. Infrastructure Docker et Déploiement
L'intégralité de l'architecture est "Dockerisée" pour assurer la portabilité du projet sur n'importe quel système hôte. Le fichier docker-compose.yml définit une stack technique cohérente :
- Service Base de Données : Utilisation d'une image
mysql:8.0configurée spécifiquement avec l'option--default-authentication-plugin=mysql_native_passwordpour assurer la compatibilité avec le connecteur Python. - Service Web : Le conteneur Python monte le code source via un volume (
.:/web), permettant le développement en temps réel (Hot-Reloading). Le port 5000 du conteneur est mappé sur le port 5001 de l'hôte pour éviter les conflits.
5. Modélisation des Données et Requêtes Complexes
La performance de l'application repose sur une modélisation de données relationnelle optimisée (forme normale 3NF). Plutôt que de stocker toutes les informations dans une table unique, j'ai conçu un schéma éclaté : BlocsCompetences, Competences, et NiveauxAcquisition sont liés par la table d'association CompetencesNiveaux.
Cette structure nécessite des requêtes SQL avancées pour reconstruire l'information. L'architecture permet de lier dynamiquement les tables via des jointures (JOIN) implicites ou explicites dans la logique Python :
-- Exemple de structure logique de la requête d'agrégation
SELECT BC.nom, C.nom, NA.nom
FROM BlocsCompetences BC
JOIN Competences C ON C.bloc_id = BC.id
JOIN CompetencesNiveaux CN ON CN.competence_id = C.id
JOIN NiveauxAcquisition NA ON NA.id = CN.niveau_id
ORDER BY BC.nom ASC;
Cette approche structurelle permet de manipuler des données complexes tout en conservant une base de données légère et sans redondance.
Documents du projet
Rapport : SAE 2.01-4 - Pépinière d'Entreprise
Mon parcours académique et mes expériences en milieu professionnel détaillés dans un document de synthèse.