Vous pouvez me contacter via Facebook pour questions & suggestions :
Page Facebook relative à mon site
Dans le chapitre précédent nous avons réalisé une site statique.
Dans ce chapitre je vous propose un site web dynamique car adossé à un base de données.
Donc chaque visiteur bénéficiera de contenus personnalisés en fonction des choix que ce dernier a effectué.
Il a pour objectif de gérer les espèces animales (faune) d'un milieu aquatique.
Une base de données SQLite est adossée à ce site.
Dans ce chapitre je développe le volet "visiteur" de cette application : l'internaute peut consulter les informations, faire des recherche d'espèces par nom ou par taxon mais il lui est impossible de modifier la base de données (ajouts, modifications, suppressions).
Cette base comprend deux tables.
Elle s'inspire de "animaux.db" (voir chapitre 17) mais comprend des colonnes supplémentaires.
Une espèce appartient à un taxon et un seul ; un taxon comprend 1 à N espèces.
les colonnes "especes.code" & "taxons.code" sont les champs de jointure.
Deux colonnes : code, nom_taxon.
Son contenu :
hydr hydraires medu méduses acti actinies cten cténaires plat vers plats anne annélidés biva bivalves chit chitons gast gastéropodes ceph céphalopodes deca décapodes amph amphipodes cart poissons cartilagineux osse poissons osseux agna agnathes
Cinq colonnes : id, nom_espece, code, photo, e_descripton.
Son contenu :
Notez que le champ "photo" ne contient pas d'image (c'est impossible dans une BD) mais le chemin relatif vers cette image.
Certaines espèces n'ont pas encore d'image liée.
De nombreux espèces observées dans ce milieu n'ont pas encore été saisies par l'administrateur du site.
Cette vue (requête sélection sauvegardée) associe à chaque ligne de "especes" une ligne de "taxons".
CREATE VIEW "vue3" AS SELECT nom_espece, taxons.code as code, nom_taxon, photo FROM especes INNER JOIN taxons ON especes.code = taxons.code
Ce dossier a une structure identique à celle du site web statique (voir chapitre précédent).
Je suis parti de la feuille de style de l'application "appli_web_mollusques" (chapitre précédent) et je me suis contenté de rajouter quelques règles de style en plus :
h3 {font-size : 1.2em; background : olive ; margin : 10px ;}
ul,ol {margin : 10 px ; color : navy; list-style : inside; }
input, label, button {height : 30px ; margin : 10px 1% ; }
Revoyez éventuellement le chapitre précédent : Un site web statique avec Flask
Pour chaque espèce il doit y avoir une photo ; toutes les photos sont au format JPG.
Le programme se nomme "faune.py".
Je ne présente qu'un extrait du script : les différentes routes.
N'oubliez pas d'importer le module sqlite3.
...
@app.route('/')
# sélection d'un taxon
def index():
connexion = sqlite3.connect("faune.db")
curseur = connexion.cursor()
curseur.execute("select code, nom_taxon from taxons order by code")
resultat = curseur.fetchall()
connexion.close()
return render_template("index.htm", lignes = resultat)
@app.route('/especes_alpha')
# liste des espèces par ordre alphabétique
def especes_alpha():
connexion = sqlite3.connect("faune.db")
curseur = connexion.cursor()
curseur.execute("select * from vue3 order by nom_espece,code")
resultat = curseur.fetchall()
legende ="liste des espèces par ordre alphabétique"
return render_template("liste.htm", lignes = resultat,titre=legende)
connexion.close()
@app.route('/especes_taxon')
# liste des espèces par taxon
def especes_taxon():
connexion = sqlite3.connect("faune.db")
curseur = connexion.cursor()
curseur.execute("select * from vue3 order by code, nom_espece ")
resultat = curseur.fetchall()
legende ="liste des espèces par taxon"
return render_template("liste.htm", lignes = resultat, titre = legende)
connexion.close()
@app.route('/taxons')
# liste des taxons
def taxons():
connexion = sqlite3.connect("faune.db")
curseur = connexion.cursor()
curseur.execute("select code, nom_taxon from taxons order by code")
resultat = curseur.fetchall()
return render_template("taxons.htm", lignes = resultat)
connexion.close()
@app.route('/fiches', methods =["POST"])
def fiches():
connexion = sqlite3.connect("faune.db")
curseur = connexion.cursor()
choix = request.form['choix']
sql = "select nom_espece, code,nom_taxon, photo, e_description from vue3 where code =?"
curseur.execute(sql,(choix,))
resultat = curseur.fetchall()
return render_template("fiches.htm", lignes = resultat)
connexion.close()
...
Notez que deux vues appelent le même template ("liste.htm") mais avec des paramètres différents ...
Donc un même template peut afficher plusieurs pages web !
Observez dans chaque vue le code des requêtes sélection. Pour la vue "fiches()", il s'agit d'une requête paramétrée ;
paramètre saisi dans le formulaire du template "index.htm".
C'est le template 'parent', les autres templates héritent de "commun.htm"
Observez bien les liens ; chaque attribut href a pour valeur une route.
On retrouve la fonction url_for() pour générer des URL.
Il sera utilisé pour afficher la liste des espèces par ordre alphabétique OU la liste des espèces par taxon.
Notez la syntaxe du commentaire dans un template et l'héritage du fichier "commun.htm".
Notez le commentaire et l'héritage de "commun.htm".
Ce template contient un formulaire qui permet de sélectionner le code d'un taxon.
Observez attentivement le code pour construire la liste déroulante du formulaire.
Le contenu de cette liste est fourni par la route "/".
La valeur sélectionnée dans cette liste sert de paramètre pour la route "/fiches".
Le formulaire contient une liste déroulante nommée "choix".
La valeur sélectionnée dans la liste est envoyée vers la vue "fiches" : ...form action = "{{ url_for('fiches')}}"
Créez un nouveau dossier à la racine de C: et nommez le "appli_web_faune".
Comme pour le chapitre précédent créez les sous-dossiers "templates" & "static".
Captures d'écran après avoir saisi "localhost:5000" dans la barre d'URL puis avoir sélectionné "décapodes" dans la liste déroulante.
Les divisions NAV & SECTION sont de front.
Les divisions NAV & SECTION sont l'une en en dessous de l'autre.