Advertisement
  1. Code
  2. Python

Stwórz od zera aplikację internetową przy użyciu Python Flask i MySQL: Część 3

Scroll to top
Read Time: 8 min
This post is part of a series called Creating a Web App From Scratch Using Python Flask and MySQL.
Creating a Web App From Scratch Using Python Flask and MySQL: Part 2
Creating a Web App From Scratch Using Python Flask and MySQL: Part 4

() 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ć.

Bucket List App Home PageBucket List App Home PageBucket List App Home Page

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>&copy; 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ń.

Add Bucket List ItemAdd Bucket List ItemAdd Bucket List Item

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:

list-group in User Homelist-group in User Homelist-group in User Home

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.

User Home Page Populated with WishesUser Home Page Populated with WishesUser Home Page Populated with Wishes

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!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.