1.3 Initial Settings Configuration
Dictionary REST_FRAMEWORK
Ini adalah dictionary yang mengontrol semua hal terkait DRF secara global. Bayangkan ini sebagai “default policy” DRF. Kita bisa override default ini per-view atau per-viewset nanti, tapi settings ini yang jadi default jika tidak di-override.
DEFAULT_PAGINATION_CLASS — Mengontrol Bagaimana List Data Dikirimkan
Tanpa pagination, endpoint GET /books/ akan mengirimkan semua baris di database dalam satu response. Hal ini tidak menjadi masalah kalau jumlahnya sedikit seperti 5 buku. Tapi itu akan menjadi masalah jika data yang perlu dikirimkan adalah 500.000 buku.
DRF punya tiga class pagination bawaan:
| Class | Cara Kerja |
|---|---|
PageNumberPagination | ?page=2 — paling familiar buat user |
LimitOffsetPagination | ?limit=10&offset=20 — fleksibel, populer di frontend |
CursorPagination | Menggunakan token opaque cursor – bagus untuk feed real-time |
Konfigurasi pagination dilakukan dengan dua key, satu untuk nama class-nya dan satu lagi untuk ukuran halamannya:
| |
Apa yang terjadi kalau PAGE_SIZE tidak diisi? DRF bakal menampilkan AssertionError saat runtime, karena DEFAULT_PAGINATION_CLASS tanpa PAGE_SIZE tidak ada artinya. Keduanya selalu ada.
Bagaimana kalau DEFAULT_PAGINATION_CLASS tidak terapkan? Semua endpoint akan menampilkan semua record tanpa dibagi per halaman. Ini tidak masalah untuk proses belajar, tapi selalu gunakan pagination jika digunakan untuk project yang serius.
Apa itu DEFAULT_AUTHENTICATION_CLASSES
Authentication adalah: “Siapa yang melakukan request ini?”
Pipeline DRF mencoba class authentication satu per satu sesuai urutan, dan akan stop di yang metode pertama yang berhasil mengidentifikasi user. Identifikasi user tersebut kemudian disematkan pada request.user. Jika pada saat proses authentication tersebut tidak ada yang match, maka request.user menjadi AnonymousUser.
(pipeline adalah serangkaian proses yang dijalankan satu per satu secara berurutan)
Option built-in dari DEFAULT_AUTHENTICATION_CLASSES:
| Class | Mekanisme |
|---|---|
SessionAuthentication | Django session cookie (browser-based) |
BasicAuthentication | Header Authorization: Basic base64(user:pass), hanya untuk testing |
TokenAuthentication | Header Authorization: Token abc123, simple API tokens |
JWTAuthentication | Bearer JWT tokens — perlu djangorestframework-simplejwt |
| |
Konsep penting: Authentication berbeda dengan Permission. Authentication hanya mengidentifikasi siapa user-nya. Apakah user tersebut boleh melakukan sesuatu atau tidak, adalah hal berbeda (permissions akan dijelaskan di bawah). Jadi, request bisa saja sudah ter-authenticate tapi tetap ditolak.
Untuk keperluan belajar: Gunakan SessionAuthentication + BasicAuthentication. Jika sudah membuat project API sungguhan dengan frontend terpisah, kita tinggal ganti ke TokenAuthentication atau JWT.
DEFAULT_PERMISSION_CLASSES adalah izin
Permissions adalah mengenai: “Apakah user ini boleh melakukan aksi ini?”
Permissions dijalankan setelah authentication. Class bawaan yang tersedia secara default:
| Class | Behaviour |
|---|---|
AllowAny | Semua memiliki akses, tidak ada batasan |
IsAuthenticated | Harus user yang sudah login |
IsAdminUser | Untuk pengguna dengan akses is_staff=True |
IsAuthenticatedOrReadOnly | User yang login bisa write, tapi siapapun pun bisa read |
| |
Kenapa class IsAuthenticatedOrReadOnly adalah pilihan default yang tepat untuk keperluan belajar? Kita dengan bebas bisa melakukan GET endpoint di browser atau Postman tanpa perlu login, tapi POST/PUT/DELETE diblokir kecuali kita authenticate. Ini mensimulasikan kondisi sebenarnya tanpa kuatir terkunci saat melakukan eksplorasi.
Kesalahan paling umum: Lupa ganti AllowAny sebelum deploy ke production. Seluruh API-mu jadi bisa ditulis oleh siapa saja. Selalu teliti dan berhati-hati mengenai hal ini.
What Your REST_FRAMEWORK Block Should Look Like When Complete
| |
Hal Yang Perlu Diingat
Authentication vs Permission adalah perbedaan konseptual paling penting di DRF. Keduanya ada pada proses dan langkah yang berbeda. Seorang user bisa saja sudah ter-authenticate (Django tahu siapa mereka) tapi tetap ditolak (mereka tidak punya permission yang dibutuhkan). Jangan salah menafsirkan kedua hal ini.
Global defaults vs per-view overrides. Semua yang ada di REST_FRAMEWORK adalah global default. Kita akan sering override ini di view individual:
| |
Artinya, di app kita sebaiknya set global default ke policy yang paling ketat secara masuk akal, lalu longgarkan per-view sesuai kebutuhan, bukan sebaliknya.
Foto cover oleh anitaaustvika dari Unsplash
