Créer une application Web à partir de zéro en utilisant Python Flask et MySQL Partie 5

Dans la partie précédente de cette série, nous avons vu comment mettre en œuvre le modifier et Effacer souhait fonctionnalité pour notre application liste de seau. Dans cette partie, nous allons implémenter la fonctionnalité de pagination pour notre liste de base d’utilisateurs..

Commencer

Commençons par cloner la partie précédente du tutoriel de GitHub.

Clone git https://github.com/jay3dec/PythonFlaskMySQLApp_Part4.git

Une fois le code source cloné, accédez au répertoire du projet et démarrez le serveur Web.. 

cd PythonFlaskMySQLApp_Part4 python app.py

Pointez votre navigateur sur http: // localhost: 5002 / et vous devriez avoir l'application en cours d'exécution.

Mise en œuvre de la pagination

Au fur et à mesure que la liste des souhaits sur la page d'accueil de l'utilisateur augmente, il est fait défiler la page. Il est donc important de mettre en œuvre la pagination. Nous limiterons le nombre d'éléments affichés sur une page à un certain nombre. 

Modifier la procédure d'obtention d'un souhait

Nous allons commencer par modifier le sp_GetWishByUser procédure pour retourner les résultats sur la base d'un limite et décalage valeur. Cette fois, nous allons créer notre instruction de procédure stockée de manière dynamique pour renvoyer le jeu de résultats en fonction de la valeur limite et de la valeur de décalage. Voici le modifié sp_GetWishByUser Procédure stockée MySQL.

UTILISEZ 'BucketList'; DROP procedure IF EXISTS 'sp_GetWishByUser'; DELIMITER $$ USE 'BucketList' $$ CREATE DEFINER = "root" @ 'localhost' PROCEDURE 'sp_GetWishByUser' (IN p_user_id bigint, IN p_limit int, IN p_offset int) BEGIN SET @ t1 = CONCAT ('select * from tbl_wish where wish_user_id = ', p_user_id,' commande par souhait_date desc limite ', p_limit,' offset ', p_offset); PREPARE stmt FROM @ t1; EXECUTE stmt; DEALLOCATE PREPARE stmt1; FIN $$ DELIMITER; 

Comme indiqué dans la procédure stockée ci-dessus, nous avons créé notre requête SQL dynamique et l'avons exécutée pour obtenir la liste de souhaits en fonction de la décalage et limite paramètres.

Ajout de la pagination à l'interface utilisateur

Commençons par définir quelques paramètres par défaut. Dans app.py ajouter une variable pour la limite de page.

# Paramètre par défaut pageLimit = 2 

Faire le getWish méthode python accepte les requêtes POST.

@ app.route ('/ getWish', method = ['POST']) 

Lis le décalage et limite à l'intérieur de getWish méthode et le transmettre tout en appelant la procédure stockée MySQL sp_GetWishByUser

 _limit = pageLimit _offset = request.form ['offset'] con = mysql.connect () curseur = con.cursor () cursor.callproc ('sp_GetWishByUser', (_utilisateur, _limit, _offset)) souhaite = curseur.fetchall () 

Modifier le GetWishes Fonction JavaScript dans userHome.html en faire une demande POST et passer le décalage valeur.

fonction GetWishes () $ .ajax (url: '/ getWish', type: 'POST', données: offset: 0, succès: fonction (res) var wishObj = JSON.parse (res); $ ( '#ulist'). empty (); $ ('# listTemplate'). tmpl (wishObj) .appendTo ('# ulist');, erreur: function (erreur) console.log (erreur);) ; 

Enregistrez toutes les modifications et redémarrez le serveur. Connectez-vous en utilisant une adresse e-mail et un mot de passe valides. Deux enregistrements seulement devraient s'afficher à l'écran..

La base de données fonctionne donc bien. Ensuite, nous devons ajouter l'interface utilisateur de pagination à la page d'accueil de l'utilisateur, ce qui permettra à l'utilisateur de naviguer dans les données..

Nous allons utiliser le composant de pagination Bootstrap. S'ouvrir userHome.html et ajoutez le code HTML suivant après la #uliste UL. 

Enregistrez les modifications et redémarrez le serveur. Après vous être connecté, vous devriez pouvoir voir la pagination dans la liste de souhaits..

Rendre la pagination dynamique

La pagination ci-dessus est à quoi ressemblera notre pagination. Mais pour le rendre fonctionnel, nous devons créer notre pagination de manière dynamique en fonction du nombre d'enregistrements dans la base de données..

Pour créer notre pagination, nous aurons besoin du nombre total d'enregistrements disponibles dans la base de données. Modifions donc la procédure stockée MySQL sp_GetWishByUser pour renvoyer le nombre total d'enregistrements disponibles en tant que paramètre out.

UTILISEZ 'BucketList'; DROP procedure IF EXISTS 'sp_GetWishByUser'; DELIMITER $$ USE 'BucketList' $$ CREATE DEFINER = "root" @ 'localhost' PROCEDURE 'sp_GetWishByUser' (IN p_user_id bigint, IN p_limit int, IN p_offset int, out p_total bigint) BEGIN sélectionner le nombre (*) dans p_total de tbl_w où wish_user_id = p_user_id; SET @ t1 = CONCAT ('select * from tbl_wish où wish_user_id =', p_user_id, 'commande par wish_date desc limite', p_limit, 'offset', p_offset); PREPARE stmt FROM @ t1; EXECUTE stmt; DEALLOCATE PREPARE stmt; FIN $$ DELIMITER;

Comme indiqué dans la procédure stockée modifiée ci-dessus, nous avons ajouté un nouveau paramètre de sortie appelé p_total et sélectionné le nombre total de souhaits en fonction de l'ID utilisateur. 

Également modifier le getWish méthode python pour passer un paramètre de sortie.

 _limit = pageLimit _offset = request.form ['offset'] _total_records = 0 con = mysql.connect () curseur = con.cursor () curseur.callproc ('sp_GetWishByUser', (_ utilisateur, _limit, _offset, _total_records) souhaite * cursor.fetchall () cursor.close () cursor = con.cursor () cursor.execute ('SELECT @ _sp_GetWishByUser_3'); outParam = cursor.fetchall () 

Comme vous pouvez le constater dans le code ci-dessus, une fois que nous avons appelé la procédure stockée, nous fermons le curseur et ouvrons un nouveau curseur pour sélectionner le paramètre renvoyé..

Plus tôt, nous renvoyions une liste de souhaits de la méthode Python. Maintenant, nous devons également inclure le nombre total d'enregistrements dans le JSON renvoyé. Nous allons donc créer le dictionnaire de la liste de souhaits dans une autre liste, puis ajouter la liste de souhaits et le nombre d'enregistrements à la liste principale. Voici le code modifié du getWish méthode python.

response = [] souhaits_dict = [] pour le souhait dans souhait: wish_dict = 'Id': souhait [0], 'Titre': souhait [1], 'Description': souhait [2], 'Date': souhait [4 ] Wish_dict.append (Wish_dict) response.append (Wish_dict) response.append ('total': outParam [0] [0]) renvoie json.dumps (réponse). 

dans le GetWishes Fonction JavaScript, dans le rappel de réussite, ajouter un journal de console.

console.log (res);

Enregistrez toutes les modifications ci-dessus et redémarrez le serveur. Connectez-vous à l'aide d'une adresse e-mail et d'un mot de passe valides et, lorsque vous êtes sur la page d'accueil de l'utilisateur, vérifiez la console du navigateur. Vous devriez pouvoir voir une réponse semblable à celle présentée ci-dessous:

[["Date": "Dim 15 février 2015 15:10:45 GMT", "Description": "wwe", "Id": 5, "Titre": "wwe", "Date": " Samedi, 24 Jan 2015 00:13:50 GMT "," Description ":" Voyage en Espagne "," Id ": 4," Titre ":" Espagne "], " total ": 5]

En utilisant le nombre total reçu de la réponse, nous pouvons obtenir le nombre total de pages. 

var total = wishObj [1] ['total']; var pageCount = total / itemsPerPage;

Diviser le nombre total d'articles de objets par page count nous donne le nombre de pages requis. Mais cela n’est vrai que lorsque le total est un multiple de objets par page. Si ce n'est pas le cas, nous devrons vérifier cela et gérer le nombre de pages en conséquence..

var pageRem = total% itemsPerPage; if (pageRem! = 0) pageCount = Math.floor (pageCount) +1; 

Cela nous donnera le nombre de pages correct.

Maintenant que nous avons le nombre total de pages, nous allons créer la pagination HTML dynamiquement. Retirer le LI élément de la pagination HTML que nous avons ajouté précédemment.

dans le GetWishes Rappel du succès, créons dynamiquement le lien précédent à l'aide de jQuery.

var prevLink = $ ('
  • ') .append ($ ('') .attr (' href ':' # ', ' aria-label ':' Previous ') .append ($ ('') .attr (' aria-hidden ',' true '). html (' '' ')))); $ ('. pagination'). append (prevLink);
  • Dans le code ci-dessus, nous venons de créer le lien de bouton précédent et de l'ajouter à la pagination UL..

    Enregistrez les modifications ci-dessus et redémarrez le serveur. En cas de connexion réussie, vous devriez pouvoir voir le lien précédent dans la liste..

    De même, ajoutons les pages dans la pagination en fonction du nombre de pages.

    pour (var i = 0; i < pageCount; i++)  var page = $('
  • ') .append ($ ('') .attr (' href ',' # '). text (i + 1)); $ ('. pagination'). append (page);
  • Ajoutons également le lien Suivant après que le lien des pages ait été ajouté..

    var nextLink = $ ('
  • ') .append ($ ('') .attr (' href ':' # ', ' aria-label ':' Next ') .append ($ ('') .attr (' aria-hidden ',' true '). html (' '' ')))); $ ('. pagination'). append (nextLink);
  • Enregistrez les modifications et redémarrez le serveur. Connectez-vous en utilisant une adresse email et un mot de passe valides. Une fois sur la page d'accueil de l'utilisateur, vous devriez pouvoir voir la pagination..

    Association d'un événement de clic à un numéro de page

    Vient maintenant la logique principale qui rendra notre pagination fonctionnelle. Nous allons attacher un appel d’événement click sur chaque index de page pour appeler le GetWishes Fonction JavaScript. Commençons par associer un événement click à l'élément d'ancrage affichant le numéro de page..

    pour (var i = 0; i < pageCount; i++)  var aPage = $('') .attr (' href ',' # '). text (i + 1); $ (aPage) .click (function () ); var page = $ ('
  • ') .append (aPage); $ ('. pagination'). append (page);
  • Nous avons donc simplement attaché un événement onclick à l'ancre de la page. A chaque clic, nous appellerons le GetWishes fonction et passe le décalage. Alors déclarez le décalage en dehors de la boucle.

    var offset = 0;

    Appeler le GetWishes fonction dans l'appel d'événement click.

    GetWishes (offset);

    Également augmenter le décalage basé sur le nombre d'enregistrements affichés.

    offset = offset + 2;

    Mais à chaque fois le GetWishes fonction est appelée, la valeur de décalage sera toujours le dernier ensemble. Nous allons donc utiliser JavaScript Closures pour transmettre le décalage correct à la GetWishes une fonction.

    var offset = 0; pour (var i = 0; i < pageCount; i++)  var aPage = $('') .attr (' href ',' # '). text (i + 1); $ (aPage) .click (fonction (offset) retour function () GetWishes (offset); (offset)); var page = $ ('
  • ') .append (aPage); $ ('. pagination'). append (page); offset = offset + itemsPerPage;
  • Enregistrez toutes les modifications ci-dessus et redémarrez le serveur. Connectez-vous avec des identifiants valides et une fois sur la page d'accueil de l'utilisateur, essayez de cliquer sur les pages dans la pagination UL.. 

    Ensuite, nous allons implémenter les liens de page précédents et suivants. Cela peut sembler un peu compliqué, alors laissez-moi vous expliquer un peu avant de commencer avec la mise en œuvre. 

    Nous afficherons cinq pages à la fois. En utilisant les liens suivant et précédent, l’utilisateur peut accéder aux cinq et cinq pages précédentes. Nous allons stocker les valeurs de la page de démarrage et de la page de fin et continuer à mettre à jour le clic sur le bouton précédent et suivant. Commençons donc par ajouter deux champs cachés à la userHome.html page.

     

    dans le GetWishes rappel de succès, après avoir vidé le .pagination UL, ajoutez la ligne de code suivante pour obtenir la dernière page de démarrage et la dernière page.

    $ ('. pagination'). empty (); var pageStart = $ ('# hdnStart'). val (); var pageEnd = $ ('# hdnEnd'). val ();

    Aucun lien de bouton précédent ne sera affiché lors de l'affichage des pages 1 à 5. Si le nombre de pages affichées est supérieur à 5, nous afficherons le lien de bouton précédent..

    if (pageStart> 5) var aPrev = $ ('') .attr (' href ':' # ', ' aria-label ':' Previous ') .append ($ ('') .attr (' aria-hidden ',' true '). html (' '' ')); $ (aPrev) .click (function () // Logique du bouton précédent); var prevLink = $ ('
  • ') .append (aPrev); $ ('. pagination'). append (prevLink);
  • Lorsque l'utilisateur clique sur le bouton précédent, nous réinitialisons le hdnStart et hdnEnd valeurs et appelez le GetWishes Fonction JavaScript. 

    $ (aPrev) .click (function () $ ('# hdnStart'). val (Number (pageStart) - 5); $ ('# hdnEnd'). val (Number (pageStart) - 5 + 4); GetWishes (Numéro (pageStart) - 5););

    Ensuite, en fonction de la page de démarrage et de la page de fin, nous allons boucler et créer les liens de page, puis ajouter le .pagination UL.

    pour (var i = Number (pageStart); i <= Number(pageEnd); i++)  if (i > pageCount) break;  var aPage = $ ('') .attr (' href ',' # '). text (i); // Attache l'événement de clic de page $ (aPage) .click (function (i) return function () GetWishes (i); (i)); var page = $ ('
  • ') .append (aPage); // attache la classe de page active if ((_page) == i) $ (page) .attr ('classe', 'active'); $ ('. pagination'). append (page);
  • En comparant le nombre total de pages et la valeur de début de page, nous déciderons de l’affichage du lien du bouton suivant..

    if ((Number (pageStart) + 5)) <= pageCount)  var nextLink = $('
  • ') .append ($ ('') .attr (' href ':' # ', ' aria-label ':' Next ') .append ($ ('') .attr (' aria-hidden ',' true '). html (' »'). click (function () $ (' # hdnStart '). val (Number (pageStart) + 5); $ (' #hdnEnd '). val (Number (pageStart) + 5 + 4); GetWishes (Number (pageStart) + 5);))); $ ('. pagination'). append (nextLink);
  • Comme indiqué dans le code ci-dessus, lors du clic suivant, nous réinitialisons le hdnStart et hdnEnd bouton valeurs et appelant le GetWishes Fonction JavaScript.

    Alors voici la finale GetWishes Fonction JavaScript. 

    fonction GetWishes (_page) var _offset = (_page - 1) * 2; $ .ajax (url: '/ getWish', type: 'POST', données: offset: _offset, succès: fonction (res) var itemsPerPage = 2; var wishObj = JSON.parse (res); $ ( '#ulist'). empty (); $ ('# listTemplate'). tmpl (wishObj [0]). appendTo ('# ulist'); var total = wishObj [1] ['total']; var pageCount = total / itemsPerPage; var pageRem = total% itemsPerPage; if (pageRem! = 0) pageCount = Math.floor (pageCount) + 1; $ ('. pagination'). empty (); var pageStart = $ ('# hdnStart '). val (); var pageEnd = $ (' # hdnEnd '). val (); if (pageStart> 5) var aPrev = $ ('') .attr (' href ':' # ', ' aria-label ':' Previous ') .append ($ ('') .attr (' aria-hidden ',' true '). html (' '' ')); $ (aPrev) .click (function () $ ('# hdnStart'). val (Number (pageStart) - 5); $ ('# hdnEnd'). val (Number (pageStart) - 5 + 4); GetWishes (Numéro (pageStart) - 5);); var prevLink = $ ('
  • ') .append (aPrev); $ ('. pagination'). append (prevLink); pour (var i = Number (pageStart); i <= Number(pageEnd); i++) if (i > pageCount) break; var aPage = $ ('') .attr (' href ',' # '). text (i); $ (aPage) .click (fonction (i) return fonction () GetWishes (i); (i)); var page = $ ('
  • ') .append (aPage); if ((_page) == i) $ (page) .attr ('classe', 'actif'); $ ('. pagination'). append (page); if ((Number (pageStart) + 5) <= pageCount) var nextLink = $('
  • ') .append ($ ('') .attr (' href ':' # ', ' aria-label ':' Next ') .append ($ ('') .attr (' aria-hidden ',' true '). html (' »'). click (function () $ (' # hdnStart '). val (Number (pageStart) + 5); $ (' #hdnEnd '). val (Number (pageStart) + 5 + 4); GetWishes (Number (pageStart) + 5);))); $ ('. pagination'). append (nextLink); , erreur: fonction (erreur) console.log (erreur); );
  • Enregistrez toutes les modifications ci-dessus et redémarrez le serveur. Connectez-vous en utilisant une adresse email et un mot de passe valides. Vous devriez pouvoir voir la pagination entièrement fonctionnelle pour la liste de souhaits des utilisateurs..

    Conclusion

    Dans cette partie de la série, nous avons implémenté la fonctionnalité de pagination pour la liste de souhaits sur la page d'accueil de l'utilisateur. Nous avons vu comment récupérer des données en utilisant une procédure stockée MySQL et créer une pagination en utilisant ces données, jQuery et Bootstrap.

    Dans la suite de cette série de didacticiels, nous allons implémenter la fonctionnalité de téléchargement de fichier dans notre application..

    Le code source de ce tutoriel est disponible sur GitHub.

    Faites-nous savoir vos pensées dans les commentaires ci-dessous!