DataLens

Apa yang dikerjakan web framework; request/response

Pahami apa yang sebenarnya terjadi saat browser memuat halaman, bagian-bagian HTTP request dan response, serta pekerjaan apa saja yang diambil alih framework seperti Flask darimu.

Level: Dasar · 8 menit baca

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

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?

Analogi

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
BagianDi siniArti
methodGETapa yang dilakukan: GET membaca, POST mengirim data (formulir, pesanan)
path/productsresource yang mana
query stringcategory=Coffeeparameter tambahan setelah ?, berupa pasangan key=value yang digabung dengan &
headersHost, User-Agent, Acceptmetadata 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:

KodeKelompokContoh umum
2xxsukses200 OK, 201 Created
3xxpergi ke tempat lain301 Moved Permanently, 302 Found (redirect)
4xxclient yang salah400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found
5xxserver yang gagal500 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

PekerjaanTanpa frameworkDengan Flask
Berbicara HTTP: mengurai teks request, menulis response dengan header yang benarkamu sendiri, dengan hati-hatisudah beres
Routing: memetakan path seperti /products/42 ke fungsi yang tepatrantai if raksasa@app.route("/products/<int:id>")
Membaca query string, formulir, JSON, cookie, file yang diunggahparsing manualrequest.args, request.form, request.json
Membangun HTML dari data dengan amanpenggabungan string (dan celah keamanan)template Jinja2 dengan auto-escaping
Error: 404, 500, debuggingtulis semuanya sendirisudah tersedia, bisa diubah
Testing tanpa browsersulitapp.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

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

Berikutnya: Aplikasi Flask pertamamu dan route →