Mini-Projet sur flask

Utiliser votre mini-projet réalisé en tp de “Développement d’interfaces web” (pas avec les tableaux “articles/type_articles”). Vous avez tous un sujet différent.
Ce code contient toutes les interfaces pour ajouter/afficher/modifier/supprimer (CRUD) des enregistrements dans 2 tables : ces 2 tables sont affichées sous forme de tableau.

Version démonstration : Exemple

livrable

Ce dossier doit contenir un fichier de nom “sql_projet.sql”, ce fichier est votre script sql à jour pour supprimer, créer toutes les tables dans l’ordre puis insérer dans le bon ordre des enregistrements (un jeu de test). Ce dossier doit contenir votre application : un fichier app.py, un dossier “templates” et “static”, éventuellement un script shell pour lancer l’application. (pas de dossier venv)

Votre application doit être fonctionnelle sur une machine de l’IUT avec la commande “python app.py” dans un environnement local où les paquets “pymysql” et “flask” sont installés.

En remplaçant le login et le motDePasse des instructions ci-dessous par votre login et mot de passe sur le serveur mysql de l’iut, les 2 commandes ci-dessous doivent fonctionner pour tester votre application (dans un terminal ouvert dans votre dossier de projet) :

mysql --user=login  --password=motDePasse --host=serveurmysql --database=BDD_login < sql_projet.sql
python app.py

Remarque : pour les travaux faits sur les machines personnelles, attention au mode par défaut only_full_group_by (post 182 ) sur les machines de l’IUT.

Ajouter dans votre projet le petit fichier excel (utiliser ce lien) en remplissant vos nom, prenom, groupe et en mettant des “1” si vous pensez que les parties sont pleinement réalisées.
Ne pas renommer ce fichier, et l’enregistrer dans le même dossier que le fichier “app.py” et que le fichier “sql_projet.sql”


script SQL :


Réaliser un script SQL de nom sql_projet.sql pour :


Vous pouvez modifier la composition des tables en ajoutant une date ou un attribut de type texte avec une image. Utiliser du snake_case pour les noms des tables et des attributs.


CRUD sur 2 tables


afficher les tables

Ces 2 tables sont affichées sous forme de tableau.


Lors de l’affichage de la plus “petite” des 2 tables :

exemple pour les types d’article, le nombre d’articles ayant une dépendance fonctionnelle avec ce type

Lors de l’affichage de la plus “grosse” des 2 tables :

exemple pour les articles, le libellé du type d’article

ajouter et modifier un enregistrement

Lors de l’ajout d’un enregistrement dans la plus grosse des tables

exemple de liste déroulante pour ajouter


exemple de liste déroulante pour modifier

supprimer un enregistrement

Lors de la suppression d’un enregistrement sur la plus petite des tables. Tester si aucune clé étrangère dans l’autre table utilise la clé primaire de l’enregistrement à supprimer. Si c’est le cas proposer des liens pour supprimer les enregistrements en cascade de l’autre table.

exemple de liens pour supprimer en cascade

Le plus compliqué est de conserver l’interface pour supprimer (voir sur l’exemple)

État

exemple d’état

Faire au moins 2 requêtes pour l’état :


Interfaces supplémentaires

exemple de filtre


Mette en ligne votre application.


Pour mettre en ligne votre application :

Annexes : erreurs classiques

Encodage des noms de fichiers et des noms de dossiers

Attention, pour les développeurs travaillant sur des machines avec un système d’exploitation Windows, il est important de prendre en compte les erreurs potentielles liées à l’encodage des caractères.


Lors du développement d’une application qui manipule des caractères spéciaux ou des langues non-anglaises, il est crucial de s’assurer que l’encodage des caractères est correctement géré pour éviter les problèmes d’affichage ou de traitement des données.

Configuration de MySql

MySql est moins “strict” par défaut sur Windows et parfois sur Linux:

Alors que MySQL est sensible par défaut à la casse (au niveau des noms de base et de table)dans la plupart des distributions Unix, il ne l’est pas pour Windows! En revanche, concernant les noms de colonnes, index, alias de colonnes, déclencheurs et procédures MySQL n’est pas sensible à la casse tous systèmes confondus. En fait, tous ces noms sont stockés en minuscules dans le dictionnaire de données.
La variable lower_case_table_names permet de forcer la sensibilité à la casse pour les noms des tables et des bases de données (si elle vaut 0, la sensibilité à la casse est active et les noms sont stockés en minuscules; 1, pas de sensibilité à la casse et les noms sont stockés en minuscules; 2, pas de sensibilité à la casse et les noms sont stockés en respectant la casse). Je vous invite à positionner cette variable à 0 de manière à homogénéiser le codage et à contrôler un peu plus l’écriture de vos instructions SQL. De plus, c’est l’option par défaut sur Linux.

SELECT @@lower_case_table_names; : Cette requête retournera la valeur actuelle de la variable lower_case_table_names qui doit être à 0


Pour vérifier le mode SQL en cours d’utilisation dans votre serveur MySQL, vous pouvez exécuter la requête suivante : SELECT @@sql_mode;.
Cette requête renverra la valeur actuelle de la variable sql_mode, qui représente le mode SQL en cours d’utilisation.
Le résultat sera une chaîne de caractères contenant les différents modes SQL activés et leurs paramètres. Assurez-vous de trouver la valeur ONLY_FULL_GROUP_BY dans la chaîne de caractères renvoyée. Si ce mode n’est pas activé, cela signifie que MySQL peut être moins strict en ce qui concerne la clause GROUP BY dans vos requêtes, ce qui peut entraîner des résultats inattendus. Il est possible que votre application fonctionne correctement sur votre machine, mais rencontre des erreurs lorsqu’elle est exécutée sur une machine de l’IUT.


En résumé, tester sur votre machine :

SELECT @@lower_case_table_names;
-- la réponse devrait être 0

SELECT @@sql_mode;
-- la réponse devrait contenir le mot clé ONLY_FULL_GROUP_BY



Si la configuration de MySQL n’est pas bonne :

Éditer le fichier de configuration my.ini ou my.cnf en tant que root. Dans ce fichier, sous la section serveur identifiée par [mysqld] si elle existe, ajouter les lignes ci-dessous (créer la section si elle n’existe pas):

[mysqld]
lower_case_table_names=0
local_infile=ON
sql_mode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

[mysql]
local_infile=ON

Pour connaître le dossier du fichier my.cnf (Linux,MacOS) ou my.ini (Windows), exécutez la commande mysql --help --verbose. L’information est généralement affichée au début de la sortie. Sur Linux, utilisez sudo en début de commande pour obtenir les privilèges de superutilisateur.



Vous pouvez vérifier l’encodage du serveur MySQL par défaut avec la commande SQL SHOW VARIABLES LIKE 'character_set_%';. Cette requête renvoie les variables liées à l’encodage dans MySQL, y compris la variable character_set_server qui indique l’encodage du serveur MySQL. Les dernières versions de MySQL utilisent par défaut utf8mb4 qui convient parfaitement.

annexe 2 : test de l’application

script de test du projet :

Un premier script extrait les archives .tar.gz et .zip, ce script recherche un dossier et copie un autre script test_projet.sh dans le dossier. Le script test_projet.sh se trouve au même niveau que le fichier app.py (une erreur est signalée dans le cas contraire).


script de test test_projet.sh:

#!/bin/bash

# mysql --user=login --password=secret --host=localhost BDD_s1_projet

HOST=localhost
LOGIN=login
PASSWORD=secret
DATABASE=BDD_s1_projet

sed -i "s/host=.*/host=\"${HOST}\",/g" app.py
sed -i "s/user=.*/user=\"${LOGIN}\",/g" app.py
sed -i "s/password=.*/password=\"${PASSWORD}\",/g" app.py
sed -i "s/database=.*/database=\"${DATABASE}\",/g" app.py

projet=$(ls -l sql_projet.sql)
if [ $? -ne 0 ]
    then
    echo -e "\033[0;31m \n* pas de fichier sql_projet.sql \033[0m"
    nb_fic_sql=$(ls -l *.sql | wc -l)
    if [ "${nb_fic_sql}" -eq "1" ]
    then
        NOM_FIC_SQL=$(echo *.sql)
        cp "$NOM_FIC_SQL" sql_projet.sql
        echo -e "\033[0;32m \n* fichier copier $NOM_FIC_SQL sql_projet.sql \033[0m"
    else
        echo -e "\033[0;31m \n* pas de fichier ****.sql \033[0m"
        exit 2
    fi  
fi

echo "DROP DATABASE  IF EXISTS ${DATABASE}; CREATE DATABASE ${DATABASE};" | mysql --user=${LOGIN} --password=${PASSWORD} --host=${HOST} ${DATABASE}
mysql --user=${LOGIN} --password=${PASSWORD} --host=${HOST} ${DATABASE} < sql_projet.sql

echo "mysql --user=${LOGIN} --password=${PASSWORD} --host=${HOST} ${DATABASE}" > connect.sh
chmod a+x connect.sh
gnome-terminal --tab -- ./connect.sh  &

xed sql_projet.sql app.py &

killall python3
flask --debug  --app app  run   --host 0.0.0.0  &
chromium 127.0.0.1:5000