Django Web Framework Mengenal URL
Django Web Framework Mengenal URL

Daftar Isi

 

URL yang merupakan singkatan dari Uniform Resource Localator, merupakan bagian penting dari webiste. Ini adalah cara pengunjung untuk memasuki halaman web yang kita miliki. Sebuah URL yang clean, akan membantu pengunjung untuk lebih mudah mengingat halaman yang telah mereka kunjungi. Dan juga faktor penting lainnya dalam hal Search Engine Optimation. Dengan skema URL yang baik juga menjadi cerminan suatu website yang elegan. Pada Django Web Framework, kita dapat membuat desain URL sesuai dengan yang diinginkan, tanpa ada batasan dari kerangka kerja.

Request

Seperti yang sudah saya tulis di atas bahwa, URL merupakan pintu masuk pengunjung ke dalam halaman website kita. Dan ini juga merupakan bagian penting, yang harus ada. Pada web framework Django, untuk mengelola URL itu ditangani oleh sebuah file urls.py. Suatu desain URL semuanya ada di dalam file urls.py ini. Di dalam file ini, kita membuat module python dengan nama tidak resmi yaitu URLConf atau URL Configuration.

Django dalam memproses suatu request bisa diilustrasikan pada gambar berikut ini.

url django web framework

Bisa dilihat. Seorang pengunjung, mengakes halaman tertentu. Lalu Django akan mengakses file urls.py dan mencari pola URL yang sama atau yang cocok pada urlpatterns. Ketika telah menemukan pola yang cocok, maka dilanjutkan untuk mengambil views untuk meminta halaman yang dimaksud. Ketika suatu pola URL yang diminta tidak ditemukan atau menemukan exception, maka Django akan memanggil error-handling view yakni untuk menangani halaman error yang diantaranya ada handler400, handler403. handler404, dan handler500.

Membuat URL

Untuk URLConf, Django memiliki 3 Function yang bisa digunakan yaitu path(), re_path(), dan include(). Dalam penulisan URLConf, penulisannya seperti ini:

  1. Untuk path() path(route, view, kwargs=None, name=None)
  2. Untuk re_path() re_path(route, view, kwargs=None, name=None), masih sama seperti path() kecuali pada functionnya.
  3. Dan include() ini memiliki 3 cara menggunakannya yaitu
    • include(module, namespace=None)
    • include(pattern_list)
    • include((pattern_list, app_namespace), namespace=None)

Ok, ya kita belajar dulu untuk yang path() dan re_path(), setelah itu yang include(). Umumnya membuat URL di Django bisa ditulis seperti ini

from django.urls import include, path, re_path
from app import views

urlpatterns = [
    path('url/menuju-halaman-tertentu/', views.bio.as_view()),
    re_path(r'^url/$', views.article),
    path('', views.section),
    path('weblog/', include('blog.urls')),
    ...
]
  1. Pertama kita akan mengimport function yang dibutuhkan, tidak harus ketiganya. Cukup yang akan digunakan saja. from django.urls import include, path, re_path
  2. Lalu ada sebuah list bernama urlpatterns = [...], di dalam list ini kita akan menyimpan konfigurasi url website. Misalkan saya ambil satu contoh path('url/menuju-halaman-tertentu/', views.bio.as_view()), disini saya menggunakan path() dan bagian route saya ini dengan urlnya yaitu 'url/menuju-halaman-tertentu/'.
  3. Baca juga : Tipe Data Python dan Variabel dan Tipe Data
  4. Pada argumen view, dalam penulisannya ada dua cara sesuai dengan type views yang digunakan. Seperti yang kita ketahui bahwa Django ada type Function Based Views dan Class Based Views. Untuk yang bertype Function Based, cara penulisannya seperti ini views.article, views> adalah views yang diimport, lalu article adalah nama function yang ada di file views.py.

    Dan untuk view yang menggunakan Class Based cara menulisnya seperti ini views.bio.as_view(), views ini juga sama, adalah views yang diimport, dan bio adalah nama class yang ada di file models.py dan as_view() adalah class method.

    Dalam contoh di atas, saya tidak menggunakan kwargs dan juga name

  5. Untuk penggunaan re_path() parameternya sama seperti path(), yang berbeda adalah pada route, di re_path() menggunakan regular_expression untuk membuat pathnya seperti re_path(r'^articles/(?P[0-9]{4})/$', views.year_archive).

Path Converter

Pada route (yang dicetak tebal)dari path('route', view, kwargs=None, name=None) ini adalah bagian untuk menangkap bagian dari url, route harus berupa string dan string ini juga memungkinkan untuk menggunakan kurung sudut seperti ini < >. Tanda < > kurung sudut ini digunakan untuk membuat url dengan spesifikasi tertentu. Dalam membuat route url, Django sudah menyiapkan 2 desain URL yaitu Path Converter dan Reqular Expression. Path converter ini desain yang langsung pakai, yaitu ada :

  • str: String apapun, tidak termasuk slash (/)
  • int: bilangan bulat
  • slug: string yang terdiri dari huruf dan angka dengan tanda hubung dash (-)
  • uuid: menggunakan format uuid
  • path: string seperti str dan ini termasuk dengan tanda pemisah (/) slash.

Dan pada regular expressions, ini digunakan pada saat syntax dari path converter tidak dapat memenuhi kebutuhan untuk membuat pola url seperti yang diinginkan.

Dan cara menggunakan path converter adalah

# pada path() dengan path converter
path('articles/<int:year>/<int:month>/', views.month_archive)

# pada re_path dengan reqular expressions
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive)

include()

Pada include, yang sudah diketahui adalah memiliki 3 parameter penggunaannya. Yaitu seperti ini

  • include(module, namespace=None)
  • include(pattern_list)
  • include((pattern_list, app_namespace), namespace=None)

Ok, kita coba satu persatu

include(module, namespace=None)

Parameter pertama, ini adalah penggunaan include secara umum. Artinya, hampir semua pengguna django menggunakan pola include() seperti ini. Dan include() ini adalah untuk mengimport sercara full sebuah URLConf dari file lain yang berada pada app lain. Pada module disini kita akan menentukan module atau nama app serta file urls.py yang akan diambil.

Sebagai contoh

path('contact/', include('contact.urls')),

Lihat pada bagian ... include('contact.urls') ..., yang ini menandakan bahwa saya sedang mengimport filer urls.py dari app bernama contact. Yes, contact adalah nama app yang ada di dalam project django, sedangkan urls adalah nama file urls.py.

include(pattern_list)

Prameter include() yang kedua, langsung saja kita lihat cara menggunakannya

from django.urls import include, path

from credit import views as credit_views

extra_patterns = [
    path('reports/', credit_views.report),
    path('reports/<int:id>/', credit_views.report),
    path('charge/', credit_views.charge),
]
urlpatterns = [
    path('credit/', include(extra_patterns)),
]

URLConf yang saya buat di atas ini, selain mengimport include dan path, saya juga mengimport views yang dibuat alias menjadi credit_views dari app bernama credit. Dan pada urlpatterns di include saya menggunakan extra_pattenrs yang berupa list untuk menentukan url route selanjutnya.

include((pattern_list, app_namespace), namespace=None)

from django.urls import include, path
from . import views

urlpatterns = [
    path('<page_slug>-<page_id>/', include([
        path('history/', views.history),
        path('edit/', views.edit),
        path('discuss/', views.discuss),
        path('permissions/', views.permissions),
    ])),
]

Cara lain menggunakan include() bisa juga seperti itu.

URL Namespaces

from django.urls import include, path
from . import views

blog_patterns = ([
    path('', views.IndexView, name='index'),
    path('<int:pk>/', views.DetailView.as_view(), name='detail'),
], 'blog')

urlpatterns = [
    path('blog/', include(blog_patterns)),
]

Pada contoh di atas, saya sudah menggunakan name=' ', yaitu detail dan index sebagai nama dari url tersebut. Yang nanti akan digunakan dalam membuat link dihalaman web.

Untuk membuat suatu link pada halaman web, di Django telah ada cara yang lebih mudah digunakan yaitu dengan memberikan nama URL. Umumnya, membuat link pada halaman HTML adalah dengan seperti ini:

<a href="link/menuju-halaman-lain">Artikel</a>

Di Django juga bisa menggunakan yang seperti itu, tapi itu memiliki kelemahan dalam penggunaannya. Apabila suatu saat, kita mengubah route, maka harus mengubah link tag juga. Tapi dengan menggunakan url name seperti berikut:

<a href="{% url 'name' %}">Anchor</a>

Maka apabila suatu saat kita mengubah route, maka pada tag href tidak diperlukan lagi untuk mengubahnya. Secara otomatis akan mengikuti url sesuai dengan name yang digunakan. Jadi berdasarkan contoh di atas, untuk membuat link pada halaman web adalah seperti ini:

<a href="{% url 'index' %}">Home</a>

<a href="{% url 'detail' %}">Artikel Detail</a>

KWARGS

kwargs pada path digunakan untuk argumen tambahan yang akan diteruskan ke views atau method view. Yang cara penggunaannya seperti berikut ini:

<a href="{% url 'detail' kwargs=item.list %}">Link Tertentu</a>

Pada kwargs, argumen ini diambil dari route yang route mengcapture dari url, dan item.list bisa berupa filter queryset untuk mengambil data tertentu dari database.

Akhir Kata

Okey, ternyata configurasi URL pada Web Framework Django memiliki banyak parameter yang memudahkan untuk mendesain URL sesuai dengan yang diinginkan.

Disini kita bisa memilih untuk menggunakan mana yang lebih efektif dalam penerapannya, dan benar saja tidak ada batasan dalam penggunaannya.

Sampaikan saran atau apapun pada komentar agar dapat kita diskusikan bersama. Karena memang ada yang belum dibahas dalam tulisan ini.