Featured image of post Konfigurasi Setting Awal Django

Konfigurasi Setting Awal Django

Gambaran tentang virtual environment management di Python, alasan pentingnya menggunakan virtual environment, cara membuat dan menggunakan .venv, serta fungsi requirements.txt untuk memastikan project yang dibuat dapat direproduksi di server berbeda.

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:

ClassCara Kerja
PageNumberPagination?page=2 — paling familiar buat user
LimitOffsetPagination?limit=10&offset=20 — fleksibel, populer di frontend
CursorPaginationMenggunakan 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:

1
2
3
4
5
REST_FRAMEWORK = {
    # ...
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
}

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:

ClassMekanisme
SessionAuthenticationDjango session cookie (browser-based)
BasicAuthenticationHeader Authorization: Basic base64(user:pass), hanya untuk testing
TokenAuthenticationHeader Authorization: Token abc123, simple API tokens
JWTAuthenticationBearer JWT tokens — perlu djangorestframework-simplejwt
1
2
3
4
5
6
7
REST_FRAMEWORK = {
    # ...
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ],
}

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:

ClassBehaviour
AllowAnySemua memiliki akses, tidak ada batasan
IsAuthenticatedHarus user yang sudah login
IsAdminUserUntuk pengguna dengan akses is_staff=True
IsAuthenticatedOrReadOnlyUser yang login bisa write, tapi siapapun pun bisa read
1
2
3
4
5
6
REST_FRAMEWORK = {
    # ...
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    ],
}

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
REST_FRAMEWORK = {
    # Output/Input format
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',  # remove in production
    ],
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
    ],

    # Pagination
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,

    # Who is making the request?
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ],

    # Are they allowed?
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    ],
}

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:

1
2
class PublicBookListView(generics.ListAPIView):
    permission_classes = [AllowAny]  # overrides global default for this view only

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

Dibawah Lisensi CC BY-NC-SA 4.0
Dibangun dengan Hugo
Tema Stack dirancang oleh Jimmy