Membuat Web App Dari Awal Menggunakan Python Flask dan MySQL
Indonesian (Bahasa Indonesia) translation by Biyan Pasau (you can also view the original English article)
Dalam seri ini, kita akan menggunakan Python, Flask dan MySQL untuk membuat aplikasi web sederhana dari awal. Ini akan menjadi aplikasi "daftar keinginan" (bucket list) sederhana dimana pengguna bisa mendaftar, masuk dan membuat daftar keinginan mereka.
Tutorial ini mengasumsikan bahwa Anda memiliki beberapa pengetahuan dasar tentang bahasa pemrograman Python. kita akan menggunakan Flask, kerangka aplikasi web Python, untuk membuat aplikasi, dengan MySQL sebagai back end.
Pengenalan Python Flask
Flask adalah kerangka (framework) Python untuk membuat aplikasi web. Dari situs aslinya,
Flask adalah microframework untuk Python berbasis Werkzeug, Jinja 2 dan "niat baik".
Ketika kita memikirkan Python, kerangka de facto yang muncul di benak kita adalah framework Django. Tapi dari perspektif pemula Python, Flask lebih mudah, jika dibandingkan dengan Django.
Menyiapkan Flask
Menyiapkan Flask sangat sederhana dan cepat. Dengan package manager pip, semua yang perlu kita lakukan adalah:
1 |
pip install flask |
Setelah anda selesai meng-install Flask, buat folder dengan nama FlaskApp. Masuk ke folder FlaskApp dan buat sebuah file dengan nama app.py. Import modul flask dan buat aplikasi menggunakan Flask seperti ditunjukkan berikut:
1 |
from flask import Flask |
2 |
app = Flask(__name__) |
Sekarang tentukan basic route / dan handler yang sesuai:
1 |
@app.route("/") |
2 |
def main(): |
3 |
return "Welcome!" |
Berikutnya, periksa jika file yang dieksekusi adalah program utama dan jalankan app-nya
1 |
if __name__ == "__main__": |
2 |
app.run() |
Simpan perubahan dan eksekusi app.py:
1 |
python app.py |
Arahkan browser Anda ke http://localhost: 5000/ dan Anda pasti memiliki pesan pembuka, "welcome".
Membuat Home Page
Pertama, ketika aplikasi berjalan kita akan menampilkan home page dengan isi dari daftar keinginan terbaru yang ditambahkan oleh pengguna. Jadi, mari menambahkan home page ke folder aplikasi kita.
Flask mencari file template di dalam folder templates. Jadi, navigasi ke folder PythonApp dan buat folder dengan nama templates. Didalam templates, buat sebuah file dengan nama index.html. Buka index.html dan tambahkan HTML berikut:
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 |
|
13 |
</head>
|
14 |
|
15 |
<body>
|
16 |
|
17 |
<div class="container"> |
18 |
<div class="header"> |
19 |
<nav>
|
20 |
<ul class="nav nav-pills pull-right"> |
21 |
<li role="presentation" class="active"><a href="#">Home</a> |
22 |
</li>
|
23 |
<li role="presentation"><a href="#">Sign In</a> |
24 |
</li>
|
25 |
<li role="presentation"><a href="showSignUp">Sign Up</a> |
26 |
</li>
|
27 |
</ul>
|
28 |
</nav>
|
29 |
<h3 class="text-muted">Python Flask App</h3> |
30 |
</div>
|
31 |
|
32 |
<div class="jumbotron"> |
33 |
<h1>Bucket List App</h1> |
34 |
<p class="lead"></p> |
35 |
<p><a class="btn btn-lg btn-success" href="showSignUp" role="button">Sign up today</a> |
36 |
</p>
|
37 |
</div>
|
38 |
|
39 |
<div class="row marketing"> |
40 |
<div class="col-lg-6"> |
41 |
<h4>Bucket List</h4> |
42 |
<p>Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.</p> |
43 |
|
44 |
<h4>Bucket List</h4> |
45 |
<p>Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.</p> |
46 |
|
47 |
<h4>Bucket List</h4> |
48 |
<p>Maecenas sed diam eget risus varius blandit sit amet non magna.</p> |
49 |
</div>
|
50 |
|
51 |
<div class="col-lg-6"> |
52 |
<h4>Bucket List</h4> |
53 |
<p>Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.</p> |
54 |
|
55 |
<h4>Bucket List</h4> |
56 |
<p>Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.</p> |
57 |
|
58 |
<h4>Bucket List</h4> |
59 |
<p>Maecenas sed diam eget risus varius blandit sit amet non magna.</p> |
60 |
</div>
|
61 |
</div>
|
62 |
|
63 |
<footer class="footer"> |
64 |
<p>© Company 2015</p> |
65 |
</footer>
|
66 |
|
67 |
</div>
|
68 |
</body>
|
69 |
|
70 |
</html>
|
Buka app.py dan import render_template, dimana kita akan menggunakan untuk me-render file-file template.
1 |
from flask import Flask, render_template |
Ubah metode utama untuk mengembalikan file template yang di-render.
1 |
def main(): |
2 |
return render_template('index.html') |
Simpan perubahan dan restart server. Arahkan browser anda ke http://localhost:5000/ dan Anda seharusnya memiliki tampilan berikut:



Membuat Halaman Pendaftaran (Signup)
Langkah 1: Menyiapkan Database
Kita akan menggunakan MySQL sebagai back end. Jadi, masuk ke MySQL dari "command line", atau jika anda lebih suka GUI seperti MySQL work bench, Anda bisa menggunakannya. Pertama, buat sebuah database dengan nama BucketList. Dari command line:
1 |
mysql -u <username> -p |
Masukkan password dan setelah masuk, eksekusi perintah berikut untuk membuat database:
1 |
CREATE DATABASE BucketList; |
Setelah database telah jadi, buat sebuah table dengan nama tbl_user seperti berikut:
1 |
CREATE TABLE `BucketList`.`tbl_user` ( |
2 |
`user_id` BIGINT NULL AUTO_INCREMENT, |
3 |
`user_name` VARCHAR(45) NULL, |
4 |
`user_username` VARCHAR(45) NULL, |
5 |
`user_password` VARCHAR(45) NULL, |
6 |
PRIMARY KEY (`user_id`)); |
Kita akan menggunakan Stored procedures untuk aplikasi Python kita untuk berinteraksi dengan database MySQL. Jadi, saat table tbl_user telah jadi, buat sebuah "stored procedure" (prosedur penyimpanan) dengan nama sp_createUser untuk mendaftarkan pengguna.
Saat membuat storage procedure untuk membuat pengguna di table tbl_user, pertama kita harus memeriksa jika pengguna dengan username yang sama telah ada. Jika telah ada, kita akan menampilkan error ke pengguna tersebut, dan jika tidak kita akan menambahkan pengguna kedalam table. Berikut bagaimana storage procedure atau prosedur penyimpanan sp_createUser bekerja:
1 |
DELIMITER $$ |
2 |
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_createUser`( |
3 |
IN p_name VARCHAR(20), |
4 |
IN p_username VARCHAR(20), |
5 |
IN p_password VARCHAR(20) |
6 |
)
|
7 |
BEGIN
|
8 |
if ( select exists (select 1 from tbl_user where user_username = p_username) ) THEN |
9 |
|
10 |
select 'Username Exists !!'; |
11 |
|
12 |
ELSE
|
13 |
|
14 |
insert into tbl_user |
15 |
(
|
16 |
user_name, |
17 |
user_username, |
18 |
user_password
|
19 |
)
|
20 |
values
|
21 |
(
|
22 |
p_name, |
23 |
p_username, |
24 |
p_password
|
25 |
);
|
26 |
|
27 |
END IF; |
28 |
END$$ |
29 |
DELIMITER ; |
Step 2: Buat Interface (Antarmuka) Pendaftaran
Masuk ke direktori PythonApp/templates dan buat file HTML dengan nama singup.html. Tambahkan code HTML berikut ke singup.html:
1 |
<!DOCTYPE html>
|
2 |
<html lang="en"> |
3 |
<head>
|
4 |
<title>Python Flask Bucket List App</title> |
5 |
|
6 |
|
7 |
<link href="http://getbootstrap.com/dist/css/bootstrap.min.css" rel="stylesheet"> |
8 |
|
9 |
<link href="http://getbootstrap.com/examples/jumbotron-narrow/jumbotron-narrow.css" rel="stylesheet"> |
10 |
<link href="../static/signup.css" rel="stylesheet"> |
11 |
|
12 |
</head>
|
13 |
|
14 |
<body>
|
15 |
|
16 |
<div class="container"> |
17 |
<div class="header"> |
18 |
<nav>
|
19 |
<ul class="nav nav-pills pull-right"> |
20 |
<li role="presentation" ><a href="main">Home</a></li> |
21 |
<li role="presentation"><a href="#">Sign In</a></li> |
22 |
<li role="presentation" class="active"><a href="#">Sign Up</a></li> |
23 |
</ul>
|
24 |
</nav>
|
25 |
<h3 class="text-muted">Python Flask App</h3> |
26 |
</div>
|
27 |
|
28 |
<div class="jumbotron"> |
29 |
<h1>Bucket List App</h1> |
30 |
<form class="form-signin"> |
31 |
<label for="inputName" class="sr-only">Name</label> |
32 |
<input type="name" name="inputName" id="inputName" class="form-control" placeholder="Name" required autofocus> |
33 |
<label for="inputEmail" class="sr-only">Email address</label> |
34 |
<input type="email" name="inputEmail" id="inputEmail" class="form-control" placeholder="Email address" required autofocus> |
35 |
<label for="inputPassword" class="sr-only">Password</label> |
36 |
<input type="password" name="inputPassword" id="inputPassword" class="form-control" placeholder="Password" required> |
37 |
|
38 |
<button id="btnSignUp" class="btn btn-lg btn-primary btn-block" type="button">Sign up</button> |
39 |
</form>
|
40 |
</div>
|
41 |
|
42 |
|
43 |
|
44 |
<footer class="footer"> |
45 |
<p>© Company 2015</p> |
46 |
</footer>
|
47 |
|
48 |
</div>
|
49 |
</body>
|
50 |
</html>
|
Juga tambahkan CSS berikut dengan nama singup.css ke folder statis didalam PythonApp.
1 |
body { |
2 |
padding-top: 40px; |
3 |
padding-bottom: 40px; |
4 |
}
|
5 |
|
6 |
.form-signin { |
7 |
max-width: 330px; |
8 |
padding: 15px; |
9 |
margin: 0 auto; |
10 |
}
|
11 |
.form-signin .form-signin-heading, |
12 |
.form-signin .checkbox { |
13 |
margin-bottom: 10px; |
14 |
}
|
15 |
.form-signin .checkbox { |
16 |
font-weight: normal; |
17 |
}
|
18 |
.form-signin .form-control { |
19 |
position: relative; |
20 |
height: auto; |
21 |
-webkit-box-sizing: border-box; |
22 |
-moz-box-sizing: border-box; |
23 |
box-sizing: border-box; |
24 |
padding: 10px; |
25 |
font-size: 16px; |
26 |
}
|
27 |
.form-signin .form-control:focus { |
28 |
z-index: 2; |
29 |
}
|
30 |
.form-signin input[type="email"] { |
31 |
margin-bottom: -1px; |
32 |
border-bottom-right-radius: 0; |
33 |
border-bottom-left-radius: 0; |
34 |
}
|
35 |
.form-signin input[type="password"] { |
36 |
margin-bottom: 10px; |
37 |
border-top-left-radius: 0; |
38 |
border-top-right-radius: 0; |
39 |
}
|
Di app.py tambahkan metode lain yang disebut showSignUp untuk membuat halaman pendaftaran begitu sebuah permintaan datang ke /showSignUp:
1 |
@app.route('/showSignUp') |
2 |
def showSignUp(): |
3 |
return render_template('signup.html') |
Simpan perubahan dan restart server. Klik pada tombol Sign Up di beranda dan Anda pasti memiliki halaman pendaftaran seperti berikut:



Step 3: Mengimplementasikan Metode Pendaftaran (Signup)
Berikutnya, kita membutuhkan metode server-side untuk UI agar berinteraksi dengan database MySQL. Jadi masuk ke PythonApp dan buka app.py. Buat metode baru dengan nama singUp dan juga tambahkan route /signUp. Begini tampilannya:
1 |
@app.route('/signUp') |
2 |
def signUp(): |
3 |
# create user code will be here !!
|
Kita akan menggunakan jQuery AJAX untuk mengirim data signup Anda ke metode signUp, jadi kami akan menentukan metode dalam definisi rute.
1 |
@app.route('/signUp',methods=['POST']) |
2 |
def signUp(): |
3 |
# create user code will be here !!
|
Untuk membaca nilai yang dikirim, kita harus mengimpor request dari Flask.
1 |
from flask import Flask, render_template, request |
Dengan menggunakan request kita bisa membaca nilai yang diposting seperti berikut:
1 |
@app.route('/signUp',methods=['POST']) |
2 |
def signUp(): |
3 |
|
4 |
# read the posted values from the UI
|
5 |
_name = request.form['inputName'] |
6 |
_email = request.form['inputEmail'] |
7 |
_password = request.form['inputPassword'] |
Setelah nilainya terbaca, kita akan memeriksa apakah datanya "valid" dan untuk sementara kita akan menampilkan pesan sederhana:
1 |
@app.route('/signUp',methods=['POST']) |
2 |
def signUp(): |
3 |
|
4 |
# read the posted values from the UI
|
5 |
_name = request.form['inputName'] |
6 |
_email = request.form['inputEmail'] |
7 |
_password = request.form['inputPassword'] |
8 |
|
9 |
# validate the received values
|
10 |
if _name and _email and _password: |
11 |
return json.dumps({'html':'<span>All fields good !!</span>'}) |
12 |
else: |
13 |
return json.dumps({'html':'<span>Enter the required fields</span>'}) |
Juga, import json dari Flask, karena kita menggunakannya di code sebelumnya untuk mengembalikan data json.
1 |
from flask import Flask, render_template, json, request |
Langkah 4: Buat permintaan Signup
Kita akan menggunakan jQuery AJAX untuk mengirim permintaan singup ke metode Python. Download dan tempatkan jQuery didalam PythonApp/static/js dan tambahkan link dari halaman singup. Setelah jQuery disertakan, kami akan menambahkan permintaan JQuery POST saat pengguna mengklik tombol Sign Up.
Jadi, mari pasang event klik tombol signup seperti yang ditunjukkan:
1 |
$(function() { |
2 |
$('#btnSignUp').click(function() { |
3 |
|
4 |
$.ajax({ |
5 |
url: '/signUp', |
6 |
data: $('form').serialize(), |
7 |
type: 'POST', |
8 |
success: function(response) { |
9 |
console.log(response); |
10 |
},
|
11 |
error: function(error) { |
12 |
console.log(error); |
13 |
}
|
14 |
});
|
15 |
});
|
16 |
});
|
Simpan semua perubahan dan restart server. Dari halaman Sign Up, isi rinciannya dan klik Sign Up. Periksa konsol browser dan Anda pasti memiliki pesan di bawah ini:
1 |
{"html": "<span>All fields good !!</span>"} |
Step 5: Panggil Prosedur Penyimpanan MySQL
Setelah kita memiliki name, email address dan password, kita bisa langsung memanggil prosedur tersimpan MySQL untuk membuat pengguna baru.
Untuk terhubung dengan MySQL, kita akan menggunakan Flask-MySQL, yang merupakan ekstensi Flask. Untuk memulai dengan Flask-MySQL, instal dengan menggunakan manajer paket pip:
1 |
pip install flask-mysql
|
Import MySQL kedalam app.py:
1 |
from flask.ext.mysql import MySQL |
Sebelumnya kita mendefinisikan aplikasi kita seperti berikut:
1 |
app = Flask(__name__) |
Bersaat dengan itu masukka konfigurasi MySQL berikut:
1 |
mysql = MySQL() |
2 |
|
3 |
# MySQL configurations
|
4 |
app.config['MYSQL_DATABASE_USER'] = 'jay' |
5 |
app.config['MYSQL_DATABASE_PASSWORD'] = 'jay' |
6 |
app.config['MYSQL_DATABASE_DB'] = 'BucketList' |
7 |
app.config['MYSQL_DATABASE_HOST'] = 'localhost' |
8 |
mysql.init_app(app) |
Pertama, mari buat koneksi MySQL:
1 |
conn = mysql.connect() |
Setelah koneksi dibuat, kita akan meminta cursor untuk memeriksa prosedur peyimpanan kita. Jadi, gunakan koneksi conn, buat sebuah cursor (kursos).
1 |
cursor = conn.cursor() |
Sebelum memanggil pengguna membuat prosedur tersimpan, mari membuat password salted menggunakan bantuan yang disediakan oleh Werkzeug. Import modul kedalam app.py:
1 |
from werkzeug import generate_password_hash, check_password_hash |
Gunakan modul salting untuk membuat pasword ber-hash
1 |
_hashed_password = generate_password_hash(_password) |
Sekarang, buat prosedur sp_createUser:
1 |
cursor.callproc('sp_createUser',(_name,_email,_hashed_password)) |
Jika prosedur berhasil dijalankan, maka kita akan melakukan perubahan dan menampilkan pesan sukses.
1 |
data = cursor.fetchall() |
2 |
|
3 |
if len(data) is 0: |
4 |
conn.commit() |
5 |
return json.dumps({'message':'User created successfully !'}) |
6 |
else: |
7 |
return json.dumps({'error':str(data[0])}) |
Simpan perubahan dan restart server. Buka halaman pendaftaran dan masukkan name, email address dan password dan klik tombol Sign Up. Pada pembuatan pengguna yang sukses, Anda dapat melihat pesan di konsol browser Anda.
1 |
{"message": "User created successfully !"}
|
Menggabungkan Semuanya
Dalam tutorial ini, kita melihat bagaimana memulai dengan membuat aplikasi web menggunakan Python Flask, MySQL dan ekstensi Flask-MySQL. Kami membuat dan merancang tabel database dan prosedur penyimpanan, dan menerapkan fungsi pendaftaran. Pada tutorial berikutnya, kita akan membawa seri ini ke tingkat berikutnya dengan menerapkan fungsionalitas sign-in dan beberapa fitur lainnya.
Sumber code dari tutorial ini tersedia di GitHub.
Jangan lupa komentar ya!



