() translation by (you can also view the original English article)
W poprzedniej części tutorialu zaimplementowaliśmy funkcję zapisu i wylogowania użytkownika dla naszej Listy Marzeń. W tej części cyklu opracujemy część kliencką i zaplecze (front end i back end) potrzebne, by wyświetlić listę zapisanych punktów.
Pierwsze kroki
Zaczynamy od sklonowania materiału z poprzedniej części tutorialu z GitHub.
1 |
git clone https://github.com/jay3dec/PythonFlaskMySQLApp_Part2.git |
Gdy kod źródłowy zostanie sklonowany, przejdź do katalogu projektu i uruchom serwer.
1 |
cd PythonFlaskMySQLApp_Part2
|
2 |
python app.py |
Wpisz w przeglądarkę adres http://localhost:5002/ - aplikacja powinna zadziałać.



Dodaj nowe punkty Listy Marzeń
Krok 1: Utwórz interfejs, aby dodawać elementy do listy
Na początek stworzymy interfejs zalogowanego użytkownika służący do dodawania elementów do listy zadań. Przejdź do folderu templates
wewnątrz katalogu projektu i utwórz plik o nazwie addWish.html
. Otwórz addWish.html
i wpisz następujący kod HTML:
1 |
<!DOCTYPE html>
|
2 |
<html lang="en"> |
3 |
|
4 |
<head>
|
5 |
<title>Python Flask Bucket List App</title> |
6 |
|
7 |
|
8 |
<link href="http://getbootstrap.com/dist/css/bootstrap.min.css" rel="stylesheet"> |
9 |
|
10 |
<link href="http://getbootstrap.com/examples/jumbotron-narrow/jumbotron-narrow.css" rel="stylesheet"> |
11 |
|
12 |
<script src="../static/js/jquery-1.11.2.js"></script> |
13 |
|
14 |
|
15 |
</head>
|
16 |
|
17 |
<body>
|
18 |
|
19 |
<div class="container"> |
20 |
<div class="header"> |
21 |
<nav>
|
22 |
<ul class="nav nav-pills pull-right"> |
23 |
<li role="presentation" class="active"><a href="#">Add Item</a> |
24 |
</li>
|
25 |
<li role="presentation"><a href="/logout">Logout</a> |
26 |
</li>
|
27 |
</ul>
|
28 |
</nav>
|
29 |
<h3 class="text-muted">Python Flask App</h3> |
30 |
</div>
|
31 |
<section>
|
32 |
<form class="form-horizontal" method="post" action="/addWish"> |
33 |
<fieldset>
|
34 |
|
35 |
<!-- Form Name -->
|
36 |
<legend>Create Your Wish</legend> |
37 |
|
38 |
<!-- Text input-->
|
39 |
<div class="form-group"> |
40 |
<label class="col-md-4 control-label" for="txtTitle">Title</label> |
41 |
<div class="col-md-4"> |
42 |
<input id="txtTitle" name="inputTitle" type="text" placeholder="placeholder" class="form-control input-md"> |
43 |
</div>
|
44 |
</div>
|
45 |
|
46 |
<!-- Textarea -->
|
47 |
<div class="form-group"> |
48 |
<label class="col-md-4 control-label" for="txtPost">Post</label> |
49 |
<div class="col-md-4"> |
50 |
<textarea class="form-control" id="txtPost" name="inputDescription"></textarea> |
51 |
</div>
|
52 |
</div>
|
53 |
|
54 |
<!-- Button -->
|
55 |
<div class="form-group"> |
56 |
<label class="col-md-4 control-label" for="singlebutton"></label> |
57 |
<div class="col-md-4"> |
58 |
<input id="singlebutton" name="singlebutton" class="btn btn-primary" type="submit" value="Publish" /> |
59 |
</div>
|
60 |
</div>
|
61 |
|
62 |
</fieldset>
|
63 |
</form>
|
64 |
|
65 |
</section>
|
66 |
<footer class="footer"> |
67 |
<p>© Company 2015</p> |
68 |
</footer>
|
69 |
|
70 |
</div>
|
71 |
</body>
|
72 |
|
73 |
</html>
|
Otwórz app.py
i dodaj nowe przekierowanie wraz z metodą, która wyświetli stronę Add Wish
(dodaj życzenie).
1 |
@app.route('/showAddWish') |
2 |
def showAddWish(): |
3 |
return render_template('addWish.html') |
Otwórz userHome.html
i dodaj nowy element menu z linkiem do strony Add Wish
.
1 |
<li role="presentation"><a href="/showAddWish">Add Wish</a></li> |
Zapisz zmiany i uruchom ponownie serwer. Skieruj przeglądarkę na http://localhost:5002 i zaloguj się, używając zarejestrowanego adresu i hasła. Po zalogowaniu kliknij w link Add Wish - powinna wyświetlić się strona dodawania życzeń.



Krok 2: Wdrażanie bazy danych
Aby dodawać życzenia do listy, musimy utworzyć tabelę o nazwie tbl_wish
.
1 |
CREATE TABLE `tbl_wish` ( |
2 |
`wish_id` int(11) NOT NULL AUTO_INCREMENT, |
3 |
`wish_title` varchar(45) DEFAULT NULL, |
4 |
`wish_description` varchar(5000) DEFAULT NULL, |
5 |
`wish_user_id` int(11) DEFAULT NULL, |
6 |
`wish_date` datetime DEFAULT NULL, |
7 |
PRIMARY KEY (`wish_id`) |
8 |
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; |
tbl_wish
będzie miała kolumny title
(tytuł), description
(opis) oraz ID
dla użytkownika, który dodał życzenie.
Teraz musimy utworzyć procedurę składowaną MySQL, która będzie dodawała elementy do tabeli tbl_wish
.
1 |
USE `BucketList`; |
2 |
DROP procedure IF EXISTS `BucketList`.`sp_addWish`; |
3 |
|
4 |
DELIMITER $$ |
5 |
USE `BucketList`$$ |
6 |
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_addWish`( |
7 |
IN p_title varchar(45), |
8 |
IN p_description varchar(1000), |
9 |
IN p_user_id bigint |
10 |
)
|
11 |
BEGIN
|
12 |
insert into tbl_wish( |
13 |
wish_title, |
14 |
wish_description, |
15 |
wish_user_id, |
16 |
wish_date
|
17 |
)
|
18 |
values
|
19 |
(
|
20 |
p_title, |
21 |
p_description, |
22 |
p_user_id, |
23 |
NOW() |
24 |
);
|
25 |
END$$ |
26 |
|
27 |
DELIMITER ; |
28 |
;
|
Krok 3: Utwórz w Pythonie metodę do wywołania procedury składowanej MySQL
Utwórz w app.py
metodę o nazwie addWish
.
1 |
@app.route('/addWish',methods=['POST']) |
2 |
def addWish(): |
3 |
# Code will be here
|
Ponieważ będziemy do tej metody przesyłać dane, zadeklarowaliśmy to już w definicji przekierowania.
Przy każdym wywołaniu metody addWish
musimy się upewnić, czy jest to prawidłowe odwołanie, sprawdzając, czy istnieje zmienna sesji user
. Gdy już zatwierdzimy sesję, zczytujemy przesłane title
oraz description
.
1 |
_title = request.form['inputTitle'] |
2 |
_description = request.form['inputDescription'] |
3 |
_user = session.get('user') |
Gdy już mamy wymagane wartości z formularza, otwieramy połączenie MySQL i wywołujemy procedurę składowaną sp_addWish
.
1 |
conn = mysql.connect() |
2 |
cursor = conn.cursor() |
3 |
cursor.callproc('sp_addWish',(_title,_description,_user)) |
4 |
data = cursor.fetchall() |
Po wykonaniu procedury musimy zapisać zmiany w bazie danych.
1 |
if len(data) is 0: |
2 |
conn.commit() |
3 |
return redirect('/userHome') |
4 |
else: |
5 |
return render_template('error.html',error = 'An error occurred!') |
Oto kompletna metoda addWish
.
1 |
@app.route('/addWish',methods=['POST']) |
2 |
def addWish(): |
3 |
try: |
4 |
if session.get('user'): |
5 |
_title = request.form['inputTitle'] |
6 |
_description = request.form['inputDescription'] |
7 |
_user = session.get('user') |
8 |
|
9 |
conn = mysql.connect() |
10 |
cursor = conn.cursor() |
11 |
cursor.callproc('sp_addWish',(_title,_description,_user)) |
12 |
data = cursor.fetchall() |
13 |
|
14 |
if len(data) is 0: |
15 |
conn.commit() |
16 |
return redirect('/userHome') |
17 |
else: |
18 |
return render_template('error.html',error = 'An error occurred!') |
19 |
|
20 |
else: |
21 |
return render_template('error.html',error = 'Unauthorized Access') |
22 |
except Exception as e: |
23 |
return render_template('error.html',error = str(e)) |
24 |
finally: |
25 |
cursor.close() |
26 |
conn.close() |
Zapisz cały kod źródłowy i ponownie uruchom serwer. Skieruj przeglądarkę na http://localhost:5002 i zaloguj się, używając zarejestrowanego adresu i hasła. Po zalogowaniu, kliknij w link Add Wish. Wpisz tytuł i opis swojego życzenia i kliknij Publish (opublikuj). Gdy życzenie zostanie dodane, powinno nastąpić przekierowanie do strony domowej użytkownika. Zaloguj się do bazy danych MySQL - życzenie powinno już znaleźć się w tabeli tbl_wish
.
Wyświetlanie elementu Listy Życzeń
Krok 1: Utwórz procedurę składowaną do wyświetlania życzeń
Teraz stworzymy procedurę składowaną MySQL, która wyświetli życzenia zapisane przez użytkownika. Pobierze ona ID
użytkownika jako parametr i zwróci dane z życzeniami przypisanymi do odpowiedniego ID.
1 |
USE `BucketList`; |
2 |
DROP procedure IF EXISTS `sp_GetWishByUser`; |
3 |
|
4 |
DELIMITER $$ |
5 |
USE `BucketList`$$ |
6 |
CREATE PROCEDURE `sp_GetWishByUser` ( |
7 |
IN p_user_id bigint |
8 |
)
|
9 |
BEGIN
|
10 |
select * from tbl_wish where wish_user_id = p_user_id; |
11 |
END$$ |
12 |
|
13 |
DELIMITER ; |
14 |
Krok 2: Utwórz w Pythonie metodę pobierania danych
Teraz utworzymy metodę Pythona, która wywoła procedurę sp_GetWishByUser
, by pobrać życzenia zapisane przez użytkownika. Dodaj do pliku app.py
metodę getWish
.
1 |
@app.route('/getWish') |
2 |
def getWish(): |
3 |
try: |
4 |
if session.get('user'): |
5 |
_user = session.get('user') |
6 |
else: |
7 |
return render_template('error.html', error = 'Unauthorized Access') |
8 |
except Exception as e: |
9 |
return render_template('error.html', error = str(e)) |
Jak widać w przytoczonym kodzie, wywołanie tej metody zawsze musi zawierać prawidłową zmienną sesji user
. Gdy już zatwierdzimy poprawność użytkownika, utworzymy połączenie z bazą MySQL i wywołamy procedurę sp_GetWishByUser
.
1 |
_user = session.get('user') |
2 |
|
3 |
# Connect to MySQL and fetch data
|
4 |
con = mysql.connect() |
5 |
cursor = con.cursor() |
6 |
cursor.callproc('sp_GetWishByUser',(_user,)) |
7 |
wishes = cursor.fetchall() |
Gdy już pobierzemy dane z MySQL, zostaną one przetworzone i przekształcone w dictionary
(Pythonowski słownik), aby dało się je zwrócić w formacie JSON
.
1 |
wishes_dict = [] |
2 |
for wish in wishes: |
3 |
wish_dict = { |
4 |
'Id': wish[0], |
5 |
'Title': wish[1], |
6 |
'Description': wish[2], |
7 |
'Date': wish[4]} |
8 |
wishes_dict.append(wish_dict) |
Po przekształceniu danych w słownik, przeformatujemy je na JSON
i zwrócimy.
1 |
return json.dumps(wishes_dict) |
Oto metoda getWish
w całej rozciągłości.
1 |
@app.route('/getWish') |
2 |
def getWish(): |
3 |
try: |
4 |
if session.get('user'): |
5 |
_user = session.get('user') |
6 |
|
7 |
con = mysql.connect() |
8 |
cursor = con.cursor() |
9 |
cursor.callproc('sp_GetWishByUser',(_user,)) |
10 |
wishes = cursor.fetchall() |
11 |
|
12 |
wishes_dict = [] |
13 |
for wish in wishes: |
14 |
wish_dict = { |
15 |
'Id': wish[0], |
16 |
'Title': wish[1], |
17 |
'Description': wish[2], |
18 |
'Date': wish[4]} |
19 |
wishes_dict.append(wish_dict) |
20 |
|
21 |
return json.dumps(wishes_dict) |
22 |
else: |
23 |
return render_template('error.html', error = 'Unauthorized Access') |
24 |
except Exception as e: |
25 |
return render_template('error.html', error = str(e)) |
Krok 3: Przypinsnir danych JSON do HTML
Gdy załaduje się strona domowa użytkownika, wywołamy metodę getWish
korzystając z jQuery AJAX i przypniemy otrzymane dane do naszego HTML. W userHome.html
wstaw poniższy skrypt AJAX jQuery
:
1 |
<script>
|
2 |
$(function() { |
3 |
$.ajax({ |
4 |
url: '/getWish', |
5 |
type: 'GET', |
6 |
success: function(res) { |
7 |
console.log(res); |
8 |
},
|
9 |
error: function(error) { |
10 |
console.log(error); |
11 |
}
|
12 |
});
|
13 |
});
|
14 |
</script>
|
Zapisz wprowadzone zmiany i zrestartuj serwer. Po zalogowaniu się prawidłowym adresem i hasłem, zerknij do konsoli przeglądarki - powinna się w niej pojawić lista życzeń pobrana z bazy danych:
1 |
[{
|
2 |
"Date": "Fri, 23 Jan 2015 23:26:05 GMT", |
3 |
"Description": "I want to climb Mount Everest", |
4 |
"Id": 1, |
5 |
"Title": "Climb Everest" |
6 |
}, { |
7 |
"Date": "Fri, 23 Jan 2015 23:27:05 GMT", |
8 |
"Description": "I want to jump from top of a mountain", |
9 |
"Id": 2, |
10 |
"Title": "Bungee Jump" |
11 |
}]
|
Teraz musimy zczytać dane z JSON
i przypiąć je do HTML. Skorzystamy z bootstrapowego list-group
do wyświetlenia elementów listy. Oto podstawowy szablon dla list-group
:
1 |
<div class="list-group"> |
2 |
<a href="#" class="list-group-item active"> |
3 |
<h4 class="list-group-item-heading">Wish Title</h4> |
4 |
<p class="list-group-item-text">Wish Description</p> |
5 |
</a>
|
6 |
</div>
|
Dodaj powyższy kod HTML do diva jumbotron
wewnątrz userHome.html
. Powinno to wyglądać tak:



Teraz utworzymy podobny div list-group
dynamicznie dla każdego nowego życzenia i dołączymy go do divu jambotron
. Wewnątrz komunikatu o sukcesie dla wywołania funkcji getWish
, utwórz div jak pokazano poniżej:
1 |
var div = $('<div>') |
2 |
.attr('class', 'list-group') |
3 |
.append($('<a>') |
4 |
.attr('class', 'list-group-item active') |
5 |
.append($('<h4>') |
6 |
.attr('class', 'list-group-item-heading'), |
7 |
$('<p>') |
8 |
.attr('class', 'list-group-item-text'))); |
Będziemy klonować taki div przy każdym nowym elemencie listy, aby każdy miał swój własny div list-group
. Następnie przetwórz zwrócony string JSON
w obiekt JavaScript.
1 |
var wishObj = JSON.parse(res); |
Teraz przeiteruj wishObj
dla każdego elementu-życzenia, wstawiając dla niego nowego klona diva, który tworzyliśmy wyżej, i dołączając go do diva jumbotron
.
1 |
var wish = ''; |
2 |
|
3 |
$.each(wishObj, function(index, value) { |
4 |
wish = $(div).clone(); |
5 |
$(wish).find('h4').text(value.Title); |
6 |
$(wish).find('p').text(value.Description); |
7 |
$('.jumbotron').append(wish); |
8 |
});
|
Zapisz wszystkie zmiany i zrestartuj serwer. Zaloguj się poprawnym adresem i hasłem. Powinieneś teraz zobaczyć listę życzeń stworzonych przez konkretnego użytkownika.



Podsumowanie
W tym tutorialu zaimplementowaliśmy interfejs, dzięki któremu zalogowany użytkownik może dodawać życzenia, Wprowadziliśmy również niezbędne metody oraz procedurę składowaną w bazie danych, aby odbierać i wyświetlać utworzone życzenia na stronie domowej użytkownika.
W kolejnej części cyklu zobaczymy, jak wprowadzić funkcjonalności Edit
oraz Delete
dla listy życzeń wyświetlanej na stronie domowej.
Kod źródłowy z tego tutorialu jest dostępny na GitHub.
Podziel się swoimi wrażeniami w komentarzach poniżej!