In het vorige deel van deze serie hebben we paginering geïmplementeerd voor de verlanglijst op de startpagina van de gebruiker. In dit deel van de serie zullen we een optie voor de gebruiker implementeren om een afbeelding te uploaden die een wens vertegenwoordigt, een optie om de wens als voltooid te markeren en een optie om privacy in te stellen.
Laten we beginnen met het klonen van het vorige deel van de tutorial vanuit GitHub.
git clone https://github.com/jay3dec/PythonFlaskMySQLApp_Part5.git
Nadat de broncode is gekloond, navigeert u naar de projectdirectory en start u de webserver.
cd PythonFlaskMySQLApp_Part5 python app.py
Richt uw browser op http: // localhost: 5002 / en u zou de applicatie moeten laten draaien.
Laten we beginnen met het aanpassen van onze "voeg wens toe" -pagina om een optie op te nemen om een afbeelding te uploaden. Navigeren naar templates / addWish.html
. Onze vorm in addWish.html
ziet er vrij klein uit, dus laten we de bootstrap-HTML-code aanpassen om het formulier verticaal te maken.
Ten eerste zullen we de horizontale vorm-
naar een verticale vorm, dus verwijder de klas horizontale vorm-
van het formulier. We voegen ook drie nieuwe besturingselementen toe: een besturingselement voor het uploaden van bestanden om foto's te uploaden, een selectievakje om de wens als privé te markeren en een ander selectievakje om de wens als voltooid te markeren. Dit is het aangepaste addWish.html
.
Python Flask Bucket Lijst App Python Flask-app
Sla de bovenstaande wijziging op en start de server opnieuw op. Nadat u zich hebt aangemeld, klikt u op de Voeg Wish toe link en je zou de gewijzigde pagina voor het toevoegen van de pagina kunnen zien.
We zullen blue-jet jQuery-File-Upload gebruiken om de bestandsuploadfunctionaliteit te implementeren. Download de vereiste bestanden van GitHub. Pak de bron uit en voeg de volgende scriptreferenties toe aan addWish.html
.
Op addWish.html
pagina laden, voeg de plugin-startcode toe aan de bestandsuploadknop klik.
$ (function () $ ('# fileupload'). fileupload (url: 'upload', dataType: 'json', voeg toe: functie (e, data) data.submit ();, succes: functie ( antwoord, status) console.log (response);, error: function (error) console.log (error););)
Zoals te zien in de bovenstaande code, hebben we de plug-in voor het uploaden van bestanden aan de #bestand upload
knop. De plug-in voor het uploaden van bestanden stuurt het bestand naar de /uploaden
aanvraag handler, die we zullen definiëren in onze Python-code. We hebben ook een gedefinieerd toevoegen
functie om de gegevens in te dienen en gedefinieerd succes
en mislukking
callbacks om het uploadsucces en de mislukkingen te behandelen.
Laten we vervolgens de uploaden
Python file upload handler in app.py
. Definieer een route /uploaden
zoals getoond:
@ app.route ('/ upload', methods = ['GET', 'POST']) def upload (): # file upload handler code zal hier zijn
Controleer of het verzoek een is POST
aanvraag, en lees zo het bestand op verzoek.
if request.method == 'POST': file = request.files ['file']
We moeten ook de afbeeldingsbestandsextensie ophalen om het bestand op te slaan. Dus importeer os
en split de extensie naam van de bestandsnaam.
extensie = os.path.splitext (bestands.bestandsnaam) [1]
Zodra we de bestandsextensie hebben, maken we een nieuwe unieke bestandsnaam met uuid
. Importeren uuid
en maak de bestandsnaam aan.
f_name = str (uuid.uuid4 ()) + extensie
Maak een map met de naam upload
in de statische map. Dit is waar we de geüploade afbeeldingen zullen bewaren. Voeg het pad toe aan de Upload-map in de app-configuratie.
app.config ['UPLOAD_FOLDER'] = 'static / Uploads'
Sla nu het geposte bestand op in de UPLOAD_FOLDER
locatie en stuur de bestandsnaam terug als antwoord.
file.save (os.path.join (app.config ['UPLOAD_FOLDER'], f_name)) return json.dumps ('filename': f_name)
Sla de bovenstaande wijzigingen op en start de server opnieuw. Richt uw browser op http: // localhost: 5002 en log in met geldige inloggegevens. Probeer een afbeelding te uploaden met de bladerknop en controleer je browserconsole wanneer je klaar bent. U zou de geretourneerde geüploade bestandsnaam moeten kunnen zien.
Laten we in plaats van het alleen-lezen invoertekstveld een afbeeldingselement toevoegen om de geüploade afbeelding weer te geven. Vervang dus het alleen-lezen invoertekstveld door de volgende HTML-code.
Bij het uploaden van het succes van het bestand, update #imgUpload
's src
naar de geüploade afbeelding.
$ ( '# ImgUpload') attr ( 'src', 'static / uploads /' + response.filename).;
Sla de bovenstaande wijzigingen op en start de server opnieuw. Meld u aan bij de toepassing en probeer een nieuw afbeeldingsbestand te uploaden en u zou de geüploade afbeelding kunnen zien.
We zullen onze moeten aanpassen tbl_wish
tabelstructuur om drie nieuwe velden te bevatten. Verander de tbl_wish
zoals hieronder getoond:
ALTER TABLE 'BucketList'. 'Tbl_wish' VOEG KOLOM TOE 'wish_file_path' VARCHAR (200) NULL NA 'wish_date', VOEG KOLOM TOE 'wish_accomplished' INT NULL DEFAULT 0 NA 'wish_file_path', VOEG KOLOM TOE 'wish_private' INT NULL DEFAULT 0 NA 'wish_accomplished ';
Laten we vervolgens onze opgeslagen procedures aanpassen sp_addWish
en sp_updateWish
om de nieuw toegevoegde velden aan de database toe te voegen.
Wijzig de sp_addWish
opgeslagen procedure om de drie nieuw toegevoegde velden op te nemen.
GEBRUIK 'BucketList'; DROP-procedure IF EXISTS 'sp_addWish'; DELIMITER $$ USE 'BucketList' $$ CREATE DEFINER = "root" @ 'localhost' PROCEDURE 'sp_addWish' (IN p_title varchar (45), IN p_description varchar (1000), IN p_user_id bigint, IN p_file_path varchar (200), IN p_is_private int, IN p_is_done int) BEGIN invoegen in tbl_wish (wish_title, wish_description, wish_user_id, wish_date, wish_file_path, wish_private, wish_accomplished) values (p_title, p_description, p_user_id, NOW (), p_file_path, p_is_private, p_is_done); END $$ DELIMITER;
Pas ook de opgeslagen procedure aan sp_updateWish
om de drie nieuw toegevoegde velden op te nemen.
GEBRUIK 'BucketList'; DROP-procedure IF EXISTS 'sp_updateWish'; DELIMITER $$ USE 'BucketList' $$ CREATE DEFINER = "root" @ 'localhost' PROCEDURE 'sp_updateWish' (IN p_title varchar (45), IN p_description varchar (1000), IN p_wish_id bigint, In p_user_id bigint, IN p_file_path varchar ( 200), IN p_is_private int, IN p_is_done int) BEGIN update tbl_wish set wish_title = p_title, wish_description = p_description, wish_file_path = p_file_path, wish_private = p_is_private, wish_accomplished = p_is_done where wish_id = p_wish_id en wish_user_id = p_user_id; END $$ DELIMITER;
Wijzig vervolgens de / addWish
aanvraag handler methode om de nieuw geposte velden te lezen en door te geven aan de opgeslagen procedure.
als request.form.get ('filePath') None is: _filePath = "else: _filePath = request.form.get ('filePath') als request.form.get ('private') None is: _private = 0 else: _private = 1 als request.form.get ('done') None is: _done = 0 else: _done = 1
Nadat de waarden zijn gelezen, zullen we ze doorgeven aan de op MySQL opgeslagen procedureaanroep.
cursor.callproc (sp_addWish ', (_ titel, _description, _user, _filePath, _private, _done))
In de addWish.html
pagina die we moeten instellen naam
attribuut voor de elementen die moeten worden gepost. Dus voeg toe naam
zowel voor de nieuw toegevoegde selectievakjes.
Markeren als privé Markeren als voltooid
Nu moeten we ook het uploadbestandspad passeren. We zullen dus een verborgen invoerveld maken en de waarde ervan instellen in de succesoproep voor het uploaden van bestanden.
Stel de waarde in bij het succes van het uploaden van het bestand.
succes: functie (respons, status) var filePath = 'static / Uploads /' + response.filename; $ ('# imgUpload'). attr ('src', filePath); $ ( '# FilePath') val (filePath).;
Sla de bovenstaande wijzigingen op en start de server opnieuw. Log in met geldige inloggegevens en probeer een nieuwe wens toe te voegen met alle vereiste details. Nadat het is toegevoegd, moet dit worden vermeld op de startpagina van de gebruiker.
Allereerst moeten we een HTML-code toevoegen voor de drie nieuwe velden. Dus open userHome.html
en voeg de volgende HTML-code toe na de titel
en Omschrijving
HTML.
Blader…
Markeren als privé
Markeren als voltooid
We moeten de vereiste gegevens ophalen om de bovenstaande velden in te vullen bij bewerken. Dus laten we de opgeslagen procedure aanpassen sp_GetWishById
om de extra velden op te nemen zoals getoond:
CREATE DEFINER = "root" @ 'localhost' PROCEDURE 'sp_GetWishById' (IN p_wish_id bigint, In p_user_id bigint) BEGIN selecteer wish_id, wish_title, wish_description, wish_file_path, wish_private, wish_accomplished from tbl_wish where wish_id = p_wish_id en wish_user_id = p_user_id; EINDE
Vervolgens moeten we het wijzigen JSON
string in de / getWishById
routemethode om de nieuwe velden op te nemen. Wijzig de verlanglijst in / getWishById
zoals getoond:
wish.append ( 'Id': resultaat [0] [0], 'titel': result [0] [1], 'Beschrijving': resultaat [0] [2], 'FilePath': resultaat [0] [ 3], 'Privé': resultaten [0] [4], 'OK': resultaat [0] [5])
Om het resultaat te renderen, moeten we de gegevens ontleden die zijn ontvangen in de succes-callback van de Bewerk
JavaScript-functie in userHome.html
.
succes: function (res) var data = JSON.parse (res); . $ ( '# EditTitle') val (data [0] [ 'Titel']); . $ ( '# EditDescription') val (data [0] [ 'Beschrijving']); $ ('# imgUpload'). attr ('src', data [0] ['FilePath']); if (data [0] ['Private'] == "1") $ ('# chkPrivate'). attr ('checked', 'checked'); if (data [0] ['Done'] == "1") $ ('# chkDone'). attr ('checked', 'checked'); $ ('# editModal'). modal ();
Sla de wijzigingen op en start de server opnieuw op. Log in met geldige legitimatiegegevens en probeer op de startpagina van de gebruiker een wens uit de verlanglijst te bewerken. De gegevens moeten in de pop-up Bewerken worden ingevuld.
Nu, vergelijkbaar met wat we hebben gedaan op de pagina met het toevoegen van de vraag, voeg de jQuery-File-Upload scriptreferentie toe in userHome.html
.
Initialiseer het besturingselement voor bestandsuploads in de pop-up met dezelfde code die we hebben gebruikt op de pagina voor het toevoegen van de vraag.
$ (function () $ ('# fileupload'). fileupload (url: 'upload', dataType: 'json', voeg toe: functie (e, data) data.submit ();, succes: functie ( antwoord, status) var filePath = 'static / Uploads /' + response.filename; $ ('# imgUpload'). attr ('src', filePath); $ ('# filePath'). val (filePath); , error: function (error) console.log (error););)
Vervolgens moeten we de knop bijwerken klikken in de pop-up Bewerken om de extra toegevoegde velden toe te voegen. Dus in de btnUpdate
klik op de knop, wijzig de gegevensparameters die zijn doorgegeven om de drie nieuwe velden op te nemen zoals getoond:
data: title: $ ('# editTitle'). val (), description: $ ('# editDescription'). val (), id: localStorage.getItem ('editId'), filePath: $ ('# imgUpload' ) .attr ( 'src'), isPrivate:. $ ( '# chkPrivate') is ( ': aangevinkt') 1: 0, isDone:. $ ( '# chkDone') is (? ': aangevinkt) 1 : 0
Doe open app.py
en wijzig de / updateWish
aanvraag behandelingsmethode om de nieuw toegevoegde velden te ontleden.
_filePath = request.form ['filePath'] _isPrivate = request.form ['isPrivate'] _isDone = request.form ['isDone']
Pas de procedure aanroepmethode aan om de extra parameters op te nemen.
cursor.callproc (sp_updateWish ', (_ titel, _description, _wish_id, _user, _filePath, _isPrivate, _isDone))
Open nu sp_updateWish
en pas het aan om de nieuw toegevoegde velden op te nemen.
DELIMITER $$ CREATE DEFINER = "root" @ 'localhost' PROCEDURE 'sp_updateWish' (IN p_title varchar (45), IN p_description varchar (1000), IN p_wish_id bigint, In p_user_id bigint, IN p_file_path varchar (200), IN p_is_private int , IN p_is_done int) BEGIN update tbl_wish set wish_title = p_title, wish_description = p_description, wish_file_path = p_file_path, wish_private = p_is_private, wish_accomplished = p_is_done where wish_id = p_wish_id en wish_user_id = p_user_id; EINDE
Sla alle bovenstaande wijzigingen op en start de server opnieuw op. Log in met geldige legitimatiegegevens en probeer de bestaande gegevens te bewerken en bij te werken.
In dit deel van de tutorialserie hebben we gezien hoe we de plug-in blueraph jQuery-File-Upload kunnen integreren en gebruiken om afbeeldingen in onze Python Flask-applicatie te uploaden. In het volgende deel van deze serie laten we de wensen zien die gebruikers op de startpagina van de toepassing hebben bereikt en voegen ze de functionaliteit toe aan de wensen.
Laat ons uw mening, correcties en suggesties weten in de opmerkingen hieronder. Broncode van deze tutorial is beschikbaar op GitHub.