Idenya
Setiap kali kamu membuka halaman web, dua program melakukan percakapan singkat. Browser kamu (client) mengirim request: "tolong berikan /products". Program server menerimanya, memutuskan apa yang akan dikirim balik, lalu membalas dengan response: "ini halamannya, status OK". Itulah seluruh web, diulang miliaran kali setiap hari.
Web framework seperti Flask adalah kode yang menangani bagian percakapan yang membosankan dan rawan kesalahan, sehingga kamu cukup menulis bagian yang menarik: dengan request ini, apa response-nya?
Sebuah restoran. Pelanggan (browser) menyerahkan kertas pesanan (request) ke pelayan. Dapur (kode kamu) menyiapkan hidangannya. Pelayan membawa kembali piringnya dengan catatan "semua beres" atau "maaf, habis" (response dengan status). Flask adalah pelayannya: ia menerima pesanan dalam format standar, meneruskan tiap pesanan ke koki yang tepat, dan mengantarkan hasilnya dengan benar.
Request
Saat kamu mengunjungi https://tokokita.id/products?category=Coffee, browser mengirim request yang bentuknya seperti ini (isinya cuma teks):
GET /products?category=Coffee HTTP/1.1
Host: tokokita.id
User-Agent: Mozilla/5.0 ...
Accept: text/html
| Bagian | Di sini | Arti |
|---|---|---|
| method | GET | apa yang dilakukan: GET membaca, POST mengirim data (formulir, pesanan) |
| path | /products | resource yang mana |
| query string | category=Coffee | parameter tambahan setelah ?, berupa pasangan key=value yang digabung dengan & |
| headers | Host, User-Agent, Accept | metadata tentang request |
| body | (kosong untuk GET) | data yang dikirim bersama request POST, seperti isian formulir atau JSON |
Python bisa membongkar URL dengan cara yang sama seperti server:
from urllib.parse import urlsplit, parse_qs
url = "https://tokokita.id/products?category=Coffee&sort=price"
parts = urlsplit(url)
print(parts.scheme, parts.netloc, parts.path)
print(parse_qs(parts.query))
https tokokita.id /products
{'category': ['Coffee'], 'sort': ['price']}
Response
Server menjawab dengan status line, headers, dan body:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1534
<!doctype html><html>... the page ...</html>
Status code adalah ringkasan tiga digit tentang apa yang terjadi. Digit pertama menunjukkan kelompoknya:
| Kode | Kelompok | Contoh umum |
|---|---|---|
| 2xx | sukses | 200 OK, 201 Created |
| 3xx | pergi ke tempat lain | 301 Moved Permanently, 302 Found (redirect) |
| 4xx | client yang salah | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found |
| 5xx | server yang gagal | 500 Internal Server Error, 503 Service Unavailable |
Header Content-Type memberi tahu browser cara memperlakukan body: text/html ditampilkan sebagai halaman, application/json adalah data, text/csv biasanya diunduh.
Server adalah sebuah fungsi
Kalau urusan jaringan dikesampingkan, aplikasi web hanyalah satu ide: fungsi dari request ke response. Ini versi mainannya dalam Python biasa:
def handle(request):
"""A tiny web app: request dict in, response dict out."""
if request["method"] != "GET":
return {"status": 405, "body": "Method not allowed"}
if request["path"] == "/":
return {"status": 200, "body": "Selamat datang di Toko Kita!"}
if request["path"] == "/products":
return {"status": 200, "body": "15 products"}
return {"status": 404, "body": "Not found"}
print(handle({"method": "GET", "path": "/products"}))
print(handle({"method": "GET", "path": "/careers"}))
print(handle({"method": "DELETE", "path": "/"}))
{'status': 200, 'body': '15 products'}
{'status': 404, 'body': 'Not found'}
{'status': 405, 'body': 'Method not allowed'}
Rantai if seperti itu masih bisa untuk tiga halaman. Untuk aplikasi sungguhan, cara ini cepat berantakan, dan mengabaikan semua hal yang wajib ditangani server sungguhan.
Apa yang dikerjakan framework untukmu
| Pekerjaan | Tanpa framework | Dengan Flask |
|---|---|---|
| Berbicara HTTP: mengurai teks request, menulis response dengan header yang benar | kamu sendiri, dengan hati-hati | sudah beres |
Routing: memetakan path seperti /products/42 ke fungsi yang tepat | rantai if raksasa | @app.route("/products/<int:id>") |
| Membaca query string, formulir, JSON, cookie, file yang diunggah | parsing manual | request.args, request.form, request.json |
| Membangun HTML dari data dengan aman | penggabungan string (dan celah keamanan) | template Jinja2 dengan auto-escaping |
| Error: 404, 500, debugging | tulis semuanya sendiri | sudah tersedia, bisa diubah |
| Testing tanpa browser | sulit | app.test_client() |
Flask adalah micro-framework: ia mengerjakan tugas-tugas inti ini dan tidak ikut campur untuk sisanya (database, login, halaman admin datang dari extension yang kamu pilih). Django, framework Python besar lainnya, menyertakan jauh lebih banyak fitur bawaan. FastAPI berfokus pada JSON API. Ide request/response di track ini berlaku untuk semuanya.
Posisi Flask
Saat seseorang membuka sebuah halaman di situs Toko Kita, ada rangkaian program yang meneruskan request-nya sampai kodemu menjawabnya. Ada baiknya kamu membayangkan rangkaian itu sekali, karena pesan error dan panduan deployment menyebut setiap bagiannya:
browser ──HTTP──▶ web server (gunicorn / Flask's dev server) ──▶ your Flask app ──▶ your functions
◀──────────────────────── response ◀────────────────────────────────────────┘
Web server menangani koneksi jaringan dan meneruskan setiap request ke aplikasi Flask kamu menggunakan standar Python bernama WSGI. Aplikasimu meneruskannya ke salah satu fungsimu dan mengubah nilai kembaliannya menjadi response. Saat development, flask run memberimu server bawaan yang kecil. Di production, server yang tangguh seperti gunicorn menggantikannya. Kodemu tidak berubah.
Mengapa ini penting untuk kode yang bersih
"Aplikasi web adalah fungsi dari request ke response" adalah model mental paling berguna yang akan kamu bawa dari track ini. Artinya setiap halaman atau endpoint API bisa berupa fungsi kecil dengan input yang jelas (request) dan output yang jelas (response). Kode seperti itulah yang mudah dibaca, dites, dan diubah. Ketika aplikasi Flask jadi berantakan, biasanya karena view berhenti menjadi fungsi kecil dan mulai mengerjakan segalanya.
Rangkuman
- Browser mengirim request (method, path, query string, headers, body); server mengirim response (status code, headers, body).
GETmembaca,POSTmengirim data. 2xx sukses, 3xx redirect, 4xx error di client, 5xx error di server.Content-Typemenyatakan jenis body: HTML, JSON, CSV...- Aplikasi web adalah fungsi dari request ke response; framework menangani HTTP, routing, parsing input, template, error, dan testing.
- Flask adalah micro-framework; server WSGI (gunicorn) menjalankannya di production.