Template Engine

Pada bagian ini, kamu akan diberikan panduan bagaimana menggunakan template di Flask. Template sendiri berguna agar kita dapat merancang tampilan yang dapat digunakan berulang-kali (reusable). Flask sendiri memiliki sendiri template engine yang disebut dengan nama Jinja2. Untuk mengetahui cara penggunaanya, silahkan lihat pada modul selanjutnya.

Jinja Template Engine

Jinja2 adalah bahasa templating modern dan ramah desainer untuk Python, meniru model template Django atau Flask. Cepat, banyak digunakan, dan aman dengan lingkungan eksekusi template. Jinja2 digunakan di bagian Front end.

Contoh: Yang semula code HTML-nya seperti ini:

<h1>Hello, David</h1>

Setelah menggunakan Jinja2:

<h1>Hello, {{ name }} </h1>

Value dari {{ name }} akan dikirim melalui Route yang sudah kita pelajari sebelumnya.

Rendering Template

Di bagian atas kamu mempunyai sebuah variable {{ name }} yang belum berisikan value. Disini di bagian Rendering Templates kamu akan akan memberikan value kepada {{ name }} dengan menuliskannya di bagian route:

# app.py
from flask import Flask, render_template #tambahkan ini

#.........

# tambahkan kode dibawah ini
@app.route('/user/<name>')
def user(name):
    return render_template('user.html', name=name)

Dan jangan lupa untuk membuat folder templates yang berisikan user.html karna fungsi render_template untuk membaca folder templates yang isinya user.html sehingga folder kamu terlihat seperti ini:

Dan buatlah kode seperti ini di dalam file user.html:

dan cobalah untuk mengakses https://127.0.0.1:5000/user/David di web browser kamu, maka hasilnya akan sama seperti sebelumnya, namun kamu berhasil menggunakan template pada pandua kali ini.

http://127.0.0.1:5000/user/David

Variabel

{{ name }} adalah sebuah variabel. Namun, kamu juga harus tau bahwa di jinja2 ada fungsi untuk memfilter sebuah karakter namanya variabel filters contoh kecilnya seperti ini:

hasilnya akan membuat huruf awal dari variabel menjadi kapital. Berikut ini adalah daftar beberapa variabel filter jinja:

Nama Filter

Deskripsi

safe

Merender semua tags html

capitalize

Memberikan kapital pada huruf awal kalimat

lower

Membuat kalimat menjadi huruf kecil semua

upper

Membuat kalimat menjadi huruf besar semua

title

Membuat awal kata menjadi kapital

striptags

Menghilangkan tags html sebelum di rendering

Control Structure

Sekarang kamu akan membuat file base.html di folder templates dengan isi seperti kode dibawah ini:

sehingga struktur direktori kamu menjadi seperti ini:

Di jinja2 juga kita bisa melakukan beberapa kontrol struktur seperti contoh kecilnya:

Kemudian ubahlah di code kamu di bagian user.html menjadi seperti di bawah:

Jadi artinya extends ini adalah sebagai dasar template atau sebagai struktur dasar template yang diambil dari base.html. Jadi setiap block yang di user.html akan diposisikan sesuai block yang kamu tuliskan di base.html. Program kamu jadi lebih terstrukturkan!

Lalu coba jalankan kembali flask run dan pastikan program berjalan normal

http://127.0.0.1:5000/user/David

Integrasi Bootstrap dengan Flask

Integrasi Bootstrap menggunakan CDN

Bootstrap membantu menciptakan antarmuka web menjadi lebih atraktif dan lebih bersih dan compatible dengan semua web browser baik desktop ataupun mobile, dan ini open-source. Di sesi ini kamu akan integrasikan bootstrap dengan web kamu dengan menggunakan CDN. Langkahnya seperti ini:

  • Copy dan Paste juga CDN JS di atas </body> pada base.html sehingga kode lengkapnya seperti ini

Selanjutnya coba jalankan kembali flask run dan pastikan style pada tampilannya berubah

Menambahkan Navbar

Selanjutnya buatlah file baru pada folder templates dengan nama navbar.html sehingga struktur direktory kamu menjadi seperti ini:

Lalu tambahkan kode berikut ini pada navbar.html:

navbar.html ini nanti berfungsi sebagai navbar kamu yang bisa kamu panggil secara terus menerus. Caranya tuliskan {% include 'navbar.html' %} dibawah tag body pada base.html sehingga seperti ini:

Kemudian kamu ubah:

yang ada di bawah {% block content %} pada user.html menjadi:

Sekarang kamu restart web browser kamu dan lihat perubahannya.

http://127.0.0.1:5000/user/David

Kustom Halaman Error

Kustom Halaman Error adalah ketika kamu dalam mode debug=False/(Production) dan terjadi error pada halaman website baik 404 (Not Found), 403 (Forbidden) ataupun 500 (Internal Server Error). Agar terlihat lebih user friendly, kita dapat melakukan kustom pada halaman tersebut.

errorhandler mengembalikan respon status kode 403, 404, dan 500. Jadi ketika terjadi error 404 maka akan mengakses halaman 404.html dan seterusnya. Selanjutnya, kita akan membuat file template error 403.html, 404.html, 500.html pada folder templates, sehingga struktur dari direktori nya akan terlihat seperti ini:

Status Kode 403

Status Kode 404

Status Kode 500

Error pages ini akan terbaca ketika kamu merubah debug=False nanti ketika mengakses halaman yang salah, akan muncul custome page 404.html dan seterusnya.

404 Not Found Ketika Mengakses Halaman Yang Salah

500 Internal Server Error Ketika Aplikasi Mengalami Error

Link digunakan untuk menghubungkan antara halaman, dalam flask untuk menghubungkan antar halaman kita dapat menggunakan url_for. url_for selain menghubungkan antar halaman, juga bisa digunakan untuk mengambil file dari gambar, css, js dan lainnya dari sebuah Static Folder.

Link yang akan kamu gunakan untuk menghubungkan antar halaman contohnya seperti ini:

Penjelasannya: index dalam url_for adalah nama fungsi dari route. Jadi ketika kamu ingin menghubungkan antar halaman, kamu harus memanggil fungsi routenya.

Tapi, jika dalam route itu membutuhkan sebuah nilai, contoh dalam route:

jadi url_for menjadi seperti ini:

Penjelasannya: parameter name dengan nilai David akan dilempar ke dalam fungsi route yang bernama user.

Lalu bagaimana jika ingin mengambil file menggunakan url_for

penjelasannya: 'static' dalam url_for adalah nama folder kamu, filename adalah nama filenya.

Contoh Penerapan

Dalam file app.py saat ini, terdapat 2 routes yang akan kita coba untuk saling hubungkan dengan cara seperti berikut:

Ubahlah kode yang ada pada navbar.html menjadi seperti ini:

Kemudian buatlah sebuah file bernama index.html didalam folder templates sehingga struktur direktori saat ini menjadi seperti ini:

Lali isi kode index.html seperti ini:

Selanjutnya ubah fungsi index pada route di app.py agar dapat melakukan render template ke file index.html

Lalu coba jalankan server kembali untuk melihat hasil perubahannya.

http://127.0.0.1:5000/

Tanggal & Jam dengan Flask Moment

Untuk mengatasi tanggal dan jam, flask menyediakan library yang bernama flask-moment. Didalam flask-moment terdapat javascript library yang disebut moment.js. Moment.js adalah javascript library yang bersifat open-source untuk merender tanggal dan waktu.

Kali ini kamu bakalan belajar cara menggunakan ekstensi flask, ini merupakan fitur yang disediakan flask agar mempermudah kita dalam menggunakan library yang sudah tersedia. Untuk menggunakan flask-moment cukup install flask-moment dengan menggunakan pip di terminal dan pastikan environment kamu saat ini aktif. Berikut ini cara menginstall flask moment:

Kemudian tambahkan kode seperti ini pada app.py untuk inisialisasi flask-moment

kemudian pada fungsi route user, tambahkan parameter current_time yang menampung isi fungsi untuk menampilkan waktu saat ini:

Tambahkan kode ini di dalam <head> pada base.html agar flask-moment dapat digunakan:

Lalu tambahkan juga kode berikut ini pada user.html

Sehingga kode lengkap nya akan menjadi seperi ini:

Lalu akses kembali halaman https://127.0.0.1:5000/user/David untuk melihat hasil perubahannya.

http://127.0.0.1:5000/user/David

Selengkapnya untuk format waktu & tanggal pada Flask-Moment

Format

Hasil

.format('L')

17/01/2020

.format('LL')

17 Januari 2020

.format('LLL')

17 Januari 2020 pukul 10.10

.format('LLLL')

Jumat, 17 Januari 2020 pukul 10.10

.fromNow()

7 menit yang lalu

.calendar()

17/01/2020

Web Forms Menggunakan Flask WTF

Dengan HTML, memungkinkan kamu untuk membuat web forms, dimana user bisa memasukkan informasi melalui web browser ke server dan biasanya menggunakan method adalah POST. Dengan Form HTML biasa sebenarnya kamu sudah bisa mengambil nilai dari form dengan request.form, namun dengan flask-wtf kamu bisa melakukan validation form dan dapat menggunakan kembali kode tersebut (reusable). Cara install ekstensi flask-wtf cukup dengan cara:

ketika sudah selesai menginstall terdapat dua paket yang terinstal yaitu Flask-WTF dan WTForms.

Konfigurasi Flask WTF

Tidak seperti kebanyakan ekstensi, flask-wtf tidak perlu untuk kamu inisialisasi. Kamu cuma perlu untuk melakukan konfigurasi di app.py. Konfigurasi ini berupa secret_key yang artinya hanya kamu sendiri yang tau secret_key ini. Kamu bisa melakukan configurasi seperti ini pada app.py

Kelas Form

Ketika menggunakan flask-wtf, masing-masing dari form yang berada di web diwakili oleh kelas FlaskForm. Setiap field form boleh memiliki validator lebih dari satu. Validator adalah fungsi yang memeriksa apakah data yang dikirimkan oleh pengguna valid atau tidak valid.

Tambahakan kode ini pada app.py

Berikut ini tipe field pada Flask-WTF:

Tipe Field

Deskripsi

BooleanField

True dan False

DateField

Text Field untuk datetime.date

DateTimeField

Text Field untuk datetime.datetime

DecimalField

Text Field untuk decimal.Decimal

FileField

Untuk upload file

HiddenField

Hidden text field

MultipleFileField

Untuk upload banyak file

FieldList

List untuk field

FloatField

Text Field untuk float

FormField

Form embedded sebagai field

IntegerField

Text Field untuk integer

PasswordField

Text Field untuk password

RadioField

List radio button

SelectField

Dropdown list

SelectMultipleField

Dropdown list untuk memilih lebih dari 1

SubmitField

Button submit

StringField

Text Field untuk string

TextAreaField

Text Area

Dan tipe-tipe data untuk wtforms.validators:

Validator

Deskripsi

DataRequired

Field tidak boleh kosong

Email

Validasi email address

EqualTo

Membandingkan nilai dari dua field

InputRequired

Field tidak boleh kosong

IPAddress

Validasi untuk IPv4 network address

Length

Validasi panjang karakter

MacAddress

Validasi MacAddress

NumberRange

Validasi panjang panjang numeric

Optional

Memberikan nilai kosong pada field

Regexp

Memvalidasi input terhadap ekspresi reguler

URL

Validasi URL

UUID

Validasi UUID

AnyOf

Memvalidasi bahwa input adalah salah satu dari daftar nilai yang mungkin

NoneOf

Memvalidasi bahwa input adalah tidak ada dari daftar nilai yang mungkin

Rendering HTML Form

Form yang sudah kamu buat pada app.py bisa kamu gunakan di template kamu dengan cara:

Kode di atas kamu tambahan class buat bootstrap dan tambahkan kode tersebut ke index.html sehingga seperti di bawah ini:

Karna di index.html kita menggunakan form dengan method POST tentunya kita juga akan menambahkan method pada route index dan juga paramater form untuk di panggil pada index.html

Cobalah akses http://127.0.0.1:5000

http://127.0.0.1:5000

Form Handling di Fungsi Views Dan Menggunakan Redirect

Pada sesi ini kamu akan mempelajari bagaimana melempar nilai dari form melalui route, ubah kode kamu menjadi seperti ini:

Penjelasan: Kamu tambahkan methods GET dan POST agar data yang kita inputkan pada form bisa di ambil dan di post pada variabel nama. form.validate_on_submit() berfungsi untuk memvalidasi dari isi formnya, kosong atau tidak. Return redirect berfungsi ketika form berhasil di isi halamannya akan langsung ke redirect ke route user dengan membawa variabel nama.

Lalu coba jalankan http://127.0.0.1:5000/

Redirect ke halaman beranda setelah mengisi nama di form

Pesan Flashing

Pesan flashing disini berfungsi untuk ketika kamu berhasil menginputkan value dengan benar maka akan memberikan pesan ke sisi client (template). Caranya penggunaanya seperti ini:

Dan tambahkan flash message pada bagian client, caranya tambahkan kode ini pada base.html di bawah {% include 'navbar.html' %} dan di atas {% block content %}:

User Sessions

Sebelum menggunakan session sebaiknya kamu mengetahui apa itu session. Session hampir mirip dengan cookie, perbedaannya yaitu jika cookie disimpan di browser namun session disimpan di sisi server, serta data session yang disimpan akan hilang apabila user telah meninggalkan server tersebut (tutup browser). Jadi session dapat diartikan tempat menyimpan data yang disimpan didalam server, yang data tersebut akan hilang apabila user telah meninggalkan server, atau dalam konteks ini user telah menutup browser. Karena data session disimpan pada server maka session lebih aman untuk menyimpan data-data penting bila dibandingkan dengan cookie, cara menggunakannya sebagai berikut:

Ubahlah kode app.py kamu hingga seperti ini:

Ubahlah kode index.html sebagai berikut:

Memberikan kondisi ke template kamu karena ketika session name tidak lagi tersimpan di sisi server, maka link yang di dalam kondisi tidak dijalankan. Dan ketika kamu menginputkan nama kamu. Secara otomatis nilai dari form name akan tersimpan di session.

Akseslah halaman http://127.0.0.1:5000/user/David untuk melihat perubahannya.

http://127.0.0.1:5000/user/David

Last updated

Was this helpful?