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
Conserver le même projet que pour l’interface en “Développement
d’Interface Web”
Respecter les mêmes consignes que pour le mini
projet en “Développement d’Interface Web” :
les noms des fonctions (méthodes) dans l’application doivent porter le nom de l’opération puis le nom de la table ; utiliser du snake_case : show_nom_table add_nom_table valid_add_nom_table delete_nom_table edit_nom_table valid_add_nom_table …
les routes doivent porter le nom de la table
puis le nom de l’opération ( en kebab-case ou spinal case) : /nom-table/show
/nom-table/edit
/nom-table/add
…
créer dans le dossier templates un dossier de vue qui porte le nom de la table (utilise du snake_case) : les noms sont indiqués dans chaque sujet
mettre aux fichiers des vues des noms de la
forme (add_table.html
edit_table.html
show_table.html
)
les noms des champs input(name) doivent porter le nom des clés (attribut) des dictionnaires que vous utilisez
Le contenu des dictionnaires récupérés lors d’une requête
“SELECT” est le même que dans votre sujet : utiliser l’attribut AS
pour renommer les colonnes donc les
clés du dictionnaire.
toutes les valeurs du formulaire des champs INPUT doivent être affichées dans le messages “flash” lors de la soumission du formulaire : ça ne pose aucun problème si le nom des variables n’est pas identique au nom des colonnes lors des requêtes INSERT UPDATE et DELETE.
Ne pas utiliser le mot clé “WITH” en python (gestion des
exceptions), ne pas remplacer le SQL par du python sinon un grosse
pénalité sera appliquée.
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.
Ajoutez 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”
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.
Ces 2 tables sont affichées sous forme de tableau.
Lors de l’affichage de la plus “petite” des 2 tables :
Lors de l’affichage de la plus “grosse” des 2 tables :
Lors de l’ajout d’un enregistrement dans la plus grosse des tables
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.
Le plus compliqué est de conserver l’interface pour supprimer (voir sur l’exemple)
Faire au moins 2 requêtes pour l’état :
Pour mettre en ligne votre application :
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.
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 :
dir /s *my.ini*
depuis la racine C:\
find / -name '*my.cnf' 2>/dev/null
É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.
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 &
code sql_projet.sql app.py &
killall python3
flask --debug --app app run --host 0.0.0.0 &
mozilla 127.0.0.1:5000