Struktur Project Flask: Blueprint, Template, dan Config
Satu file app.py terasa praktis selama isinya baru beberapa route. Masalahnya muncul pelan-pelan: route halaman bercampur dengan login, config, model, dan endpoint API. File yang tadinya mudah dipahami akhirnya harus di-scroll panjang hanya untuk mencari satu function.
Blueprint membantu mengelompokkan route berdasarkan bagian aplikasi. Ia bukan aplikasi Flask kedua dan tidak berjalan sendiri. Blueprint hanya mengumpulkan route, lalu didaftarkan ke object aplikasi utama.
Struktur Kecil yang Masih Mudah Diikuti
Kita akan memisahkan route notes tanpa membuat terlalu banyak layer:
# File: folder-structure.txt
flask-notes/
├── app.py
├── config.py
├── routes/
│ ├── __init__.py
│ └── notes.py
├── templates/
│ └── notes/
│ └── index.html
└── static/
└── css/
└── app.css
File __init__.py boleh kosong. Keberadaannya membuat folder routes terbaca jelas sebagai package Python, sehingga routes.notes dapat di-import.
Buat Blueprint untuk Notes
Semua route yang berhubungan dengan notes ditempatkan di routes/notes.py:
# File: routes/notes.py
from flask import Blueprint, render_template
notes_bp = Blueprint("notes", __name__, url_prefix="/notes")
@notes_bp.get("")
def index():
notes = ["Meeting notes", "Book ideas"]
return render_template("notes/index.html", notes=notes)
Argumen pertama, "notes", adalah nama blueprint. Nama ini menjadi namespace endpoint. Karena function route-nya bernama index, endpoint lengkapnya adalah notes.index. Nama tersebut nanti dipakai di template melalui url_for("notes.index").
url_prefix="/notes" menambahkan awalan yang sama ke semua route di blueprint. Path kosong pada @notes_bp.get("") akhirnya menjadi /notes. Kalau nanti ada route /<int:note_id>, URL lengkapnya menjadi /notes/<int:note_id>.
Rakit Aplikasi lewat create_app()
File utama membuat object Flask dan mendaftarkan blueprint:
# File: app.py
from flask import Flask
from routes.notes import notes_bp
def create_app():
app = Flask(__name__)
app.config.from_object("config.Config")
app.register_blueprint(notes_bp)
return app
Config dasar bisa dipindahkan ke file sendiri:
# File: config.py
class Config:
SECRET_KEY = "dev-secret"
Function create_app() disebut application factory karena ia membuat dan mengembalikan instance aplikasi. Pola ini berguna ketika test membutuhkan config berbeda atau ketika kita ingin membuat lebih dari satu instance app dalam proses yang sama.
Untuk menjalankannya, Flask dapat menemukan factory tersebut secara otomatis:
# File: terminal
python -m flask --app app run --debug
Hubungkan Template ke Endpoint Blueprint
Karena endpoint memiliki namespace notes, link ke halaman notes ditulis seperti ini:
<!-- File: templates/notes/index.html -->
<h1>Notes</h1>
<ul>
{% for note in notes %}
<li>{{ note }}</li>
{% endfor %}
</ul>
<a href="{{ url_for('notes.index') }}">Muat ulang notes</a>
Namespace mencegah bentrok ketika blueprint lain juga memiliki function bernama index. Route auth bisa mempunyai auth.index, sementara notes tetap memakai notes.index.
Jangan Memecah Project Terlalu Dini
Blueprint menyelesaikan masalah pengelompokan route, tetapi bukan berarti setiap function membutuhkan file sendiri. Terlalu banyak folder untuk project kecil justru membuat alurnya sulit diikuti. Pecah kode ketika sudah ada kelompok yang jelas, misalnya notes, auth, dan api.
Waspadai juga circular import. Route boleh meng-import model atau extension, tetapi sebaiknya tidak meng-import object app dari file utama. Extension database nanti dibuat terpisah, lalu dihubungkan melalui init_app() di dalam factory.
Sebagai percobaan, tambahkan routes/auth.py dengan blueprint bernama auth, route /login, dan template sendiri. Setelah mendaftarkannya di create_app(), cek daftar route dengan:
# File: terminal
python -m flask --app app routes
Output command tersebut menunjukkan endpoint, method, dan URL yang sudah terdaftar. Ini cara cepat untuk menemukan blueprint yang lupa didaftarkan atau prefix yang tidak sesuai dugaan.
Artikel Terkait
Lanjutkan membaca topik yang masih satu konteks.
Flask Authentication: Login, Session, dan Logout
Buat authentication Flask dengan password hash, login session, current user, protected route, dan logout tanpa menyimpan password mentah.
Flask CRUD SQLAlchemy: Create, Read, Update, Delete
Bangun CRUD Flask dan SQLAlchemy untuk membuat, membaca, mengubah, serta menghapus note lengkap dengan validasi, form, dan redirect.
Flask SQLAlchemy: Koneksi Database dan Model
Hubungkan Flask ke SQLite dengan Flask-SQLAlchemy, buat model dan tabel, lalu pahami proses add, commit, serta query data.
Flask Static Files: CSS, JavaScript, dan Asset
Atur static files Flask untuk CSS, JavaScript, dan gambar, lalu panggil setiap asset dengan url_for agar path tetap mudah dirawat.