4 min read

Catatan Belajar Django PART 3: URLS dan VIEWS

Tulisan ini akan membahas dua hal:

  1. Views
  2. Urls

Views sebagaimana yang saya singgung di awal-awal seri ini mempunyai fungsi untuk menyimpan “logic” pemograman yang akan kita buat, tapi bagaimana caranya agar tahu bahwa fungsi yang di views itu yang dieksekusinya? Jawabannya adalah urls

Urls di django berperan sebagai routes ( di framework seperti laravel misalnya dinamakan routes), fungsi adalah menunjukan dari sebuah alamat ke representatif fungsinya.

Misal kita punya alamat web dengan seperti berikut

blog.arsmp.com/ –> root web
blog.arsmp.com/category/ -> masuk ke halaman kategori
blog.arsmp.com/category/komputer/ –> masuk ke halaman kategori komputer

Dariman web kita tahu menampilkan output yang sesuai dengan alamatnya?
kalau dijelaskan secara over simplified seperti ini

 

if path “/” then load function root_web()
else if path “/category/” then load function categoery_web()
else if path “/category/komputer” then load function category_web(“komputer”)

Itu penyederhanaa sekali sebenarnya,  isi dari urls django tentu tidak seperti itu, tapi fungsi dari urls pada dasarnya seperti itu.

Konfigurasi

Di django konfigurasi urls ada di bagian utama, di contoh django projek yang dibuat di tulisan sebelumnya berarti ada di `cms/urls.py` dan isi defaultnya seperti ini

from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]

Perhatikan di atas, ada path admin, yang artinya saat kita menulis `website-saya.com/admin/` maka akan diarahakan ke fungsi `admin.site.urls`

Misal kalau kita ubah menjadi

urlpatterns = [
    path('admin-custom/', admin.site.urls),
]

Maka yang terjadi adalah
saat mengunjungi `admin/`
admin 404
saat mengunjungi `admin-custom/`
admin custom

Views

Kode di atas adalah kode default yang diberi django, mari buat views di app yang dibutuhkan, dengan projek yang sama buka `blog/views.py` lalu isikan sebagai berikut

from django.http import HttpResponse


def hello_world(request):
    return HttpResponse("Hello world")

Terus kita buat berkas `urls.py` di dalam app blog. Dan isikan sebagai berikut

rom django.urls import path

from . import views

urlpatterns = [path("", views.hello_world)]

Lalu daftar “blog/urls.py” ke dalam “cms/urls.py

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path("admin/", admin.site.urls),
    path("front/", include("blog.urls")),
]

Lalu sat kita mengujungi `localhost:8000/front/` akan menampilkan

hello world

HTTP METHOD

Jika diperhatikan di sana hanya setup function dan mendaftarkan di url, tapi dalam web beberapa hal tergantung http method, misalnya seperti ini kita punya alamat `localhost:8000/front/`
saat GET: Tampilkan hello word
saat POST: “Insert hello world”

Untuk informasi tentang fungsi http method: https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods

Untuk mengecek http method di views bisa gunakan seperti ini

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt


@csrf_exempt
def hello_world(request):
    if request.method == "GET":
        return HttpResponse("Hello world")
    elif request.method == "POST":
        return HttpResponse("Insert Hello world")
    elif request.method == "PUT":
        return HttpResponse("Update Hello world")
    elif request.method == "DELETE":
        return HttpResponse("Delete Hello world")

Di atas saya menggunakan decorator csrf untuk ignore csrf validation khusu untuk tes tulisan ini, untuk tahu lebih detail terkait csrf validation https://www.synopsys.com/glossary/what-is-csrf.html

get dan post

Di kode di atas kita melakukan pengecekan http method, untuk validasi misal fungsi ini hanya nerima method post dan get saja, maka gunakan decorator `require_http_methods`

rom django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods


@csrf_exempt
@require_http_methods(["GET", "POST"])
def hello_world(request):
    if request.method == "GET":
        return HttpResponse("Hello world")
    else:
        return HttpResponse("Insert Hello world")

Kode di atas artinya fungsi tersebut hanya menerima method get dan post, selain dari itu akan kena response 405 method not allowed

method put not allowed

Dynamic Segment

Seperti contoh di atas, kita bisa mengatur segment yang bersifat dinamis, misalnya

`localhost:8000/front/<parameter>/`, maka di `blog/urls.py` kita tambahkan seperti ini

from django.urls import path

from . import views

urlpatterns = [
    path("", views.hello_world),
    path("<str:name>", views.hello_segment),
]

Type segment yang umumnya digunakan

<int:….>: tipe data integer
<str:…>: tipe data string
<slug:…>: tipe data slug seperti ini-sebuah-slug
<uuid:…>: tipe data dari uuid instance

Lalu di viewsnya seperti berikut

@require_http_methods(["GET"])
def hello_segment(request, name):
    return HttpResponse(f"Hallo {name}")

Hasilnya

segment

Untuk pengenalan views dan url cukup sampai di sini, tulisan selanjutnya akan membahas template.