Crearea unei aplicații Web de la zero utilizând Python Flack și MySQL Partea 5

În partea anterioară a acestei serii, am văzut cum să implementăm Editați | × și Șterge dorim funcționalitate pentru aplicația noastră pentru cupă. În această parte vom implementa funcționalitatea de paginare pentru lista noastră de utilizatori.

Noțiuni de bază

Să începem prin clonarea părții anterioare a tutorialului de la GitHub.

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

Odată ce codul sursă a fost clonat, navigați la directorul de proiect și porniți serverul web. 

cd PythonFlaskMySQLApp_Part4 Python app.py

Punctați browser-ul dvs. la http: // localhost: 5002 / și ar trebui să aveți aplicația să ruleze.

Implementarea paginării

Pe măsură ce lista dorințelor de pe pagina de pornire a utilizatorului crește, devine derulată în jos. Deci, este important să implementați paginarea. Vom limita numărul de elemente afișate pe o pagină la un anumit număr. 

Modificați procedura de obținere a dorințelor

Vom începe prin modificarea sp_GetWishByUser procedura pentru a returna rezultatele bazate pe limită și ofset valoare. De data aceasta vom crea dinamic declarația procedurii stocate pentru a returna setul de rezultate pe baza limitei și a valorii offset. Aici este modificat sp_GetWishByUser MySQL procedură stocată.

USE 'BucketList'; Procedura DROP DACĂ EXISTĂ "sp_GetWishByUser"; DELIMITER $$ UTILIZARE 'BucketList' $$ CREATE DEFINER = "root" @ 'localhost' PROCEDURA 'sp_GetWishByUser' (IN p_user_id bigint, IN p_limit int, IN p_offset int) BEGIN SET @ t1 = CONCAT = ', p_user_id,' order by request_date desc limită ', p_limit,' offset ', p_offset); PREPAREA stmt FROM @ t1; EXECUTE stmt; DEALLOCATE PREPARE stmt1; END $$ DELIMITER; 

Așa cum am văzut în procedura stocată mai sus, am creat interogarea SQL dinamică și l-am executat pentru a obține lista de dorințe bazată pe ofset și limită parametrii.

Adăugarea paginii la interfața utilizator

Mai întâi, să definim câteva setări implicite. În app.py adăugați o variabilă pentru limita paginii.

# Setare implicită pageLimit = 2 

getWish metoda python acceptă solicitările POST.

@ App.route ( '/ getWish', metode = [ 'POST']) 

Citeste ofset și limită în interiorul getWish și îl transmiteți în timp ce apelați procedura stocată MySQL sp_GetWishByUser

 _limit = pageLimit _offset = request.form ['offset'] con = mysql.connect () cursor = con.cursor () cursor.callproc (' 

Modificați GetWishes Funcția JavaScript în userHome.html pentru a face o cerere POST și a trece ofset valoare.

funcția (res) var wishObj = JSON.parse (res); $ ((res. "error": funcția (eroare) console.log (eroare);) ("#" ; 

Salvați toate modificările și reporniți serverul. Conectați-vă utilizând o adresă de e-mail și o parolă valabilă și ar trebui să aveți doar două înregistrări afișate pe ecran.

Deci, porțiunea bazei de date funcționează bine. Apoi, trebuie să adăugăm interfața de paginare la pagina de pornire a utilizatorului, care va permite utilizatorului să navigheze prin intermediul datelor.

Vom folosi componenta de paginare Bootstrap. Deschide userHome.html și adăugați următorul cod HTML după #ulist UL. 

Salvați modificările și reporniți serverul. După ce vă conectați cu succes, ar trebui să puteți vedea paginarea în lista de dorințe.

Efectuarea paginării dinamice

Pagingul de mai sus este modul în care va arăta paginarea noastră. Dar, pentru ao face funcțională, trebuie să creăm dinamic paginarea în funcție de numărul de înregistrări din baza de date.

Pentru a crea paginarea noastră, vom avea nevoie de numărul total de înregistrări disponibile în baza de date. Deci, haideți să modificăm procedura stocată MySQL sp_GetWishByUser pentru a returna numărul total de înregistrări disponibile ca parametru de ieșire.

USE 'BucketList'; Procedura DROP DACĂ EXISTĂ "sp_GetWishByUser"; DELIMITER $$ UTILIZARE 'BucketList' $$ CREATE DEFINER = "root" @ 'localhost' PROCEDURA 'sp_GetWishByUser' (IN p_user_id bigint, IN p_limit int, IN p_offset int, out p_total bigint) BEGIN select count (*) in p_total din tbl_wish unde wish_user_id = p_user_id; SET @ t1 = CONCAT ('selectați * din tbl_wish unde wish_user_id =', p_user_id, 'order by request_date desc limită', p_limit, 'offset', p_offset); PREPAREA stmt FROM @ t1; EXECUTE stmt; DEALLOCATE PREPARE stmt; END $$ DELIMITER;

Așa cum am văzut în procedura stocată modificată mai sus, am adăugat un nou parametru de ieșire numit p_total și a selectat numărul total de dorințe pe baza id-ului de utilizator. 

Modificați și getWish metoda python pentru a trece un parametru de ieșire.

 _limit = pageLimit _offset = request.form ['offset'] _total_records = 0 con_ mysql.connect () cursor = con.cursor () cursor.callproc (' cursor.fetchall () cursor.close () cursor = con.cursor () cursor.execute ('SELECT @ _sp_GetWishByUser_3'); outParam = cursor.fetchall () 

După cum puteți vedea în codul de mai sus, odată ce am sunat procedura stocată, închidem cursorul și deschidem un nou cursor pentru a selecta parametrul returnat.

Anterior, revenim o listă de dorințe din metoda Python. Acum, trebuie să includem și numărul total de înregistrări în JSON-ul returnat. Deci vom face dicționarul listei de dorințe într-o altă listă și apoi vom adăuga lista de dorințe și numărul de înregistrări în lista principală. Aici este codul modificat al getWish metoda python.

răspunsul = [] wishes_dict = [] pentru dorință în dorințe: wish_dict = 'Id': wish [0], 'Title': wish [1], 'Description': wish [2] ] wishes_dict.append (request_dict) răspuns.append (wishes_dict) răspuns.append ('total': outParam [0] [0]) return json.dumps 

În GetWishes Funcția JavaScript, în cadrul callback-ului de succes adăugați un jurnal de console.

console.log (res);

Salvați toate modificările de mai sus și reporniți serverul. Conectați-vă utilizând o adresă de e-mail și o parolă validă, iar în pagina de pornire a utilizatorului, verificați consola browserului. Ar trebui să puteți vedea un răspuns similar celui prezentat mai jos:

["Date": "Sună, 15 Feb 2015 15:10:45 GMT", "Descriere": "wwe", "Id": 5, Sat, 24 Jan 2015 00:13:50 GMT "," Descriere ":" Călătorie în Spania "," Id ": 4," Titlu ":" Spania "], " total ": 5]

Folosind numărul total primit de răspuns, putem obține numărul total de pagini. 

var total = dorințăObj [1] ['total']; var pageCount = total / itemsPerPage;

Împărțirea numărului total de elemente de la articole pe pagină numără numărul de pagini solicitate. Dar acest lucru este valabil numai atunci când totalul este un multiplu de articole pe pagină. Dacă nu este cazul, va trebui să verificăm acest lucru și să rezolvăm numărul paginilor în consecință.

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

Deci, asta ne va da numărul corect de pagini.

Acum, deoarece avem numărul total de pagini, vom crea dinamic paginarea HTML. Scoateți LI element din HTML-ul de paginare pe care l-am adăugat mai devreme.

În GetWishes reușită, să creați dinamic linkul anterior utilizând jQuery.

var prevLink = $ ('
  • ') .Append ($ ('') .attr (' href ':' # ', ' aria-label ':'') .attr (' aria-ascuns ',' adevărat '). html (' «'))); $ ( 'Paginare') append (prevLink).;
  • În codul de mai sus, am creat doar legătura butonului anterior și l-am adăugat la paginile UL.

    Salvați modificările de mai sus și reporniți serverul. La conectarea cu succes, ar trebui să puteți vedea linkul anterior din listă.

    În mod similar, să adăugăm paginile în paginare pe baza numărului de pagini.

    pentru (var i = 0; i < pageCount; i++)  var page = $('
  • ') .Append ($ ('') .attr (' href ',' # '). text (i + 1)); $ ( 'Paginare') append (pag.);
  • Să adăugăm, de asemenea, linkul Următorul după adăugarea link-ului paginilor.

    var nextLink = $ ('
  • ') .Append ($ ('') .attr (' href ':' # ', ' aria-label ':'') .attr (' aria-ascuns ',' adevărat '). html (' »'))); $ ( 'Paginare') append (nextLink).;
  • Salvați modificările și reporniți serverul. Conectați-vă utilizând o adresă de e-mail și o parolă validă și, o dată pe pagina de pornire a utilizatorului, ar trebui să vedeți paginarea.

    Atașarea unui eveniment clic la un număr de pagină

    Acum vine principala logică care va face paginarea noastră funcțională. Ceea ce vom face este să atașați un apel de eveniment clic pe fiecare index al paginii pentru a apela GetWishes Funcția JavaScript. Să atașăm mai întâi un eveniment clic pe elementul de ancorare care afișează numărul paginii.

    pentru (var i = 0; i < pageCount; i++)  var aPage = $('') .attr (' href ',' # '). text (i + 1); $ (aPage) .click (funcția () ); var pagina = $ ('
  • „) .Append (aPage); $ ( 'Paginare') append (pag.);
  • Așa că am atașat un eveniment onclick la ancora de pagină. La fiecare clic se va apela GetWishes funcționează și trece ofset. Deci, declarați ofset în afara bucla pentru.

    var offset = 0;

    Suna GetWishes funcția în interiorul apelului evenimentului clic.

    GetWishes (offset);

    De asemenea, creșteți valoarea ofset pe baza numărului de înregistrări afișate.

    offset = offset + 2;

    Dar de fiecare dată GetWishes se numește funcția, valoarea lui ofset va fi întotdeauna ultima setată. Deci, vom folosi JavaScript Closures pentru a trece offsetul corect la GetWishes funcţie.

    var offset = 0; pentru (var i = 0; i < pageCount; i++)  var aPage = $('') .attr (' href ',' # '). text (i + 1); $ (aPage) .click (functie (offset) functie return () GetWishes (offset); (offset)); var pagina = $ ('
  • „) .Append (aPage); $ ( 'Paginare') append (pag.); offset = offset + itemsPerPage;
  • Salvați toate modificările de mai sus și reporniți serverul. Conectați-vă utilizând acreditările valide și o dată pe pagina de pornire a utilizatorului, încercați să faceți clic pe paginile din UL de paginare. 

    Apoi vom implementa legăturile anterioare și următoare. Poate părea un pic complicat, așa că permiteți-mi să-i explic puțin înainte de a începe implementarea. 

    Vom afișa câte cinci pagini în același timp. Folosind linkul următor și anterior, utilizatorul poate naviga la următoarele cinci și, respectiv, cinci pagini anterioare. Vom stoca valorile paginii de start și a paginii de final și vom continua să actualizăm atât la clicul butonului următor, cât și la cel anterior. Deci, haideți să începem prin adăugarea a două câmpuri ascunse la userHome.html pagină.

     

    În GetWishes reușită, după ce am golit .paginare UL, adăugați următoarea linie de cod pentru a obține cea mai recentă pagină de start și pagina finală.

    $ ( 'Paginare') gol ().; var paginaStart = $ ('# hdnStart') val (); var paginaEnd = $ ('# hdnEnd') val ();

    Nu se afișează nicio legătură cu butoanele anterioare când se afișează paginile de la 1 la 5. Dacă paginile afișate sunt mai mari de 5, atunci vom afișa legătura cu butoanele anterioare.

    dacă (paginaStart> 5) var aPrev = $ ('') .attr (' href ':' # ', ' aria-label ':'') .attr (' aria-ascuns ',' adevărat '). html (' '')); $ (aPrev). clic (funcția () // logica precedentă a butonului)); var prevLink = $ ('
  • „) .Append (aPrev); $ ( 'Paginare') append (prevLink).;
  • Când utilizatorul face clic pe butonul anterior, vom reinițializa hdnStart și hdnEnd și apelați GetWishes Funcția JavaScript. 

    $ ('# hdnEnd') val (Numar (paginaStart) - 5 + 4); GetWishes (Număr (paginaStart) - 5););

    Apoi, bazându-ne pe pagina de start și pe pagina finală, vom face buclă și vom crea link-urile paginii și vom adăuga .paginare UL.

    pentru (var i = Număr (paginaStart); i <= Number(pageEnd); i++)  if (i > pagecount) break;  var aPage = $ ('') .attr (' href ',' # '). text (i); // atașați evenimentul de clic pagină $ (aPage) .click (funcția (i) return function () GetWishes (i); (i)); var pagina = $ ('
  • „) .Append (aPage); // Atașați clasa activă a paginii dacă ((_page) == i) $ (page) .attr ('class', 'active'); $ ('paginare').
  • Prin compararea numărului total de pagini și a valorii de pornire a paginii, vom decide afișarea următorului link de buton.

    dacă ((Număr (paginaStart) + 5) <= pageCount)  var nextLink = $('
  • ') .Append ($ ('') .attr (' href ':' # ', ' aria-label ':'') .attr (' aria-ascuns ',' adevărat '). html (' #hdnEnd ') val (număr (pagină de start) + 5 + 4); GetWishes (număr (paginăStart) + 5);))); $ ( 'Paginare') append (nextLink).;
  • Așa cum se vede în codul de mai sus, pe următorul buton de clic, suntem resetați hdnStart și hdnEnd butoanele și apelarea GetWishes Funcția JavaScript.

    Deci aici este finalul GetWishes Funcția JavaScript. 

    funcția GetWishes (_page) var _offset = (_page - 1) * 2; $ .ajax (url: '/ getWish', tip: 'POST', date: offset: _offset, succes: function (res) var itemsPerPage = 'var'); $ ('# listTemplate'); tmpl (requestObj [0]) .appendTo ('# ulist' (paginaRem! = 0) pageCount = Math.floor (pageCount) + 1; $ ('paginare') empty pageStart = $ (' hdnStart ') val (); var paginaEnd = $ (' # hdnEnd ') val (); if (paginaStart> 5) var aPrev = $ ('') .attr (' href ':' # ', ' aria-label ':'') .attr (' aria-ascuns ',' adevărat '). html (' '')); $ ('# hdnEnd') val (Numar (paginaStart) - 5 + 4); GetWishes (Număr (paginaStart) - 5);); var prevLink = $ ('
  • „) .Append (aPrev); $ ( 'Paginare') append (prevLink).; pentru (var i = Număr (paginaStart); i <= Number(pageEnd); i++) if (i > pagecount) break; var aPage = $ ('') .attr (' href ',' # '). text (i); $ (aPage) .click (funcția (i) funcția return () GetWishes (i); (i)); var pagina = $ ('
  • „) .Append (aPage); dacă ((_page) == i) $ (pagina) .attr ("clasă", "activă"); $ ('paginare'). dacă ((Număr (PageStart) + 5) <= pageCount) var nextLink = $('
  • ') .Append ($ ('') .attr (' href ':' # ', ' aria-label ':'') .attr (' aria-ascuns ',' adevărat '). html (' #hdnEnd ') val (număr (pagină de start) + 5 + 4); GetWishes (număr (paginăStart) + 5);))); $ ( 'Paginare') append (nextLink).; , eroare: funcție (eroare) console.log (eroare); );
  • Salvați toate modificările de mai sus și reporniți serverul. Conectați-vă utilizând o adresă de e-mail și o parolă valide. Ar trebui să puteți vedea paginarea pe deplin funcțională pentru lista dorințelor de utilizator.

    Concluzie

    În această parte a seriei am implementat funcția de paginare pentru lista de dorințe pe pagina de pornire a utilizatorului. Am văzut cum să preluăm datele utilizând o procedură stocată în MySQL și să creăm paginarea utilizând datele respective, jQuery și Bootstrap.

    În următoarea parte a acestei serii de tutori, vom implementa funcția de încărcare a fișierelor în aplicația noastră.

    Codul sursă din acest tutorial este disponibil pe GitHub.

    Spuneți-ne gândurile dvs. în comentariile de mai jos!