Nama : Kelvin Saputra
NPM : 2206027186
Kelas : PBP F
Link : Concert Ticket Inventory
-
Membuat sebuah proyek Django baru.
-
Membuat aplikasi dengan nama main pada proyek tersebut.
-
Melakukan routing pada proyek agar dapat menjalankan aplikasi main.
-
Membuat model pada aplikasi main dengan nama Item dan memiliki atribut wajib sebagai berikut.
- name sebagai nama item dengan tipe CharField.
- amount sebagai jumlah item dengan tipe IntegerField.
- description sebagai deskripsi item dengan tipe TextField.
-
Membuat sebuah fungsi pada views.py untuk dikembalikan ke dalam sebuah template HTML yang menampilkan nama aplikasi serta nama dan kelas kamu.
-
Membuat sebuah routing pada urls.py aplikasi main untuk memetakan fungsi yang telah dibuat pada views.py
-
Melakukan deployment ke Adaptable terhadap aplikasi yang sudah dibuat sehingga nantinya dapat diakses oleh teman-temanmu melalui Internet.
-
Membuat sebuah README.md yang berisi tautan menuju aplikasi Adaptable yang sudah di-deploy, serta jawaban dari beberapa pertanyaan berikut.
- Jelaskan bagaimana cara kamu mengimplementasikan checklist di atas secara step-by-step (bukan hanya sekadar mengikuti tutorial).
- Buatlah bagan yang berisi request client ke web aplikasi berbasis Django beserta responnya dan jelaskan pada bagan tersebut kaitan antara urls.py, views.py, models.py, dan berkas html.
- Jelaskan mengapa kita menggunakan virtual environment? Apakah kita tetap dapat membuat aplikasi web berbasis Django tanpa menggunakan virtual environment?
- Jelaskan apakah itu MVC, MVT, MVVM dan perbedaan dari ketiganya.
- Buatlah direktori untuk proyek concert_ticket_inventory.
- Bukalah terminal lalu Pada terminal, masuk ke dalam folder yang telah dibuat menggunakan perintah
cd <nama_directory>
(change directory). dalam kasus ini direktori saya adalahconcert_ticket_inventory
- Selanjutnya buatlah repositori git kosong pada direktori yang digunakan sebagai proyek dengan menuliskan
git init
. - Lakukan konfigurasi username dan email agar terhubung dengan commit yang dilakukan.
- Pada direktori lokal yang dibuat sebelumnya, saya membuat virtual environment dengan menggunakan terminal lalu menuliskan
python -m venv env
yang bertujuan agar tools yang digunakan pada project ini terisolasi. Sehingga ketika kita melakukan perubahan versi pada tools sewaktu-waktu, project tidak akan mengalami masalah. - Dengan menggunakan terminal, masuk ke dalam virtual environment dengan menggunakan perintah
env\Scripts\activate.bat
pada windows. - Buatlah file
requirements.txt
yang berisikan tools yang akan digunakan dalam project ini termasuk django. - Lakukan instalasi pada seluruh library yang terdaftar dalam
requirements.txt
dengan menggunakan perintahpip install -r requirements.txt
- Setelah django berhasil terinstall, buatlah project baru yang diinginkan dengan menggunakan perintah
django-admin startproject <nama_project> .
dalam kasus ini nama project saya adalahconcert_ticket_inventory
. tanda titik pada perintah tersebut bertujuan agar project dibuat tanpa membuat direktori baru. - Setelah proyek terbentuk, ubah perizinan yang ada pada
settings.py
dengan menambahkan syntax
...
ALLOWED_HOSTS = ["*"]
...
hal ini memungkinkan project yang kita buat dapat diakses oleh banyak device atau IP.
- Setelah itu, saya mencoba menjalankan project django pada localhost dengan menggunakan perintah
python manage.py runserver
selanjutnya buka link berikut http://localhost:8000 jika sudah terlihat animasi roket, maka project dapat berjalan. - Selanjutnya buatlah file dengan nama
.gitignore
yang bertujuan agar file-file yang terdaftar pada.gitignore
tidak ikut di push ke repositori github.
- Setelah selesai membuat project, masuk ke dalam virtual environment kembali, lalu buatlah app dengan nama
main
dengan menggunakan perintahpython manage.py startapp main
- Setelah membuat aplikasi
main
, agar dapat dijalankan pada level project, perlu dilakukan routing dengan menambahkan aplikasimain
padaINSTALLED_APPS
yang berada pada filesettings.py
. - Buatlah direktori
Templates
pad direktorimain
yang bertujuan untuk menampung file-fileHTML
.
- Pada direktori aplikasi
main
, buatlah modelItem
padamodels.py
yang ada pada direktorimain
, lalu selanjutnya menambahkan atribut berupaname
dengan tipeCharField
amount
dengan tipeIntegerField
description
dengan tipeTextField
- Lakukan migrasi tiap kali ada perubahan pada model basis data tersebut
Membuat sebuah fungsi pada views.py
untuk dikembalikan ke dalam sebuah template HTML yang menampilkan nama aplikasi serta nama dan kelas kamu.
- Untuk membuat fungsi pada
views.py
saya memanfaatkan fungsirender
yang berasal dari fungsidjango.shortcut
. - Buat suatu fungsi bernama
show_main
dengan parameter beruparequests
. - Isi fungsi tersebut dengan suatu dictionary
context
yang dimana bisa kita ibaratkan seperti variable dimana key merupakan nama dari variable lalu value adalah isi dari variable. - Kemudian dengan memanfaatkan fungsi
render
dengan 3 parameter, yaiturequests
,'main.html'
, dancontext
yang selanjutnya nanti dapat digunakan pada html agar tampilan dapat lebih dinamis. - Pada file html kita dapat mengubah nama yang awalnya statis menjadi lebih dinamis dengan memanfaatkan key dari dictionary hasil return fungsi
show_main
Membuat sebuah routing pada urls.py
aplikasi main
untuk memetakan fungsi yang telah dibuat pada views.py
.
- Agar aplikasi
main
dapat dijalankan pada web, diperlukan proses routing dengan cara membuaturls.py
pada direktorimain
. fileurls.py
pada tingkat apps dapat digunakan sebagai pengatur url pada aplikasimain
. - Buatlah nama unik pada apps agar tidak terjadi konflik pada saat pemanggilan. dalam kasus ini saya memberi nama
main
dengan memasukkannya pada variableapp_name
. - dengan memanfaatkan fungsi dari
django.urls
, yaitupath
untuk membuaturlpattern
dan memanfaatkan fungsishow_main
yang sebelumnya kita buat pada direktorimain
khususnya pada fileviews.py
pada parameterpath
agar dapat ditampilkan. - selanjutnya tambahkan rute url aplikasi
main
padaurls.py
tingkat proyek agar dapat terhubung pada aplikasimain
dan dapat ditampilkan pada saat url dipanggil oleh user.
- Pada website github kita perlu membuat repositori baru dengan judul proyek sembarang, pada kasus ini saya buat sama dengan repositori lokal, yaitu
concert-ticket-inventory
. - Salin url github, lalu melalui terminal lokal pada repositori lokal, buat sebuah branch baru utama yang kita sebut dengan branch main dengan menggunakan code berikut
git branch -M main
- Hubungkan repositori lokal dengan repositori github menggunakan perintah
git remote add origin <URL_REPO>
pada kasus ini <URL_REPO> kita gunakan url yang sudah disalin sebelumnya. - Selanjutnya add seluruh pekerjaan yang dilakukan dengan menggunakan perintah
git add .
. - Setelah add seluruh hasil pekerjaan, lakukan commit dan sekaligus comment singkat apa saja yang telah dikerjakan dengan menggunakan perintah
git commit -m "<COMMENT_HERE>"
. - Setelah melakukan commit, periksa kembali file yang akan dikirim ke repositori github dengan menggunakan perintah
git status
. - Jika sudah sesuai, maka push hasil kerjaan ke repositori github dengan menggunakan perintah
git push -u origin main
. hal ini bertujuan untuk mengunggah hasil pekerjaan ke repositori github pada branch utama, yaitu branch main.
Melakukan deployment ke Adaptable terhadap aplikasi yang sudah dibuat sehingga nantinya dapat diakses oleh teman-temanmu melalui Internet.
- Pertama buka situs Adaptable.io pada web browser dan login menggunakan akun github yang menyimpan hasil pekerjaan sebelumnya.
- Jika sudah login, silakan tekan tombol
New App
. PilihConnect an Existing Repository
. - Hubungkan Adaptable.io dengan GitHub dan pilih
All Repositories
pada proses instalasi. - Pilih repositori proyek
concert_ticket_inventory
sebagai basis aplikasi yang akan di-deploy. Pilih branch yang ingin dijadikan sebagai deployment branch. - saya memilih
Python App Template
sebagai template deployment. - Pilih
PostgreSQL
sebagai tipe basis data yang akan digunakan. - Sesuaikan versi Python dengan spesifikasi aplikasi. Pada kasus ini saya menggunakan python
versi 3.10
- Pada bagian Start Command masukkan perintah
python manage.py migrate && gunicorn concert_ticket_inventory.wsgi
. - Masukkan nama aplikasi yang juga akan menjadi nama domain situs web aplikasimu.
- Centang bagian
HTTP Listener on PORT
dan klikDeploy App
untuk memulai proses deployment aplikasi.
Alasan penggunaan Virtual Environment
adalah bertujuan untuk mengisolasi dependencies yang digunakan dalam pembuatan project ini. dengan menggunakan Virtual Environment
dapat mengurangi resiko terjadinya konflik antar versi dependencies yang sama pada project yang berbeda. Selain itu, dengan menggunakan Virtual Environment
Kolaborasi project akan jauh lebih mudah. hal ini disebabkan karena Virtual Environment
memastikan bahwa semua orang yang terlibat pada project tersebut bekerja dalam 1 lingkungan. hal ini dapat menghindari masalah kompatibilitas antar sistem dan memastikan konsistensi dalam pengembangan. Sebenarnya tanpa perlu menggunakan Virtual Environment
kita tetap dapat membuat project django. Namun banyak resiko atau masalah yang mungkin saja terjadi kedepannya.
Model-View-Control (MVC), Model-View-Template (MVT), Model-View-View Model (MVVM) ketiganya merupakan arsitektur perangkat lunak yang digunakan dalam pengembangan aplikasi, terutama dalam pengembangan aplikasi berbasis web. ketiga nya sama sama memiliki fungsi dalam memisahkan tampilan dengan logika dari program tersebut.
- MVC memisahkan tanggung jawab dalam tiga komponen utama untuk menghindari ketergantungan langsung antara Model dan View.
- MVT adalah pengembangan dari MVC yang menggantikan Controller dengan View dan Template. Ini memberikan pemisahan antara logika aplikasi dan tampilan.
- MVVM adalah pola yang mirip dengan MVC, tetapi menambahkan View Model sebagai perantara yang kuat antara Model dan View, dengan menggunakan teknik databinding untuk memastikan sinkronisasi otomatis antara keduanya.
-
Membuat input form untuk menambahkan objek model pada app sebelumnya.
-
Tambahkan 5 fungsi views untuk melihat objek yang sudah ditambahkan dalam format HTML, XML, JSON, XML by ID, dan JSON by ID.
-
Membuat routing URL untuk masing-masing views yang telah ditambahkan pada poin 2.
-
Menjawab beberapa pertanyaan berikut pada README.md pada root folder.
- Apa perbedaan antara form POST dan form GET dalam Django?
- Apa perbedaan utama antara XML, JSON, dan HTML dalam konteks pengiriman data?
- Mengapa JSON sering digunakan dalam pertukaran data antara aplikasi web modern?
- Jelaskan bagaimana cara kamu mengimplementasikan checklist di atas secara step-by-step (bukan hanya sekadar mengikuti tutorial).
-
Mengakses kelima URL di poin 2 menggunakan Postman, membuat screenshot dari hasil akses URL pada Postman, dan menambahkannya ke dalam README.md.
-
Melakukan
add
-commit
-push
ke GitHub
Terdapat beberapa perbedaan antara Form POST
dan Form GET
. salah satu perbedaan yang paling kelihatan adalah ketika kita melakukan pengiriman/submit form, pada form dengan metode POST
dikirim secara sembunyi atau tidak ditampilkan di url web. Sedangkan pada form dengan metode GET
dikirim sebagai parameter query yang membuatnya terlihat pada url. Berikut perbedaan lebih rinci yang dapat kita ketahui.
- Limitasi Ukuran Data
- Pada metode
POST
, ukuran data akan terbatas sesuai dengan konfigurasi server. - pada metode
GET
karena akan dikirim sebagai parameter query yang ditampilkan pada url sehingga ukuran akan terbatas pada panjang url dan pembatasan server. url yang terlalu panjang dapat menyebabkan masalah/crash.
- Pada metode
- Keamanan
- Pada metode
POST
, karena pengiriman tersembunyi sehingga data yang dikirimkan tidak akan ditampilkan dan akan lebih aman karena data-data seperti password dan lain lain akan lebih aman. - Pada metode
GET
, karena pengiriman ditampilkan pada url sehingga data-data seperti password dan data krusial lain yang diinput pada form akan terlihat dan berpotensi untuk dicuri
- Pada metode
- Kecepatan
- Pada metode
POST
pengiriman lebih lambat karena disisipkan pada body request HTTP - Pada metode
GET
pengiriman lebih cepat karena hanya perlu mengekstrak url saja.
- Pada metode
- Penyimpanan Cache
- Pada metode
POST
data tidak disimpan dalam cache browser - Pada metode
GET
data disimpan dalam cache browser
- Pada metode
Perbedaan antara XML
, JSON
, dan HTML
adalah sebagai berikut.
- Penggunaan
XML
, biasanya digunakan untuk pertukaran data antar aplikasi.JSON
, biasanya digunakan untuk pertukaran data antar server atau browser.HTML
, tidak digunakan sebagai pengiriman data, namun ditujukan untuk membangun tampilan suatu website.
- Keamanan
XML
, Lebih aman untuk digunakan dalam pengiriman data yang bersifat krusial dan sensitif karena tidak muncul di url.JSON
, Kurang aman karena data akan ditampilkan pada url.HTML
, tidak digunakan dalam pengiriman data.
- Struktur
XML
, Menggunakan tag untuk mengelompokkan suatu data sehingga dapat mendukung hierarki yang jauh lebih kompleksJSON
, Menggunakan pasangan antaraKEY
danVALUE
sehingga jauh lebih sederhana dan mudah untuk dibaca oleh orang yang awamHTML
, Menggunakan tag untuk mendefinisikan elemen tampilan pada suatu website
JSON
sering digunakan dalam pertukaran data karena memiliki banyak keuntungan yang bisa didapatkan. Salah satu manfaat yang bisa langsung dirasakan aalah kemudahan dalam membaca file dalam format JSON
. Hal ini disebabkan karena sintaks JSON
yang lebih sederhana dan penyajian data dalam bentuk pasangan 'KEY'
dan 'VALUE'
. Hal ini dapat memudahkan pengguna dalam menyimpan data yang kompleks dengan format yang lebih terstruktur. Selain itu, dengan menggunakan JSON
memungkinkan kita untuk melakukan pertukaran data yang lebih efisien karena JSON
tergolong dalam format data yang ringan dan penggunaan bandwidth yang lebih sedikit.
- Pertama kita akan buat terlebih dahulu kerangka utama html. Hal ini bertujuan agar pada berbagai template kita dapat langsung fokus ke dalam implementasi body suatu html/content.
- Buat folder template pada
root
direktori lalu buatlah berkasbase.html
dengan isi sebagai berikut.
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0"
/>
{% block meta %}
{% endblock meta %}
</head>
<body>
{% block content %}
{% endblock content %}
</body>
</html>
- Setelah itu ubah pengaturan pada direktori
concert_ticket_inventory
lalu tambahkan[BASE_DIR / 'templates']
padaTEMPLATES
bagianDIRS
. hal tersebut bertujuan agar kerangka tersebut dapat dibaca di berbagai aplikasi.
- Buatlah berkas
forms.py
pada direktorimain
. Isikanforms.py
dengan membuat struktur form yang digunakan dalam input data. - Isikan file
forms.py
dengan kode berikut.
from django.forms import ModelForm
from main.models import Item
class ItemForm(ModelForm):
class Meta:
model = Item
fields = ["name", "amount", "description"]
- pada bagian
fields
list merupakan representasi input yang diinginkan dari user. sehingga masukkan seluruh data yang perlu diinput oleh user pada list tersebut. Perlu diingat bahwa model merupakan class yang dapat dibentuk object. namun jika ada perubahan struktur kita perlu untuk melakukan migrasi.
- Tambahkan beberapa library yang akan digunakan. salah satunya adalah ItemForm yang kita buat sebelumnya pada
forms.py
. - Selanjutnya buat fungsi untuk menyimpan data secara otomatis ketika suatu item ditambahkan lewat form. Berikut adalah potongan fungsi yang dapat digunakan.
def create_item(request):
form = ItemForm(request.POST or None)
if form.is_valid() and request.method == "POST":
form.save()
return HttpResponseRedirect(reverse('main:show_main'))
context = {'form': form}
return render(request, "create_item.html", context)
- Penjelasan terkait form tersebut adalah pertama kita akan membuat form baru yang dimasukkan ke dalam variabel
form
. Lalu selanjutnya dilakukan pengecekkan apakah form tersebut valid, jika valid form akan disimpan lalu user akan di redirect. - Selanjutnya pada fungsi
show_main
kita perlu menambahkan dictionary dengan isi seluruh objectItem
yang telah dibuat dengan menggunakan kodeitems = Item.objects.all()
. hal ini bertujuan agar kita bisa menampilkan data yang telah diinput pada halamanmain
. Selain itu pada fungsishow_main
saya tambahkan variable yang menampung jumlah item yang telah ditambahkan. - Selanjutnya kita akan membuat halaman sederhana dengan nama
create_item.html
yang digunakan untuk input Form. Dengan kode berikut.
{% extends 'base.html' %}
{% block content %}
<h1>Add New Item</h1>
<form method="POST">
{% csrf_token %}
<table>
{{ form.as_table }}
<tr>
<td></td>
<td>
<input type="submit" value="Add Ticket"/>
</td>
</tr>
</table>
</form>
{% endblock %}
- Penggunaan kode
{% csrf_token %}
digunakan untuk token keamanan yang secara otomatis dibuat oleh python dengan tujuan untuk keamanan. - Setelah itu saya menambahkan tautan yang mengarah ke halaman
create_item.html
padamain.html
dalam bentuk button dan saya menambahkan beberapa code berikut yang bertujuan untuk jummlah data yang tersimpan dan data-data tersimpan yang sudah disubmit melalui form tersebut.
<p>"Kamu menyimpan {{count}} item pada aplikasi ini"</p>
<table>
<tr>
<th>Name</th>
<th>Price</th>
<th>Description</th>
<th>Date Added</th>
</tr>
{% for ticket in tickets %}
<tr>
<td>{{ticket.name}}</td>
<td>{{ticket.amount}}</td>
<td>{{ticket.description}}</td>
<td>{{ticket.date_added}}</td>
</tr>
{% endfor %}
</table>
- Segala bentuk fungsi perlu kita buat dalam berkas
views.py
. Selanjutnya untuk mendukung pembuatan fungsi tersebut, saya melakukan import library sepertiHttpResponse
yang berfungsi untuk melakukan request http danSerializer
yang digunakan untuk konversi data kompleks seperti object python menjadi data yang mudah dikelola oleh klien sepertiJSON
danXML
. - Selanjutnya saya membuat fungsi
show_xml
danshow_json
yang sebenernya secara struktur fungsi sama saja prosesnya. Namun terdapat perbedaan pada saat melakukan konversi seperti pada fungsishow_xml
dikonversi menjadi dataXML
danshow_json
dikonversi menjadi dataJSON
. kedua method sama sama menerima parameter request agar bisa dijalankan. - Selanjutnya buat fungsi serupa, namun perbedaan dengan fungsi sebelumnya adalah fungsi ini menggunakan
id
sebagai parameter. Sehingga data yang ditampilkan bukan data keseluruhan melainkan data yang sesuai denganid
yang diminta. fungsi ini saya beri namashow_xml_by_id
danshow_json_by_id
. kedua method tersebut sama, namun memiliki perbedaan pada saat konversi data.
- Pada bagian ini agar fungsi yang sudah kita buat pada
views.py
dapat digunakan, kita perlu melakukan routing padaurls.py
yang ada pada direktorimain
. - Untuk melakukan routing, tambahkan path url ke dalam urlpatterns yang ada di berkas
urls.py
yang ada di direktorimain
. - path url yang perlu ditambahkan sebagai berikut.
- path('create-item', create_item, name='create_item'),
- path('xml/', show_xml, name='show_xml'),
- path('json/', show_json, name='show_json'),
- path('xml/int:id/', show_xml_by_id, name='show_xml_by_id'),
- path('json/int:id/', show_json_by_id, name='show_json_by_id'), Pada implementasi nanti, int:id akan diisikan dengan id item yang telah didaftarkan.
Menggunakan fungsi create_item
Menggunakan fungsi
show_xml
Menggunakan fungsi
show_json
Menggunakan fungsi
show_xml_by_id
Menggunakan fungsi
show_json_by_id
- Mengimplementasikan fungsi registrasi, login, dan logout untuk memungkinkan pengguna untuk mengakses aplikasi sebelumnya dengan lancar.
- Membuat dua akun pengguna dengan masing-masing tiga dummy data menggunakan model yang telah dibuat pada aplikasi sebelumnya untuk setiap akun di lokal.
- Menghubungkan model Item dengan User.
- Menampilkan detail informasi pengguna yang sedang logged in seperti username dan menerapkan cookies seperti last login pada halaman utama aplikasi.
- Menjawab beberapa pertanyaan berikut pada README.md pada root folder (silakan modifikasi README.md yang telah kamu buat sebelumnya; tambahkan subjudul untuk setiap tugas).
- Apa itu Django UserCreationForm, dan jelaskan apa kelebihan dan kekurangannya?
- Apa perbedaan antara autentikasi dan otorisasi dalam konteks Django, dan mengapa keduanya penting?
- Apa itu cookies dalam konteks aplikasi web, dan bagaimana Django menggunakan cookies untuk mengelola data sesi pengguna?
- Apakah penggunaan cookies aman secara default dalam pengembangan web, atau apakah ada risiko potensial yang harus diwaspadai?
- Jelaskan bagaimana cara kamu mengimplementasikan checklist di atas secara step-by-step (bukan hanya sekadar mengikuti tutorial).
- Melakukan add-commit-push ke GitHub.
UserCreationForm
adalah salah satu built-in form atau form bawaan yang disediakan oleh Django untuk mengelola proses autentikasi user. Form ini digunakan secara khusus untuk membuat atau mendaftarkan user baru ke dalam aplikasi web.
-
Kelebihan:
- Mudah Digunakan karena untuk menggunakan
UserCreationForm
kita hanya butuh untuk melakukan import dan form bisa digunakan langsung tanpa perlu mengatur logika dalam validasi input yang dimasukkan oleh user UserCreationForm
pada django sudah terintegrasi baik dengan sistem otentikasi bawaan django. sehingga dapat memudahkan kita dalam mengelola pengguna aplikasi yang sudah terdaftarUserCreationForm
memiliki validasi yang terintegrasi untuk memastikan data yang diinputkan oleh user sudah sesuai dengan persyaratan keamanan yang telah ditetapkan oleh Django.
- Mudah Digunakan karena untuk menggunakan
-
Kekurangan
UserCreationForm
memiliki input field yang sangat terbatas. sehingga ketika kita membutuhkan field lain selain username dan password perlu menambahkan secara manual.UserCreationForm
memiliki logika yang terbatas hanya untuk pembuatan atau registrasi user baru ke dalam suatu aplikasi web. sehingga ketika kita ingin melakukan validasi seperti email atau nomor telepon tidak bisa menggunakanUserCreationForm
.UserCreationForm
memiliki tampilan default yang kurang menarik dan terkesan terbentuk hanya dengan menggunakan element html saja. sehingga kita membutuhkan untuk pengembangan tampilan lebih lanjut.
Autentikasi mencakup proses memeriksa dan memastikan/ memverifikasi apakah suatu user yang diinputkan telah terdaftar pada aplikasi web. Sebagai contoh, ketika seseorang mencoba untuk masuk ke dalam akun mereka, autentikasi akan memastikan bahwa informasi seperti nama pengguna dan kata sandi yang mereka berikan benar dan cocok dengan yang ada dalam catatan sistem. Ini adalah lapisan pertama pertahanan website dalam menjaga keamanan sistem, mengidentifikasi siapa yang berusaha melakukan login. Sedangkan Otorisasi menentukan apa yang boleh dan tidak boleh dilakukan oleh pengguna atau entitas yang telah diotentikasi. Sebagai contoh, setelah seseorang berhasil masuk ke akun mereka, otorisasi akan menentukan apakah mereka diizinkan untuk melakukan tindakan tertentu, seperti mengedit data, menghapus informasi, atau hanya membaca tanpa mengubahnya pada halaman web. Ini memastikan bahwa akses ke sumber daya dan fungsionalitas web dikontrol sesuai dengan peraturan dan kebijakan yang telah ditetapkan.
Cookies
adalah suatu data kecil yang disimpan pada server web klien melalui web browser saat user mengunjungi suatu situs web. Cookies
digunakan untuk menyimpan informasi tertentu yang dapat diakses dan digunakan kembali oleh server web saat user akan membuka website tersebut kembali di lain waktu.
- Ketika seorang user pertama kali mengakses aplikasi web Django, server akan membuat sebuah
cookie
sesi baru.Cookie
ini berisi ID unik yang digunakan untuk mengidentifikasi sesi user yang bersangkutan. - ID sesi ini kemudian disimpan di dalam
cookie
di sisi klien.Cookie
ini akan terkait dengan domain aplikasi web tertentu dan disimpan dalam web browser user. - Setiap kali user membuat permintaan (request) berikutnya ke aplikasi web,
cookie
sesi ini akan disertakan dalam permintaan tersebut secara otomatis. Ini memungkinkan server untuk mengidentifikasi user yang terkait dengan sesi tertentu. - Django memiliki mekanisme untuk menyimpan data sesi user, seperti informasi login user atau preferensi, di server. Data ini terkait dengan sesi yang sesuai melalui ID yang ada di
cookie
. - Data sesi ini dapat diakses dan dimodifikasi oleh server saat user berinteraksi dengan aplikasi. Selain itu, data sesi digunakan untuk menjaga keadaan sesi user selama interaksi dengan aplikasi. Sebagai contoh, jika seorang user telah masuk ke akunnya, data sesi akan mencatat status login tersebut sehingga user tetap berada dalam kondisi login selama beberapa permintaan.
Setiap perkembangan teknologi selalu memiliki celah keamanan yang dapat ditembus sewaktu-waktu. sehingga pada kasus ini, penggunaan Cookies
belum tentu aman secara default dalam pengembangan web. terdapat beberapa resiko yang perlu diperhatikan sebagai berikut.
-
Cookies
dapat digunakan untuk menyimpan data sensitif, seperti informasi login atau ID pengguna. Sehingga jika tidak diperhatikan data sensitif seperti yang telah disebutkan berpotensi untuk dapat diakses oleh orang tidak bertanggung jawab. -
Melalui
Cookies
, pihak yang tidak bertanggung jawab dapat melacak aktivitas target di berbagai situs web. Hal ini tentu melanggar privasi user dalam internet. -
Keamanan
Cookies
sangat bergantung pada keamanan yang disediakan oleh web browser. Sehingga jika kita menggunakan web browser yang rentan, makaCookies
akan sangat rentan juga menjadi target serangan. -
Karena
Cookies
dapat dimodifikasi, jika tidak dilakukan pembersihan data yang baik, makaCookies
berpotensi untuk disisipkan script yang dapat membahayakan web. -
Cookies
yang digunakan untuk otentikasi rentan terhadap serangan CSRF jika tidak diatur dengan benar. Ini berarti penyerang dapat mencoba memanipulasi tindakan pengguna tanpa izin.
- Pertama kita perlu melakukan import method
login_required
yang digunakan untuk membatasi akses ke halaman main hanya kepada pengguna yang sudah login (terautentikasi). - sebelum kita menginisiasi method
show_main
kita perlu menambahkan code berikut
@login_required(login_url='/login')
- Pertama kali kita perlu untuk melakukan import method
UserCreationForm
. - Selanjutnya, buatlah method/fungsi
register
yang menerima parameter requests pada fileviews.py
pada aplikasi main. - buatlah object form dengan menggunakan
UserCreationForm
yang secara otomatis akan memiliki struktur dan logika form tanpa perlu kita buat dari 0 - Selanjutnya method akan mengarahkan ke halaman form yang telah kita buat sebelumnya untuk menambahkan user.
- Namun, jika form yang disubmit oleh user valid, maka akan menampilkan pesan yang telah disesuaikan lalu kembali ke halaman login.
- Selain membuat method untuk register, kita perlu membuat file html yang digunakan untuk menampilkan form dan melakukan submisi form dengan nama
register.html
.
- Untuk membuat method/fungsi
login_user
, kita perlu melakukan importauthenticate
danlogin
. Fungsiauthenticate
digunakan untuk memverifikasi kredensial pengguna (username dan password), sedangkanlogin
digunakan untuk memasukkan pengguna ke dalam sesi setelah berhasilautentikasi
. - Selanjutnya buatlah method/fungsi
login_user
yang menerima parameter request pada fileviews.py
pada aplikasi main yang digunakan untuk mengautentikasi user yang mencoba untuk login - Dalam fungsi
login_user
, gunakan fungsiauthenticate
untuk autentikasi pengguna berdasarkan username dan password yang diterima dari permintaan (request) pengguna saat proses login. - Selanjutnya kita perlu membuat file html yang digunakan untuk menampilkan tampilan form untuk login dan melakukan pengiriman data dengan nama file
login.html
.
- Untuk membuat method/fungsi
logout_user
, kita perlu melakukan import methodlogout
yang digunakan untuk mengatur proses utama dalam logout. - Selanjutnya buatlah method/fungsi
logout_user
yang menerima parameter request pada fileviews.py
pada aplikasi main yang digunakan untuk implementasi mekanisme logout dalam aplikasi. - didalam fungsi
logout_user
dilakukan pemanggilan fungsilogout(requests)
yang bertujuan untuk menghapus sesi pengguna yang saat ini masuk. - Setelah berhasil melakukan logout, Secara otomatis akan mengembalikan ke halaman user dengan syarat bahwa halaman aplikasi web hanya dapat diakses jika user telah login ke akun yang telah terdaftar
- Untuk dapat melakukan logout, kita perlu menambahkan button logout pada file
main.html
yang bertujuan untuk mengakses fungsilogout_user
yang ada diviews.py
- Lakukan import terhadap seluruh fungsi yang sudah kita buat pada
views.py
sepertiregister
,login_user
,logout_user
. - Selanjutnya tambahkan urlpattern dengan path yang bersesuaian dengan fungsi yang kita miliki sebagai berikut.
path('login/', login_user, name='login')
path('register/', register, name='register')
path('logout/', logout_user, name='logout')
- Selanjutnya untuk membuat akun kita perlu menjalankan web tersebut melalui perintah
python manage.py runserver
. - Selanjutnya kita perlu membuka http://localhost:8000/ yang akan langsugn terhubung ke halaman login.
- kita perlu membuat akun terlebih dahulu. disini saya akan membuat akun sebagai berikut
- akun 1
- username : RodStewart
- password : lagu1990
- akun 2
- username : CharliePuth
- password : lightswitch
- akun 1
- Selanjutnya lakukan login dengan menggunakan akun yang telah didaftarkan diatas.
- Setelah berhasil login klik tombol
Add New Ticket
untuk menambahkan produk sesuai user yang berhasil login.
- Pertama kita perlu melakukan import Model
User
ke dalam berkasmodels.py
yang ada pada aplikasimain
. - selanjutnya pada model
Item
, saya menambahkan sebuah atribut baru bernamauser
dimana tiap objekItem
akan berelasi dengan satu objekUser
dengan ForeignKey.
user = models.ForeignKey(User, on_delete=models.CASCADE)
- Lakukan perubahan fungsi
create_item
yang ada dalam berkasviews.py
perubahan ini mencakup code berikut.
item = form.save(commit=False)
item.user = request.user
pada line 1 digunakan agar form tidak langsung disimpan ke dalam database sedangkan pada line 2 kita mengubah pemilik item menjadi user yang terautentikasi/sedang login 4. Terakhir jangan lupa untuk melakukan migrasi karena terdapat perubahan pada model.
- untuk menampilkan username yang sedang login, kita hanya perlu mengubah isi dari dictionary context pada fungsi
show_main
denganrequest.user.username
. Hal ini bertujuan untuk menampilkan username pengguna yang saat ini login pada halaman utama, sehingga pengguna dapat melihat dengan jelas akun yang mereka gunakan.
- Untuk menampilkan kapan terakhir kali user melakukan login, kita perlu melakukan import
datetime
untuk mengambil waktu. - Untuk mengambil informasi waktu kapan terakhir kali user melakukan login, kita perlu melakukan
SET_COOKIE
saat user berhasil melakukan login dengan namalast_login
dan menambahkannya ke dalam respons.Cookie
ini akan berisi informasi waktu saat pengguna terakhir kali melakukan login. - Pada fungsi
show_main
kita perlu menambahkan variabel tambahan padacontext
sebagai berikut.last_login': request.COOKIES['last_login']
- Selanjutnya kita perlu set ketika user melakukan logout atau keluar dari aplikasi main, maka kita perlu menghapus
Cookies
last_login
dengan menggunakan perintahresponse.delete_cookie('last_login')
- Terakhir agar informasi last login dapat ditampilkan pada aplikasi main, kita perlu menambahkan elemen baru di
main.html
seperti berikut.
<h5>Sesi terakhir login: {{ last_login }}</h5>
- [x]Kustomisasi desain pada templat HTML yang telah dibuat pada Tugas 4 dengan menggunakan CSS atau CSS framework (seperti Bootstrap, Tailwind, Bulma) dengan ketentuan sebagai berikut
- Kustomisasi halaman login, register, dan tambah inventori semenarik mungkin.
- Kustomisasi halaman daftar inventori menjadi lebih berwarna maupun menggunakan apporach lain seperti menggunakan Card.
- Menjawab beberapa pertanyaan berikut pada README.md pada root folder.
- Jelaskan manfaat dari setiap element selector dan kapan waktu yang tepat untuk menggunakannya.
- Jelaskan HTML5 Tag yang kamu ketahui.
- Jelaskan perbedaan antara margin dan padding.
- Jelaskan perbedaan antara framework CSS Tailwind dan Bootstrap. Kapan sebaiknya kita menggunakan Bootstrap daripada Tailwind, dan sebaliknya?
- Jelaskan bagaimana cara kamu mengimplementasikan checklist di atas secara step-by-step (bukan hanya sekadar mengikuti tutorial).
- Melakukan add-commit-push ke GitHub.
Berdasarkan yang saya ketahui, selektor merupakan suatu penanda dalam CSS untuk mengedit suatu blok elemen dalam HTML
. terdapat beberapa selektor yang dapat terbagi menjadi berikut.
-
Selektor Universal
- Selektor Universal adalah suatu selektor yang dapat mempengaruhi atau merubah seluruh gaya element dalam dokumen
HTML
. Waktu yang tepat untuk menggunakan selektor universal adalah ketika kita ingin menggunakan suatu ketentuan style yang sama dalam dokumenHTML
. Sebagai contoh adalah padding, margin, font, dll.
- Selektor Universal adalah suatu selektor yang dapat mempengaruhi atau merubah seluruh gaya element dalam dokumen
-
Selektor Tag
- Selektor Tag adalah suatu selektor yang dapat digunakan untuk mengubah style dari suatu tag HTML. dalam hal ini, misal kita ingin mengubah seluruh style pada tag
<h1>
. Maka kita dapat gunakan selektor tag untuk memberikan style pada seluruh<h1>
. kita dapat gunakan selektor tag ini untuk mengubah seluruh gaya pada suatu tag seperti yang dicontohkan sebelumnya.
- Selektor Tag adalah suatu selektor yang dapat digunakan untuk mengubah style dari suatu tag HTML. dalam hal ini, misal kita ingin mengubah seluruh style pada tag
-
Selektor ID
- Selektor
ID
adalah selektor yang digunakan untuk mengubah style yang ada padaID
suatu blokHTML
. Biasa digunakan untuk memberikan suatu style yang unik pada suatuID
.
- Selektor
-
Selektor Kelas
- Selektor kelas adalah selektor yang digunakan untuk mengubah style yang ada pada suatu class. biasa digunakan untuk memberikan style pada suatu element yang memiliki class yang sama.
<header></header>
- digunakan untuk memberikan header pada halaman web yang didalamnya bisa saja berisi navigasi judul atau logo dari pemilik website tersebut/
<nav></nav>
- digunakan untuk menampung navigasi bar halaman website
<main></main>
- digunakan untuk menampung konten utama dari suatu website.
<article></article>
- Mengelompokkan konten-konten yang secara terpisah dapat diubah-ubah.
<aside></aside>
- untuk menampung konten tambahan yang ada di samping dari konten utama.
<section></section>
- Mengelompokkan konten-konten menjadi bagian yang terpisah. Sebenarnya sama saja dengan tag
<article></article
namun tag<section></section>
lebih meluas ketimbang<article></article
.
- Mengelompokkan konten-konten menjadi bagian yang terpisah. Sebenarnya sama saja dengan tag
<footer></footer>
- Digunakan untuk memberikan bagian bawah pada halaman web. seperti informasi hak cipta, informasi pemiliki website, dan beberapa navigasi sederhana.
<figure></figure>
- digunakan untuk menampilkan gambar atau grafik pada halaman web
<canvas></canvas>
- digunakan untuk memberikan user suatu ruang untuk menggambar.
<form></form>
- digunakan untuk mengelompokkan/membuat form pada website yang memungkinkan pengguna untuk mengirimkan data ke server
<input></input>
- digunakan untuk melengkapi form yang kita buat seperti membuat textfield, checkbox, button, dll
<button></button>
- digunakan untuk membuat tombol untuk melakukan suatu action.
<a></a>
- Digunakan untuk membuat atau menampilkan suatu link/hyperlink kepada user di halaman website.
<table></table>
- Digunakan untuk membaut table pada halaman website. biasanya dibantu dengan tag-tag lain seperti
<th></th>
: tag ini digunakan untuk membuat header kolom pada table<tr></tr>
: tag ini digunakan untuk membuat row pada table<td></td>
: tag ini digunakan untuk membuat nilai-nilai atau value pada table
- Digunakan untuk membaut table pada halaman website. biasanya dibantu dengan tag-tag lain seperti
<div></div>
- digunakan untuk mengelompokkan sesuatu secara satu kesatuan. secara kasar
<div></div>
dapat diartikan sebagai kontainer pada suatu fitur.
- digunakan untuk mengelompokkan sesuatu secara satu kesatuan. secara kasar
<span></span>
- digunakan untuk mengubah suatu tulisan secara khusus
<video></video>
- Digunakan untuk membuat media player video
<audio></audio>
- Digunakan untuk membuat media player audio
Perbedaan antara padding
dan margin adalah sebagai berikut.
- Fungsi Utama
Padding
digunakan untuk menberikan ruang kosong antara konten/elemen dengan border dari konten/elemen itu sendiri. Dengan kata lain,padding
merupakan ruang kosong secara internal atau mengosongkan ruang ke dalam elemen itu sendiri.Margin
digunakan untuk memberikan ruang kosong antara satu elemen/konten dengan elemen/konten lain. Dengan kata lain,margin
merupakan ruang kosong secara eksternal atau mengosongkan ruang ke luar dari elemen itu sendiri.
- Posisi
Padding
berada diantara konten elemen dengan borderMargin
berada diantara elemen 1 dengan elemen lainnya.
- Pengaruh Ukuran Total
Padding
dapat mempengaruh ukuran total dari elemen. sehingga ukuran asli dari elemen akan ditambahkan dengan padding.Margin
tidak mempengaruhi ukuran total dari suatu elemen.
- Background Color
Padding
dapat memiliki warna background mengikuti elemen dan konten itu sendiriMargin
tidak dapat memiliki warna background
Perbedaan antara Tailwind dan Bootstrap adalah sebagai berikut.
- Kustomisasi
Tailwind
sangat fleksibel dalam hal kustomisasi. Hal ini dapat memungkinkan kita menyesuaikan tampilan dengan sangat detail.Bootstrap
bisa dikustomisasi namun relative lebih sulit dibandingkan menggunakanTailwind
- Ukuran File
Tailwind
ukuran filenya lebih kecil karena tidak terlalu banyak komponen pra desain sehingga kita perlu melakukan kustomisasi secara mandiriBootstrap
ukuran filenya lebih besar dibandingkan tailwind karena banyak komponen pra desain
- Jumlah Kelas
- pada
Tailwind
kelas bisa ditambahkan langsung ke HTML yang membuat kita dapat lebih mudah untuk mengatur/memiliki kontrol yang lebih besar terhadap tampilan dan element itu sendiri - pada
Bootstrap
kelas CSS sudah ditetapkan yang membuat code menjadi lebih bersih namun kontrol yang tidak terlalu besar. PenggunaanTailwind
danBootstrap
bergantung pada beberapa aspek sebagai berikut
- pada
- Tailwind
- Digunakan ketika kita memiliki kemampuan atau ilmu design yang lebih sehingga dapat lebih leluasa dalam melakukan design
- Digunakan untuk menghasilkan tampilan website yang lebih baik dan sesuai dengan keinginan.
- Bootstrap
- Digunakan ketika tidak banyak ilmu design yang dimiliki sehingga dapat memanfaatkan banyaknya komponen pra desain pada bootstrap
- Desain yang diinginkan tidak begitu berbeda jauh dengan komponen pada bootstrap
- Tidak memiliki waktu yang banyak untuk membuat project
- Sebelum melakukan design/kustomisasi halaman web, hal yang perlu dilakukan adalah menyisipkan static file bootstrap ke dalam template
base.html
. Langkah ini menjadi sangat penting karena bertujuan agar kita dapat menggunakan pra-komponen langsung dari bootstrap.
- Setelah melakukan import, hal yang saya lakukan untuk memodifikasi halaman-halaman tersebut adalah dengan membuat nya menjadi dalam 1 kontainer
- Setelah itu, lakukan pengaturan pada padding dan margin agar sesuai dengan yang diinginkan
- Untuk membuatnya menjadi fokus utama dalam suatu halaman web, saya membuat seluruh elemen menjadi
center
. - Setelah itu saya menambahkan tombol tindak lanjut dan tombol kembali yang dapat digunakan user untuk membatalkan suatu proses dengan memanfaatkan btn bawaan dari bootstrap.
- Setelah itu saya melakukan modifikasi tata letak form seperti antara label dengan field isi saya buat menjadi atas bawah sehingga kita tidak perlu mengukur padding antar konten.
- Selanjutnya dengan memanfaatkan kelas pada bootstrap, saya dapat dengan mudah untuk mengganti warna tombol tombol yang ada pada halaman web.
- Pertama saya membuat bar navigasi yang bertujuan untuk memudahkan user untuk memilih menu.
- Untuk sementara saya memasukkan navigasi yang dapat mengarahkan website ke
main
, melakukanadd_ticket
, danlogout
. - Tidak lupa saya tambahkan nama user yang login ke dalam bar navigasi.
- Untuk menampilkan inventory yang sudah berhasil di inputkan, saya mengubah tampilan dari yang awalnya menggunakan pendekatan tabel, sekarang saya menggunakan pendekatan card.
- saya memberikan tiap card menu yang dapat digunakan seperti menambahkan dan mengurangkan amount, mengedit data, dan menghapus data.
- Seluruh menu tersebut saya sajikan dalam bentuk button yang diberikan warna yang berbeda dengan bantuan dari framework bootstrap.
Setelah itu saya memberikan tombol-tombol tersebut terhubung dengan logic program yang ada di
views.py
melaluiurls.py
-
Mengubah tugas 5 yang telah dibuat sebelumnya menjadi menggunakan AJAX.
-
AJAX GET
- Ubahlah kode tabel data item agar dapat mendukung AJAX GET.
- Lakukan pengambilan task menggunakan AJAX GET.
-
AJAX POST
- Buatlah sebuah tombol yang membuka sebuah modal dengan form untuk menambahkan item.
- Modal di-trigger dengan menekan suatu tombol pada halaman utama. Saat penambahan item berhasil, modal harus ditutup dan input form harus dibersihkan dari data yang sudah dimasukkan ke dalam form sebelumnya.
- Buatlah fungsi view baru untuk menambahkan item baru ke dalam basis data.
- Buatlah path /create-ajax/ yang mengarah ke fungsi view yang baru kamu buat.
- Hubungkan form yang telah kamu buat di dalam modal kamu ke path /create-ajax/.
- Lakukan refresh pada halaman utama secara asinkronus untuk menampilkan daftar item terbaru tanpa reload halaman utama secara keseluruhan.
-
Melakukan perintah collectstatic.
- Perintah ini bertujuan untuk mengumpulkan file static dari setiap aplikasi kamu ke dalam suatu folder yang dapat dengan mudah disajikan pada produksi.
-
-
Menjawab beberapa pertanyaan berikut pada README.md pada root folder (silakan modifikasi README.md yang telah kamu buat sebelumnya; tambahkan subjudul untuk setiap tugas).
- Jelaskan perbedaan antara asynchronous programming dengan synchronous programming.
- Dalam penerapan JavaScript dan AJAX, terdapat penerapan paradigma event-driven programming. Jelaskan maksud dari paradigma tersebut dan sebutkan salah satu contoh penerapannya pada tugas ini.
- Jelaskan penerapan asynchronous programming pada AJAX.
- Pada PBP kali ini, penerapan AJAX dilakukan dengan menggunakan Fetch API daripada library jQuery. Bandingkanlah kedua teknologi tersebut dan tuliskan pendapat kamu teknologi manakah yang lebih baik untuk digunakan.
- Jelaskan bagaimana cara kamu mengimplementasikan checklist di atas secara step-by-step (bukan hanya sekadar mengikuti tutorial).
-
Melakukan add-commit-push ke GitHub.
-
Melakukan deployment ke PaaS PBP Fasilkom UI dan sertakan tautan aplikasi pada file README.md.
- Pengertian
- Asynchronous Programming merupakan salah satu pendekatan dalam pemrograman yang memungkinkan suatu perintah dapat dijalankan secara bersamaan tanpa perlu menunggu perintah lain selesai untuk dieksekusi. dengan kata lain, Asynchronous Programming merupakan teknik dalam pemrograman yang tidak bergantung pada I/O sehingga dapat menjalankan perintah dengan lebih dinamis.
- Synchronous Programming merupakan salah satu pendekatan dalam pemrograman dimana perintah akan dieksekusi secara sequential atau berdasarkan urutan dan prioritas.
- Blocking
- Pada proses Asynchronous programming tidak terdapat blocking. sehingga untuk tugas-tugas yang memakan waktu lebih lama tetap bisa untuk dijalankan di latar belakang aplikasi sehingga tidak mengganggu proses lainnya.
- Pada proses Synchronous Programming terdapat blocking. dampak dari adanya blocking adalah ketika terdapat tugas yang memiliki waktu yang lebih lama dapat menghambat proses lain karena perintah dijalankan secara pararel sehingga ketika terdapat proses yang lama maka perintah lain tidak dapat dieksekusi.
- Kecepatan
- dalam konteks pemrograman berbasis platform ini, kecepatan dari program yang menggunakan pendekatan Asynchronous programming akan lebih cepat ketika website membutuhkan akses ke data ke database.
Paradigma Event Driven Programming adalah sebuah paradigma pemrograman yang berfokus pada pengendalian(handling) event yang diberikan oleh user. Event tersebut meliputi Mouse Event, Keyboard Event, Form Event. Salah satu penerapan Event Driven Programming yang diimplementasikan dalam tugas 6 ini adalah pembuatan menu popup yang dapat digunakan untuk menambahkan item pada inventory dengan menggunakan AJAX.
Penerapan Asynchronous Programming dalam AJAX berupa teknik dalam pengembangan web yang memungkinkan komunikasi antara peramban web dan server web untuk dilakukan secara asinkron, tanpa harus me-refresh seluruh halaman web. Berikut adalah penjelasan mengenai penerapa Asynchronous Programming dalam AJAX lebih mendalam.
- Pengiriman Requests HTTP Dalam konteks ini, ketika kita melakukan pengiriman permintaan AJAX, kita tidak perlu menahan eksekusi kode sampai respons dari server tiba. Dengan kata lain, kita dapat mengirimkan permintaan dan melanjutkan dengan eksekusi kode lainnya, sementara notifikasi atau event akan memberitahu kita ketika respons dari server telah siap untuk diproses.
- Event Handling Implementasi ini dapat kita temui ketika setelah kita mengambil data dari server atau mengirimkan data ke server, sebuah event akan dipicu. Di sini, kita dapat mengonfigurasi event handler untuk merespons data yang kita terima. Ini bisa berarti memperbarui tampilan pengguna dengan data baru atau menjalankan tindakan tertentu berdasarkan respons yang diterima.
- Callback Function Callback functions adalah alat yang sering digunakan dalam AJAX untuk menentukan apa yang harus dilakukan ketika respons dari server telah diterima. Callback function merupakan fungsi JavaScript yang akan dijalankan ketika operasi asinkron selesai. Misalnya kita dapat menggunakan callback function sukses (success) untuk mengelola respons yang berhasil dan callback fungsi error untuk menangani kesalahan jika permintaan AJAX mengalami kegagalan.
- Promises dan async/await Dengan menggunakan Promises,kita dapat menghindari "callback hell" dan membuat kode lebih rapi, sedangkan async/await memungkinkan kita untuk menulis kode yang tampak seperti sinkron meskipun sebenarnya berjalan secara asinkron.
Fetch API | jQuery | |
---|---|---|
Keberadaan dalam JavaScript | Bagian dari JavaScript modern (ECMAScript) dan tidak perlu download atau pustaka tambahan. | Pustaka JavaScript terpisah yang perlu di download dan masukkan ke dalam proyek. |
Manajemen Request | Fetch API mengembalikan objek Promise, yang memudahkan untuk mengelola requests dengan cara yang bersih dan terstruktur. | jQuery menggunakan pendekatan callback-based untuk manajemen requests, yang bisa menjadi kurang bersih dan membingungkan jika terdapat banyak requests bersarang. |
Flekbilitas | lebih banyak kontrol atas requests HTTP, seperti mengatur header, metode, mode requests (cors, same-origin, dll.). | jQuery menyederhanakan permintaan AJAX sederhana dan tidak memberikan kontrol sebanyak Fetch API. |
Handling Response | Fetch API menyediakan metode built-in seperti json(), text(), dan lainnya untuk mengelola berbagai jenis respons dengan mudah. | jQuery memiliki metode built-in yang memfasilitasi pengolahan respons, seperti |
Compatibility | Terbatas di beberapa peramban lama. | Memiliki compatibility yang baik untuk peramban lama. |
Berdasarkan perbandingan yang dijabarkan sebelumnya, menurut saya Fetch API lebih baik digunakan pada masa sekarang. khususnya untuk project project dalam skala yang besar dan kompleks. Selain itu, kita tidak perlu melakukan instalasi dan repot untuk menambahkannya ke dalam projek. Namun, jika kita sedang mengerjakan projek yang kecil dan menggunakan akses dari peramban lama, jQuery akan menjadi pilihan yang baik.
- Implementasikan fungsi
get_item_json
yang digunakan untuk mengambil seluruh objekItem
yang telah dibuat sebagai berikut.
def get_item_json(request):
item = Item.objects.filter(user=request.user)
return HttpResponse(serializers.serialize('json', item))
- Fungsi tersebut akan mengembalikan seluruh objek
Item
yang telah dibuat dengan format yang telah dikonversi menjadiJSON
- Implementasikan fungsi
add_item_ajax
yang digunakan untuk membuat item seperti berikut.
@csrf_exempt
def add_item_ajax(request):
if request.method == 'POST':
name = request.POST.get("name")
amount = request.POST.get("amount")
description = request.POST.get("description")
user = request.user
new_item = Item(name=name, amount=amount, description=description, user=user)
new_item.save()
return HttpResponse(b"CREATED", status=201)
return HttpResponseNotFound()
- Dengan menggunakan
@csrf_exempt
, program akan mengabaikan keamanan dalam pembuatan objek menggunakan AJAX sehingga program akan menjadi jauh lebih sederhana
- Pertama yang saya lakukan adalah mengubah card item yang terhubung langsung dengan objek
Item
melalui looping menjadi suatu container kosong yang akan menampungCard Item
tersebut.
<div class="container" id="item_container">
- Selanjutnya saya akan membuat fungsi asynchronous pada javascript agar proses berjalan pada background dan tidak menunggu proses tersebut selesai.
- Fungsi asynchronous pertama yang saya buat adalah
getItems
yang berfungsi untuk mengambil semua objectItem
dengan implementasi sebagai berikut.
async function getItems() {
return fetch("{% url 'main:get_item_json' %}").then((res) => res.json())
}
- Selanjutnya dengan memanfaatkan fungsi
getItems
dan iditem_container
, saya membuat fungsirefreshItem
yang akan meloading seluruh item yang didapatkan melalui pemanggilangetItems
untuk dimasukkan ke dalamcard
yang selanjutnya akan disisipkan pada innerHTMLitem_container
. Berikut adalah implementasi dari fungsirefreshItem
.
async function refreshItem() {
document.getElementById("item_container").innerHTML = ""
const items = await getItems()
let htmlString = `
<div class="row">`
items.forEach((item) =>{
htmlString += `
<div class="col-md-4 mb-4 my-5" data-item-id="${item.pk}">
<div class="card">
<div class="card-body">
<h5 class="card-title">${item.fields.name}</h5>
<p class="card-text"><strong>Amount:</strong> ${item.fields.amount}</p>
<p class="card-text"><strong>Description:</strong> ${item.fields.description}</p>
<p class="card-text"><strong>Date Added:</strong> ${item.fields.date_added}</p>
</div>
<div class="card-footer">
<a href="min_amount/${item.pk}" class="btn btn-danger">MIN</a>
<a href="add_amount/${item.pk}" class="btn btn-success">ADD</a>
<a href="edit_data/${item.pk}" class="btn btn-info">EDIT</a>
<a href="delete_data/${item.pk}" class="btn btn-warning">DELETE</a>
</div>
</div>
</div>`
})
htmlString += `\n</div>`
document.getElementById("item_container").innerHTML = htmlString
}
htmlString
merupakan potongan code html yang yang akan disisipkan dalam innerHTML dari iditem_container
.
- Untuk membuat model ini saya akan memanfaatkan fungsi
add_item_ajax
yang ada pada fileviews.py
agar item yang ditambahkan melalui form dapat disimpan ke dalam database - Agar fungsi
add_item_ajax
dapat digunakan dalam file html dan scriptnya, kita perlu melakukan routing dengan cara menambahkan path fungsi tersebut kedalam urlpattern yang ada diurls.py
- selanjutnya tambahkan kode berikut ke dalam file HTML yang kita miliki
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalLabel">Add New Item</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form id="form" onsubmit="return false;">
{% csrf_token %}
<div class="mb-3">
<label for="name" class="col-form-label">Name:</label>
<input type="text" class="form-control" id="name" name="name"></input>
</div>
<div class="mb-3">
<label for="amount" class="col-form-label">Amount:</label>
<input type="number" class="form-control" id="amount" name="amount"></input>
</div>
<div class="mb-3">
<label for="description" class="col-form-label">Description:</label>
<textarea class="form-control" id="description" name="description"></textarea>
</div>
</form>
</div>
<div c lass="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary" id="button_add" data-bs-dismiss="modal" >Add Item</button>
</div>
</div>
</div>
</div>
code html tersebut digunakan merupakan kode form yang akan tampil jika suatu button form akan dibuat. 4. Untuk itu kita perlu menambahkan button yang dapat memunculkan popup form tersebut sehingga form tersebut akan muncul ketika kita menekan tombol tersebut.
<button type="button" class="btn btn-primary mx-auto" data-bs-toggle="modal" data-bs-target="#exampleModal">Add Item by AJAX</button>
- selanjutnya kita perlu menghubungkan modal form tersebut dengan suatu fungsi. sehingga ketika kita memasukkan atau melakukan submisi form, data-data yang ada dalam form dapat ditangkap oleh program dan disimpan ke dalam database.
- Fungsi yang saya buat adalah fungsi
addItem
fungsi ini akan memanggil fungsiadd_item_ajax
yang ada pada fileviews.py
sehingga data dapat ditangkap dan disimpan dalam database. Selain itu pada fungsi tersebut saya akan melakukan refresh namun secara asynchronous sehingga tidak seluruh halaman utama di refresh lalu mengosongkan form yang sudah di submit tadi. implementasi code sebagai berikut.
function addItem() {
fetch("{% url 'main:add_item_ajax' %}", {
method: "POST",
body: new FormData(document.querySelector('#form'))
}).then(refreshItem)
document.getElementById("form").reset()
return false
}
- agar tombol submisi pada form dapat terhubung dengan fungsi tersebut saya akan menambahakn penghubung agar ketika tombol submit di klik, kita akan memanggil fungsi javascript
addItem
. berikut adalah implementasi dari code tersebut
document.getElementById("button_add").onclick = addItem
- Untuk melakukan
collectstatic
saya membuka terminal lalu masuk ke dalam direktori project ini berada. - Selanjutnya saya masuk ke dalam virtual environment dengan cara memasukkan code berikut ke dalam terminal
env\Scripts\activate.bat
- Setelah di dalam virtual environment, saya akan mengumpulkan seluruh file static yang ada pada seluruh aplikasi yang saya buat dalam proyek ini, lalu saya kumpulkan ke dalam satu folder khusus dengan menjalankan perintah sebagai berikut.
python manage.py collectstatic