Flask Routing: URL, Request, dan Response
Route menentukan bagian kode mana yang perlu dijalankan untuk sebuah request. URL memang bagian yang paling terlihat, tetapi Flask juga mempertimbangkan HTTP method seperti GET atau POST. Itu sebabnya dua request ke alamat yang sama bisa menghasilkan tindakan berbeda.
Anggap route sebagai kesepakatan antara client dan aplikasi. Ketika client meminta GET /products/10, aplikasi seharusnya tahu bahwa yang dicari adalah produk bernomor 10. Semakin jelas kesepakatan ini, semakin mudah route dipakai, diuji, dan dirawat.
Path, Query String, dan HTTP Method
Ketiga bagian ini punya tugas yang berbeda:
- Path menunjukkan resource yang dituju.
/productscocok untuk koleksi produk, sedangkan/products/10cocok untuk satu produk tertentu. - Query string memberi pilihan tambahan. URL
/products?q=keyboardmasih meminta daftar produk, tetapi hasilnya difilter dengan kata kuncikeyboard. - HTTP method menjelaskan tindakan.
GETmembaca data,POSTmembuat data,PUTatauPATCHmemperbarui, danDELETEmenghapus.
Tidak semua aplikasi harus memakai pola URL yang persis sama. Yang penting, nama resource dan method-nya konsisten sehingga client tidak perlu menebak-nebak.
Membuat Beberapa Route Produk
Contoh berikut memperlihatkan list, detail, dan create dalam satu file:
# File: app.py
from flask import Flask, request
app = Flask(__name__)
@app.get("/products")
def list_products():
keyword = request.args.get("q", "")
return {"keyword": keyword, "items": []}
@app.get("/products/<int:product_id>")
def product_detail(product_id):
return {"id": product_id, "name": "Keyboard"}
@app.post("/products")
def create_product():
return {"message": "Product created"}, 201
Membaca query string
Pada route pertama, request.args berisi query string yang dikirim melalui URL. Method .get("q", "") mengambil nilai q dan memakai string kosong jika parameter itu tidak ada.
Membuka /products menghasilkan keyword kosong. Sementara itu, /products?q=mouse menghasilkan response berikut:
{
"keyword": "mouse",
"items": []
}
Query string selalu datang sebagai teks. Kalau Kamu menerima ?page=2, nilainya masih berupa string "2" sampai dikonversi dan divalidasi.
Membatasi path parameter
Route /products/<int:product_id> mempunyai bagian yang dinamis. Nama product_id otomatis menjadi parameter function, sedangkan converter int meminta Flask menerima angka saja. Request ke /products/12 akan menjalankan product_detail(12), tetapi /products/abc tidak cocok dan berakhir sebagai 404.
Converter membantu menyaring bentuk URL, tetapi belum membuktikan bahwa datanya benar-benar ada. Saat database sudah digunakan, product ID yang valid secara format tetap perlu dicari dan bisa saja menghasilkan 404.
Method dan status code ikut membawa makna
Decorator @app.post("/products") hanya menerima POST. Jika alamat itu dibuka langsung dari browser, browser mengirim GET dan Flask akan membalas 405 Method Not Allowed.
Route create mengembalikan tuple berisi data response dan status 201. Status ini berarti resource baru berhasil dibuat. Untuk request GET yang sukses, Flask memakai 200 secara default.
Mencobanya dari Terminal
Browser praktis untuk GET, sedangkan curl memudahkan kita mengirim method lain:
# File: terminal
curl "http://127.0.0.1:5000/products?q=mouse"
curl "http://127.0.0.1:5000/products/10"
curl -X POST "http://127.0.0.1:5000/products"
Perhatikan log Flask setelah setiap command. Di sana terlihat path, method, dan status code yang dikembalikan.
URL yang Mudah Dirawat
Hindari menaruh semua tindakan di nama URL seperti /create-product atau /delete-product. Bentuk berbasis resource biasanya lebih mudah dibaca: gunakan /products dan biarkan HTTP method menjelaskan tindakannya.
Beberapa kebiasaan lain juga layak dijaga:
- Jangan taruh password, token, atau data sensitif di query string karena URL mudah masuk ke history dan log.
- Jangan gunakan
GETuntuk mengubah atau menghapus data. Link bisa dibuka crawler, diprefetch browser, atau terklik tanpa sengaja. - Bedakan status sukses, data tidak ditemukan, dan input tidak valid. Mengembalikan
200untuk semua keadaan membuat client sulit mengambil keputusan.
Sebagai latihan, tambahkan /categories, /products/<int:product_id>/reviews, dan query ?sort=price. Dari tiga route itu, coba jelaskan mana yang menjadi path, mana yang dinamis, dan mana yang hanya pilihan tambahan. Kalau pembagian itu sudah terasa jelas, routing yang lebih besar akan jauh lebih mudah disusun.
Artikel Terkait
Lanjutkan membaca topik yang masih satu konteks.
Flask Template Jinja: Layout, Variable, dan Loop
Gunakan Jinja template di Flask untuk mengirim data ke HTML, membuat loop dan conditional, serta memakai base layout tanpa mengulang markup.
Flask Tutorial: Setup dan Route Pertama
Pelajari setup Flask dengan virtual environment, install package, buat app.py, dan pahami alur request sampai route pertama tampil di browser.
CRUD Flask dan MySQL: Auth, Testing, dan Caching
Bangun aplikasi CRUD Flask dengan MySQL, authentication, testing, caching, setup environment, dan struktur project siap deploy.
Tutorial Membuat Website Menggunakan Framework Flask
Tutorial untuk membuat aplikasi web menggunakan Flask, sebuah framework web berbasis bahasa Python yang cukup ringan dan mudah digunakan. Flask sangat cocok untuk para pemula yang ingin belajar membuat sebuah aplikasi web.