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
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”
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 &
xed sql_projet.sql app.py &
killall python3
flask --debug --app app run --host 0.0.0.0 &
chromium 127.0.0.1:5000