Een webapp maken van krassen met Python Flask en MySQL deel 5

In het vorige deel van deze serie hebben we gezien hoe het Bewerk en Verwijder wens-functionaliteit voor onze Bucket List-toepassing. In dit deel zullen we de semafunctionaliteit voor onze gebruikershomepage implementeren.

Ermee beginnen

Laten we beginnen met het klonen van het vorige deel van de tutorial vanuit GitHub.

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

Nadat de broncode is gekloond, navigeert u naar de projectdirectory en start u de webserver. 

cd PythonFlaskMySQLApp_Part4 python app.py

Richt uw browser op http: // localhost: 5002 / en u zou de applicatie moeten laten draaien.

Paginering implementeren

Naarmate de lijst met wensen op de startpagina van de gebruiker toeneemt, wordt deze op de pagina gescrolld. Het is dus belangrijk om paginering te implementeren. We beperken het aantal items dat op een pagina wordt getoond tot een bepaald aantal. 

Wijzig de Get Wish-procedure

We beginnen met het aanpassen van de sp_GetWishByUser procedure om resultaten te retourneren op basis van een begrenzing en compenseren waarde. Deze keer zullen we onze opgeslagen procedureverklaring dynamisch maken om de resultatenset te retourneren op basis van de limiet- en offsetwaarde. Dit is het aangepaste sp_GetWishByUser MySQL stored procedure.

GEBRUIK 'BucketList'; DROP-procedure IF EXISTS 'sp_GetWishByUser'; DELIMITER $$ GEBRUIK '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_user_id = ', p_user_id,' volgorde op wish_date desc limit ', p_limit,' offset ', p_offset); BEREKEN STmT VAN @ t1; UITVOEREN stmt; DEALLOCATE PREPARE stmt1; END $$ DELIMITER; 

Zoals te zien in de bovenstaande opgeslagen procedure, hebben we onze dynamische SQL-query gemaakt en uitgevoerd om de verlanglijst op basis van de compenseren en begrenzing parameters.

Paginering aan de gebruikersinterface toevoegen

Laten we eerst een paar standaardinstellingen definiëren. In app.py voeg een variabele toe voor de paginalimiet.

# Standaardinstelling pageLimit = 2 

Maak de getWish Python-methode accepteert POST-aanvragen.

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

Lees de compenseren en begrenzing binnen in de getWish methode en geef deze door terwijl u de opgeslagen MySQL-procedure aanroept sp_GetWishByUser

 _limit = pageLimit _offset = request.form ['offset'] con = mysql.connect () cursor = con.cursor () cursor.callproc ('sp_GetWishByUser', (_ user, _limit, _offset)) wishes = cursor.fetchall () 

Wijzig de GetWishes JavaScript-functie in userHome.html om er een POST-aanvraag van te maken en de compenseren waarde.

functie GetWishes () $ .ajax (url: '/ getWish', type: 'POST', data: offset: 0, succes: functie (res) var wishObj = JSON.parse (res); $ ( '#ulist'). empty (); $ ('# listTemplate'). tmpl (wishObj) .appendTo ('# ulist');, error: function (error) console.log (error);) ; 

Sla alle wijzigingen op en start de server opnieuw op. Meld u aan met een geldig e-mailadres en wachtwoord en er mogen slechts twee records op het scherm worden weergegeven.

Dus het database gedeelte werkt goed. Vervolgens moeten we de gebruikersinterface voor paginering toevoegen aan de startpagina van de gebruiker, waarmee de gebruiker door de gegevens kan navigeren.

We gebruiken de component Bootstrap-paginering. Doe open userHome.html en voeg de volgende HTML-code toe na de #ulist UL. 

Sla de wijzigingen op en start de server opnieuw op. Na het succesvol aanmelden, zou u de paginering onder het verlanglijstje moeten kunnen zien.

Paginering dynamisch maken

De bovenstaande paginering is hoe onze paginering eruit zal zien. Maar om het functioneel te maken, moeten we onze paginering dynamisch maken op basis van het aantal records in de database.

Voor het maken van onze paginering hebben we het totale aantal records nodig dat beschikbaar is in de database. Dus laten we de opgeslagen MySQL-procedure aanpassen sp_GetWishByUser om het totale aantal beschikbare records als een uit-parameter te retourneren.

GEBRUIK 'BucketList'; DROP-procedure IF EXISTS 'sp_GetWishByUser'; DELIMITER $$ GEBRUIK '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 selecteer count (*) in p_total from tbl_wish waar wish_user_id = p_user_id; SET @ t1 = CONCAT ('select * from tbl_wish where wish_user_id =', p_user_id, 'order by wish_date desc limit', p_limit, 'offset', p_offset); BEREKEN STmT VAN @ t1; UITVOEREN stmt; DEALLOCATE PREPARE stmt; END $$ DELIMITER;

Zoals te zien in de bovenstaande gewijzigde opgeslagen procedure hebben we een nieuwe uitvoerparameter toegevoegd genaamd p_total en selecteerde het totale aantal wensen op basis van het gebruikers-ID. 

Wijzig ook de getWish python-methode om een ​​uitvoerparameter door te geven.

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

Zoals je in de bovenstaande code kunt zien, sluiten we de cursor zodra we de opgeslagen procedure hebben gebeld en openen we een nieuwe cursor om de teruggestuurde parameter te selecteren.

Eerder gaven we een lijst met wensen terug van de Python-methode. Nu moeten we ook het totale aantal records opnemen in de geretourneerde JSON. Dus we zullen het verlanglijstje in een andere lijst plaatsen en vervolgens de verlanglijst toevoegen en de telling opnemen in de hoofdlijst. Hier is de aangepaste code van de getWish python-methode.

response = [] wishes_dict = [] voor wensen in wensen: wish_dict = 'Id': wish [0], 'Title': wish [1], 'Description': wish [2], 'Date': wish [4 ] wishes_dict.append (wish_dict) response.append (wishes_dict) response.append ('total': outParam [0] [0]) return json.dumps (reactie) 

In de GetWishes JavaScript-functie, voeg in de succes-callback een consolelog toe.

console.log (RES);

Sla alle bovenstaande wijzigingen op en start de server opnieuw op. Log in met een geldig e-mailadres en wachtwoord en kijk op de startpagina van de gebruiker naar de browserconsole. U zou een reactie kunnen zien die lijkt op de reactie hieronder:

[["Datum": "zo, 15 februari 2015 15:10:45 GMT", "Description": "wwe", "Id": 5, "Title": "wwe", "Datum": " Zat, 24 januari 2015 00:13:50 GMT "," Beschrijving ":" Reis naar Spanje "," Id ": 4," Titel ":" Spanje "], " totaal ": 5]

Met behulp van de totale telling ontvangen van het antwoord, kunnen we het totale aantal pagina's krijgen. 

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

Verdelen van de totale items tellen van Artikelen per pagina count geeft ons het aantal benodigde pagina's. Maar dit geldt alleen als het totaal een veelvoud is van Artikelen per pagina. Als dat niet het geval is, moeten we dat controleren en het aantal pagina's dienovereenkomstig afhandelen.

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

Dus dat geeft ons het juiste aantal pagina's.

Omdat we nu het totale aantal pagina's hebben, maken we de paginerings-HTML dynamisch. Verwijder de LI element uit de paginering HTML die we eerder hebben toegevoegd.

In de GetWishes succes callback, laten we de vorige link dynamisch maken met behulp van jQuery.

var prevLink = $ ('
  • ') .Append ($ ('') .attr (' href ':' # ', ' aria-label ':' Previous ') .append ($ ('') .attr (' aria-hidden ',' true '). html (' «'))); $ ( 'Paginering') append (prevLink).;
  • In de bovenstaande code hebben we zojuist de link met de vorige knop gemaakt en toegevoegd aan de paginering UL.

    Sla de bovenstaande wijzigingen op en start de server opnieuw. Na succesvolle aanmelding moet u de vorige link onder de lijst kunnen zien.

    Evenzo, laten we de pagina's in de paginering toevoegen op basis van het aantal pagina's.

    for (var i = 0; i < pageCount; i++)  var page = $('
  • ') .Append ($ ('') .attr (' href ',' # '). tekst (i + 1)); $ ( 'Paginering') toevoegen (blz.);
  • Laten we ook de volgende link toevoegen nadat de paginalink is toegevoegd.

    var nextLink = $ ('
  • ') .Append ($ ('') .attr (' href ':' # ', ' aria-label ':' Next ') .append ($ ('') .attr (' aria-hidden ',' true '). html (' »'))); $ ( 'Paginering') append (Nextlink).;
  • Sla de wijzigingen op en start de server opnieuw op. Meld u aan met een geldig e-mailadres en wachtwoord en eenmaal op de startpagina van de gebruiker moet u de paginering kunnen zien.

    Een klikgebeurtenis aan een paginanummer koppelen

    Nu komt de hoofdlogica die onze paginering functioneel zal maken. Wat we gaan doen is een klikgebeurtenis aan elke pagina-index toevoegen om de GetWishes JavaScript-functie. Laten we eerst een klikgebeurtenis koppelen aan het ankerelement dat het paginanummer weergeeft.

    for (var i = 0; i < pageCount; i++)  var aPage = $('') .attr (' href ',' # '). tekst (i + 1); $ (aPage) .klik (functie () ); var page = $ ('
  • ) .Append (a Blz); $ ( 'Paginering') toevoegen (blz.);
  • Dus hebben we zojuist een onclick-gebeurtenis aan het pagina-anker gekoppeld. Bij elke klik bellen we de GetWishes functie en geef de compenseren. Dus verklaar de compenseren buiten de for-lus.

    var offset = 0;

    Bel de GetWishes functie binnen de klikgebeurtenis.

    GetWishes (offset);

    Verhoog ook de compenseren op basis van het aantal getoonde records.

    offset = offset + 2;

    Maar elke keer de GetWishes functie wordt aangeroepen, de waarde van compenseren zal altijd de laatste set zijn. Dus maken we gebruik van JavaScript-sluitingen om de juiste offset door te geven aan de GetWishes functie.

    var offset = 0; for (var i = 0; i < pageCount; i++)  var aPage = $('') .attr (' href ',' # '). tekst (i + 1); $ (aPage) .klik (functie (offset) return function () GetWishes (offset); (offset)); var page = $ ('
  • ) .Append (a Blz); $ ( 'Paginering') toevoegen (blz.); offset = offset + itemsPerPage;
  • Sla alle bovenstaande wijzigingen op en start de server opnieuw op. Log in met geldige referenties en klik eenmaal op de startpagina van de gebruiker op de pagina's in de paginering UL. 

    Vervolgens implementeren we de koppelingen van de vorige en volgende pagina. Het lijkt misschien een beetje ingewikkeld, dus ik zal het een beetje uitleggen voordat we met de implementatie beginnen. 

    We geven vijf pagina's tegelijk weer. Met behulp van de volgende en vorige koppeling kan de gebruiker naar respectievelijk de volgende vijf en de vorige vijf pagina's navigeren. We slaan de waarden van de startpagina en de eindpagina op en blijven zowel bij de volgende als bij de vorige klik klikken. Laten we beginnen met het toevoegen van twee verborgen velden aan de userHome.html pagina.

     

    In de GetWishes succes callback, nadat we de .paginering UL, voeg de volgende regel code toe om de laatste begin- en eindpagina te krijgen.

    $ ( 'Paginering') leeg (.); var pageStart = $ ('# hdnStart'). val (); var pageEnd = $ ('# hdnEnd'). val ();

    Er wordt geen link naar een vorige knop weergegeven bij het weergeven van pagina's 1 tot 5. Als de weergegeven pagina's groter zijn dan 5, geven we de link met de vorige knop weer.

    if (pageStart> 5) var aPrev = $ ('') .attr (' href ':' # ', ' aria-label ':' Previous ') .append ($ ('') .attr (' aria-hidden ',' true '). html (' «')); $ (aVorige) .klik (functie () // Knoplogica vorige); var prevLink = $ ('
  • ) .Append (aPrev); $ ( 'Paginering') append (prevLink).;
  • Wanneer de gebruiker op de vorige knop klikt, stellen we de hdnStart en hdnEnd waarden en bel de GetWishes JavaScript-functie. 

    $ (aVorige) .klik (functie () $ ('# hdnStart'). val (Number (pageStart) - 5); $ ('# hdnEnd'). val (Number (pageStart) - 5 + 4); GetWishes (Number (pageStart) - 5););

    Vervolgens, gebaseerd op de startpagina en de eindpagina, lus en maken we de paginalinks en voegen we de .paginering UL.

    for (var i = Number (pageStart); i <= Number(pageEnd); i++)  if (i > pageCount) break;  var aPage = $ ('') .attr (' href ',' # '). tekst (i); // Voeg de pagina klik gebeurtenis $ (aPage) toe. Klik (functie (i) return function () GetWishes (i); (i)); var page = $ ('
  • ) .Append (a Blz); // Voeg de actieve paginaklasse toe als ((_page) == i) $ (pagina) .attr ('class', 'active'); $ ('. pagination'). toevoegen (pagina);
  • Door het totale aantal pagina's en de startwaarde van de pagina te vergelijken, bepalen we de weergave van de volgende knopkoppeling.

    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);))); $ ( 'Paginering') append (Nextlink).;
  • Zoals te zien is in de bovenstaande code, worden bij de volgende klik op de knop de hdnStart en hdnEnd knopwaarden en de GetWishes JavaScript-functie.

    Dus hier is de finale GetWishes JavaScript-functie. 

    functie GetWishes (_page) var _offset = (_page - 1) * 2; $ .ajax (url: '/ getWish', type: 'POST', data: offset: _offset, success: function (res) var itemsPerPage = 2; var wishObj = JSON.parse (res); $ ( '#ulist'). empty (); $ ('# listTemplate'). tmpl (wishObj [0]). appendTo ('# ulist'); var total = wishObj [1] ['total']; var pageCount = totaal / itemsPerPage; var pageRem = totaal% 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 (' «')); $ (aVorige) .klik (functie () $ ('# hdnStart'). val (Number (pageStart) - 5); $ ('# hdnEnd'). val (Number (pageStart) - 5 + 4); GetWishes (Number (pageStart) - 5);); var prevLink = $ ('
  • ) .Append (aPrev); $ ( 'Paginering') append (prevLink).; for (var i = Number (pageStart); i <= Number(pageEnd); i++) if (i > pageCount) break; var aPage = $ ('') .attr (' href ',' # '). tekst (i); $ (aPage) .klik (functie (i) return function () GetWishes (i); (i)); var page = $ ('
  • ) .Append (a Blz); if ((_page) == i) $ (pagina) .attr ('class', 'active'); $ ('. pagination'). toevoegen (pagina); if ((Nummer (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);))); $ ( 'Paginering') append (Nextlink).; , fout: functie (fout) console.log (fout); );
  • Sla alle bovenstaande wijzigingen op en start de server opnieuw op. Log in met een geldig e-mailadres en wachtwoord. U zou de volledig functionele paginering voor de gebruikerswensenlijst moeten kunnen zien.

    Conclusie

    In dit deel van de reeks hebben we de pagineringfunctionaliteit geïmplementeerd voor de verlanglijst op de startpagina van de gebruiker. We zagen hoe we gegevens kunnen ophalen met behulp van een opgeslagen MySQL-procedure en paginering maken met die gegevens, jQuery en Bootstrap.

    In het volgende deel van deze tutorialserie zullen we de functie voor het uploaden van bestanden implementeren in onze applicatie.

    Broncode van deze tutorial is beschikbaar op GitHub.

    Laat het ons weten in de reacties hieronder!