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:
├── env/
| └── .....
├── templates/
| └── user.html
├── app.py
Dan buatlah kode seperti ini di dalam file user.html:
<h1>Hello, {{ name }}</h1>
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.
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:
<h1>Hello, {{ name | capitalize }}</h1>
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:
# templates/base.html
<html>
<head>
<title>{% block title %}{% endblock %} - My App</title>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
sehingga struktur direktori kamu menjadi seperti ini:
├── env/
| └── .....
├── templates/
| └── base.html
| └── user.html
├── app.py
Di jinja2 juga kita bisa melakukan beberapa kontrol struktur seperti contoh kecilnya:
{% if name %}
<h1>Hello, {{ name }}</h1>
{% endif %}
Kemudian ubahlah di code kamu di bagian user.html
menjadi seperti di bawah:
# templates/user.html
{% extends 'base.html' %}
{% block title %}Index{% endblock %}
{% block content %}
{% if name %}
<h1>Hello, {{ name }}</h1>
{% endif %}
{% endblock %}
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
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 CDN CSS di bawah tag head pada
base.html
sehingga menjadi seperti ini
# templates/base.html
<!DOCTYPE html>
<head>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<title>{% block title %}{% endblock %} - My App</title>
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>
Copy dan Paste juga CDN JS di atas
</body>
padabase.html
sehingga kode lengkapnya seperti ini
# templates/base.html
<!DOCTYPE html>
<head>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<title>{% block title %}{% endblock %} - My App</title>
</head>
<body>
{% block content %}{% endblock %}
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
</body>
</html>
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:
├── env/
| └── .....
├── templates/
| └── base.html
| └── navbar.html
| └── user.html
├── app.py
Lalu tambahkan kode berikut ini pada navbar.html
:
# templates/navbar.html
<nav class="navbar navbar-light bg-light">
<a class="navbar-brand" href="#">Navbar</a>
</nav>
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:
# templates/base.html
...
<body>
{% include 'navbar.html' %}
...
Kemudian kamu ubah:
...
{% if name %}
<h1>Hello, {{ name }}</h1>
{% endif %}
...
yang ada di bawah {% block content %}
pada user.html
menjadi:
# templates/user.html
...
<div class="jumbotron jumbotron-fluid">
<div class="container">
<h1 class="display-4">Hello, {{ name }}</h1>
</div>
</div>
...
Sekarang kamu restart web browser kamu dan lihat perubahannya.
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.
# app.py
from flask import Flask, render_template
...
@app.errorhandler(403)
def page_not_found(e):
return render_template('403.html'), 403
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
@app.errorhandler(500)
def internal_server_error(e)
return render_template('500.html'), 500
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:
├── env/
| └── .....
├── templates/
| └── 403.html
| └── 404.html
| └── 500.html
| └── base.html
| └── navbar.html
| └── user.html
├── app.py
Status Kode 403
# templates/403.html
{% extends 'base.html' %}
{% block title %}403 Forbidden{% endblock %}
{% block content %}
<div class="jumbotron jumbotron-fluid">
<div class="container">
<h1 class="display-4">403 Forbidden</h1>
</div>
</div>
{% endblock %}
Status Kode 404
# templates/404.html
{% extends 'base.html' %}
{% block title %}404 Page Not Found{% endblock %}
{% block content %}
<div class="jumbotron jumbotron-fluid">
<div class="container">
<h1 class="display-4">404 Page Not Found</h1>
</div>
</div>
{% endblock %}
Status Kode 500
# templates/500.html
{% extends 'base.html' %}
{% block title %}500 Internal Server Error{% endblock %}
{% block content %}
<div class="jumbotron jumbotron-fluid">
<div class="container">
<h1 class="display-4">500 Internal Server Error</h1>
</div>
</div>
{% endblock %}
Error pages ini akan terbaca ketika kamu merubah debug=False
nanti ketika mengakses halaman yang salah, akan muncul custome page 404.html
dan seterusnya.