Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site
Dans ce chapître nous allons réaliser une micro application
web avec Flask.
J'emploie le terme "application" puisqu'il aura utilisation d'une base de données SQLite. Donc les pages web seront dynamiques !
La base de données interconnectée aux pages sera "animaux.db" (base déjà utilisée dans les chapitre 17 et 18 de ce tuto).
N'hésitez pas à revoir ces chapitres pour rafraichir vos connaissances sur le langage SQL et sur les commandes Python pour manipuler
les données de la base.
Afin de bien comprendre, je vous conseille d'essayer de réaliser sur votre PC cette application.
Créer à la racine de C: un nouveau dossier et nommez le "flask_sqlite".
Au sein de ce répertoire, créez deux dossiers : "static" & "templates".
Dans le répertoire "static" créez deux sous-dossiers : "css" et "images"
Pour gagner du temps vous allez réutiliser des fichiers qui existent dans le dossier "site_flask" (voir chapitre précédent).
Ainsi la feuille de style externe sera pratiquement identique.
Vous allez utiliser la base "animaux.db". Donc faites une copie de ce fichier à la racine de "c:\flask_sqlite".
Il faut maintenant modifier la copie de la base "animaux.db".
Procédure : à partir de l'onglet "structure de la base", il suffit faire un clic droit sur "especes" et de choisir "modifier une table" puis
d'ajouter successivement deux lignes dans "éditer la définition de la table".
Surtout ne cocher pas NN pour les deux nouveaux champs puisque les deux nouvelles colonnes seront vides dans un premier temps ;
il faut donc autoriser la valeur "None".
Il faut rajouter une colonne t_description de type text dans cette table.
Il vous faudra éventuellement supprimer les vues existantes pour pouvoir modifier les structures des deux tables : c'est un bug de DB Browser ...
Après avoir modifié la structure des deux tables, créer une vue nommée "vue3".
Le code SQL de cette vue :
SELECT nom_espece, taxons.code as code, nom_taxon, photo FROM especes INNER JOIN taxons ON especes.code = taxons.code
Chaque champ doit contenir le chemin vers la photo correspondante.
Testez la requête : "select nom_espece, code, photo, e_description from especes where code ='deca' "
Le rendu de cette requête :
Je précise donc que les photos sont stockées dans le dossier "images".
Il n'est pas nécessaire de donner le chemin complet, donc d'écrire : "/static/images/nomPhoto.jpg".
Pourquoi ? Grâce à la méthode url_for() qui indiquera le repertoire principal : "static".
Il comprend de nombreuses routes.
Notez que les codes des différentes routes se ressemblent beaucoup.
Dans chaque route une requête sélection ayant pour source : "vue3 / especes / taxons".
Les routes '/alpha' & '/taxon' redirigent vers le même template ("liste.htm") mais le contenu
retourné est différent.
Le dossier "templates" va comprendre les différents documents HTML.
C'est le modèle HTML dont vont hériter les différentes pages.
Ci-dessous je ne reprends que le code de la partie BODY (le code de la partie HEAD est identique
au document "commun.htm" du chapitre précédent).
Concenant la partie HEAD, reportez vous au chapitre précédent !
Seule différence : le contenu de la balise TITLE.
Cette page se contente d'afficher les traitements possibles ; elle est pour l'instant purement informative.
Cette page est appelée par les route "/alpha" mais aussi "/taxon".
Le code :
Notez la variable "titre" qui a pour origine "legende" du script.
Observez attentivement les routes "/alpha" et "/taxon" dans le script flask.
Dans les deux cas retour de la liste des espèces mais avec un critère de tri différent.
La légende retournée est aussi différente.
Cette page est appelée par la route "/groupes" qui retourne la liste des taxons.
La page est appelée par la route "/decapodes" qui retourne la liste des crustacés décapodes.
Notez l'instruction : <img src ="{{url_for('static', filename = ligne[2] )}}" class ="gauche" > Ainsi on affiche pour chaque espèce de décapode la photo correspondante.
Cette feuille de style est pratiquement identique à celle conçue dans le chapitre précédent (site sur les mollusques).
Je ne vous communique donc que les ajouts :
J'ai rajouté des styles pour les balises H3, les items de liste à puces et les éléments de formulaire.
Comme pour la version précédente les pages sont "responsives" et il y a un effet visuel pour les images sur survol.
Pour chaque espèce il doit y avoir une photo. Toutes les images sont au format JPG.
Le nom de la photo par rapport au nom de l'espèce doit être logique.
Exemple : si le nom de l'espèce est "crevette grise" le nom de la photo correspondante est "crevette_grise.jpg"
Exemple 2 : si le nom de l'espèce est "araignée de mer" le nom de la photo ad hoc est : "araignee_mer.jpg"
Donc jamais de lettres accentuées, ni de majuscules, ni d'espaces dans les noms des photos.
Notez que toutes les images ont le même type (jpg), pas de lettres accentuées, par de majuscules, pas d'espaces.
Mais surtout le nom de la photo est logique par rapport au nom de l'espèce.
La photo associée à chaque espèce est affichée ; on peut l'agrandir en la survolant (comme pour le site "mollusques" ; voir chapitre précédent).
On voit que les champs "e_description" ne sont pas encore renseignés : valeur retournée = None.
Pourquoi ne pourrait-on pas obtenir les fiches détaillées pour d'autres taxons que les crustacés décapodes ???
La route "/deca" est renommée "/un_taxon"
Cette route sera appelée par le formulaire contenu désormais dans "index.htm".
Cette page contient désormais un formulaire avec un champ de saisie nommé "choix".
La valeur saisie dans ce champ sera le paramètre de la requête sélection.
Notez bien les attributs de la balise FORM : route et méthode.
Un petit changement au niveau de NAV.
C'est le nouveau nom de la page "decapodes.htm". Il faut aussi apporter quelques corrections au code initial.
Code de "un_taxon.htm" :
Les noms des champs remplacent leur indice.
Attention les champs "photo" de la table "especes" ne doivent pas être à NULL car le paramètre
"filename" de la méthode url_for() doit avoir une valeur sinon plantage !
Si vous avez saisi "localhost:5000" (en guise d'URL) vous accédez à la page "index.htm".
Vous n'avez plus qu'à saisir "deca" ou "osse" ou "biva" dans le champ unique du formulaire.
Remarque : pour connaitre les codes des différents taxons il suffit de cliquer sur le lien légendé "liste des différents taxons".
Problème : pour ajouter de nouvelles espèces il faut toujours utiliser DB Browser puisque l'ajout n'est pas prévu dans l'application.
Un formulaire d'ajout dans l'application serait donc souhaitable ...
Notez l'attribut action qui dirige vers la fonction "ajout_espece" du script.
La saisie du code (code taxon) se fait via une liste déroulante (liste statique).
J'ai rajouté un lien vers la route "/nouvelle_espece" qui affiche la page "ajout_espece.htm".
Il faut rajouter à "application.py" deux nouvelles routes.
Les insertions dans le script sont donc les suivantes :
Une route pour afficher le formulaire de saisie dans la table "especes" : "/nouvelle_espece".
La deuxième route crée un nouvel enregistrement dans la table "especes" à partir des données saisies dans le
template "ajout_espece.htm".
Attention il s'agit d'une requête de type INSERT et comme toute requête qui modifie la base, elle doit être confirmée
par une commande "connexion.commit()".
La saisie du code taxon via une liste déroulante, c'est bien. Mais il serait préférable que cette liste déroulante soit dynamique
c'est à dire basée sur la table "taxons" afin que toute modification dans cette source soit répercutée dans la liste.
En fait c'est pas très compliqué à réaliser, comme je vais vous le montrer ci-dessous.
Nouveau code de cette route :
Il faut produire le contenu de la liste déroulante : colonnes code & nom_taxon de la table "taxons", lignes triées par "code".
Il faut aussi modifier le code de cette page.
Code qui construit une liste déroulante dynamique :
Et oui, une simple boucle permet de construire les items de la liste.
Si vous rajoutez une ligne dans la table "taxons", la liste déroulante du formulaire sera automatiquement modifiée.
Dans la foulée je vais améliorer le formulaire de cette page : remplacer la zone de texte par une liste déroulante dynamique.
Il faut donc modifier la fonction "accueil" de la route "/".
Je ne communique pas le code car vous devriez être capable de le reconstituer si vous avez lu attentivement ce chapitre.
Vous allez enrichir l'application : ajout à la table "taxons".
Si vous avez compris tout ce qui précède vous n'aurez aucune difficulté.
Vous pouvez récupérer les fichiers sous forme d'un zip.
dossier compressé "flask_sqlite"
Après avoir installé le fichier décompressé sur votre PC il suffira de double-cliquer sur "application.py" pour lancer
le serveur python. Puis vous basculez sur le navigateur et tapez en guise d'url : localhost:5000
En effet, par défaut, le serveur HTTP intégré à Flask fonctionne sur le port 5000.