Flask Routing: URL, Request, dan Response

Python By TryzTech Team
FlaskPythonBackendWeb Development
Bagikan

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. /products cocok untuk koleksi produk, sedangkan /products/10 cocok untuk satu produk tertentu.
  • Query string memberi pilihan tambahan. URL /products?q=keyboard masih meminta daftar produk, tetapi hasilnya difilter dengan kata kunci keyboard.
  • HTTP method menjelaskan tindakan. GET membaca data, POST membuat data, PUT atau PATCH memperbarui, dan DELETE menghapus.

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 GET untuk 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 200 untuk 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.

Lanjutkan membaca topik yang masih satu konteks.

Jangan Ketinggalan Info Terbaru

Dapatkan artikel teknologi, tips, dan insights menarik langsung ke email Kamu.