Aplikasi PacilBay (http://theo-ananda-pacilbay.pbp.cs.ui.ac.id/)
-
Menyiapkan development environment:
- Menginstal Python, Django, dan dependencies yang dibutuhkan.
- Membuat virtual environment supaya aplikasi tidak bentrok dengan versi lain.
-
Membuat Proyek Django:
- Menjalankan
django-admin startproject pacilbay
untuk membuat proyek baru. - Menyesuaikan pengaturan di
settings.py
, seperti konfigurasi database,INSTALLED_APPS
, allowed host untuk mengizinkanlocalhost
dan PWS mengakses aplikasi.
- Menjalankan
-
Membuat Aplikasi Django:
- Menjalankan
python manage.py startapp main
untuk membuat aplikasimain
di dalam proyek. - Menambahkan aplikasi main ke dalam
INSTALLED_APPS
disettings.py
.
- Menjalankan
-
Membuat Template HTML:
- Membuat HTML file di folder
templates
untuk mengatur view frontend. - Menggunakan template variables untuk menampilkan nilai dari variabel yang akan dibuat di
views.py
.
- Membuat HTML file di folder
-
Membuat Model (
models.py
):- Merancang model data dengan membuat field pada model di
models.py
. - Menjalankan perintah
python manage.py makemigrations
danpython manage.py migrate
untuk merefleksikan perubahan model ke database.
- Merancang model data dengan membuat field pada model di
-
Membuat Views (
views.py
):- Mengimpor fungsi render dari
django.shortcuts
dan menambhakan fungsishow_main
yang berisi dictionary data untuk dikirimkan ke HTML file. - Menghubungkan views dengan template HTML yang akan dirender.
- Mengimpor fungsi render dari
-
Mengatur URL Routing (
urls.py
):- Mengatur routing URL di
urls.py
untuk menambahkan path ke aplikasi main. - Memastikan setiap view memiliki URL pattern yang sesuai.
- Mengatur routing URL di
-
Melakukan Deployment:
- Membuat proyek baru di Pacil Web services (PWS).
- Mengonfigurasi
settings.py
untuk menambahkan URL deployment PWS keALLOWED_HOSTS
. - Melakukan add, commit, dan push ke PWS.
graph TD;
Client -->|Request| urls.py;
urls.py -->|Maps URL| views.py;
views.py -->|Handles Logic| models.py;
views.py -->|Renders Template| templates;
models.py -->|Access Data| Database;
Database -->|Returns Data| models.py;
models.py -->|Returns Data| views.py;
templates -->|DisplaysResponse| Client;
Penjelasan Bagan:
- urls.py
: Menghubungkan URL yang diminta ke aplikasi dan data yang tersedia di views.py.
views.py
: Menampung template variables untuk menampilkan nilai dari variabel yang sudah dibuat dalamcontext
, dan akan di-render di halaman HTML.models.py
: Berisi model data dan menghubungkan ke database.models.py
digunakan olehviews.py
untuk mengambil dan mengolah data dari variabel yang sudah dibuat.- Template (HTML): Mengatur tampilan halaman web. HTML file akan di-render oleh
views.py
dan dikirim sebagai respons ke client.
Git adalah control version software untuk mengelola dan melacak perubahan dalam source code selama pengembangan software. Fungsi utama git:
- sebagai control version yang melacak setiap perubahan yang dibuat di dalam source code sehingga developer bisa kembali ke versi sebelumnya;
- sebagai sarana kolaborasi karena memungkinkan beberapa developer bekerja di berbagai fitur atau memperbaiki bug tanpa mengganggu pekerjaan developer lain melalui branch.
- sebagai development environment melalui branching dan merging sehingga developer bisa membuat cabang untuk pengembangan fitur atau bug fixing kemudian menggabungkannya ke main branch setelah dites.
- menjaga keamanan dan backup karena bisa menyimpan history di remote repository seperti GitHub, GitLab, dll sehingga mengurangi risiko kode hilang.
- Framework Lengkap Django adalah full-stack framework yang menyediakan semua yang dibutuhkan developer seperti Object-Relational Mapping (ORM), template engine, form handling, dan routing.
- Arsitektur MTV (Model-Template-View) Arsitektur Model-Template-View (MTV) memudahkan developer memahami arsitektur aplikasi web.
- Keamanan Terjaga Django menyediakan middleware yang otomatis melindungi aplikasi dari Cross-Site Request Forgery (CSRF) dan juga memiliki mekanisme untuk mencegah Cross-Site Scripting (XSS) dengan secara otomatis meng-escape output HTML.
- Community Support Django memiliki komunitas yang besar dan dokumentasi yang lengkap sehingga beginner friendly :D
Model pada Django disebut sebagai ORM (Object-Relational Mapping) karena terdapat interface antara model di Python (class) dengan relational database (tabel). Dengan prinsip ini, developer bisa bekerja menggunakan database dengan konsep object-oriented tanpa harus membuat query SQL manual. Django ORM mengubah operasi Create, Read, Update, Delete (CRUD) di OOP Python ke query SQL yang bersifat connected dengan database, sehingga memudahkan interaksi aplikasi dengan data.
- Membuat Kerangka Views dengan Skeleton
Saya membuat kerangka views (skeleton) supaya desain web konsisten dan mengurangi redundant code.
- Buat direktori
templates
di folder utama, buat filebase.html
sebagai kerangka yang akan dipakai untuk semua halaman web di aplikasi-aplikasi lain. - Isi
base.html
dengan sintaks HTML dan Django template tags{% block meta %}
dan{% block content %}
untuk bagian-bagian yang bisa diubah oleh template turunan di aplikasi-aplikasi lain. - Buka
settings.py
, tambahkan direktoritemplates
('DIRS': [BASE_DIR / 'templates']
) ke dalam variabelTEMPLATES
supaya template yg sudah dibuat dikenali Django.
- Buat direktori
- Mengubah Primary Key dari Integer Menjadi UUID
Untuk meningkatkan keamanan aplikasi, kita ubah primary key di model dari tipe data integer menjadi UUID (Universally Unique Identifier).
- Pada
models.py
di aplikasimain
, impor moduluuid
dan ubah primary key menjadi UUIDField. - Menjalankan
makemigrations
danmigrate
supaya perubahan yang kita lakukan disimpen di database.
- Pada
- Membuat Form Input Data
- Buat file
forms.py
di direktori main, dan buatModelForm
untuk modelProductEntry
. - Buat field yang akan digunakan dalam form seperti
product_name
,price
,product_description
, danavailable_qty
. - Di
views.py
, buat fungsicreate_mood_entry
untuk menampilkan form dan menyimpan data baru saat form di-submit dan mereturn respons html ke templatecreate_product_entry
. - Validasi form menggunakan function
form.is_valid()
dan simpan data dengan functionform.save()
.
- Buat file
- Menampilkan Data di Halaman Web
- Ambil semua objek dari model
ProductEntry
dengan menambahkan functionProductEntry.objects.all()
dan kirim ke template melalui context yang sudah dibuat sebelumnya. --> function ini akan di-return dengan html di templatemain
. - Pada
main.html
, kita gunakan looping{% for ... %}
untuk menampilkan data dalam bentuk tabel. - Pada
main.html
, kita tambahkan juga tombol untuk mengakses halaman form input data baru.
- Ambil semua objek dari model
- Mengembalikan Data dalam Bentuk XML dan JSON (dan berdasarkan ID)
- Di
views.py
, buat fungsishow_xml
untuk mengambil semua data dari modelMoodEntry
- Gunakan serializers Django untuk mengubah data menjadi format XML.
- Buat juga buat versi jsonnya :)
- Buat fungsi
show_xml_by_id
danshow_json_by_id
di views.py untuk mereturn data berdasarkan id yang sudah difilter sebagai parameter. --> variabel data diubah dari all menjadiProductEntry.objects.filter(pk=id)
- Di
- Menambahkan URL Patterns
- Tambahkan path untuk setiap fungsi view baru di variabel
urlpatterns
supaya bisa diakses di browser. - Mengecek apakah data bisa diambil dengan benar menggunakan postman (screenshoot terlampir di bawah) Setelah melalui 6 langkah ini, kita bisa membuat form, menyimpan data, menampilkan data, dan mereturn data dalam format XML atau JSON di Django
- Tambahkan path untuk setiap fungsi view baru di variabel
-
Memungkinkan kita berinteraksi secara real time dengan platform Dengan menggunakan data delivery, kita bisa mengisi form, mengklik tombol, dan melakukan search. Data yang di-input dalam kegiatan-kegiatan tersebut harus dikirim ke server untuk diproses melalui peran data delivery. Melalui data delivery ini, kita bisa membuat interaksi menjadi lebih interaktif dan dinamis.
-
Memunkinkan kita menerima data yang terbaru Data delivery memastikan bahwa data yang kita terima di platform selalu yang terbaru. Data yang realtime sangat dibutuhkan untuk aplikasi berita, cuaca, harga saham, dll yang membutuhkan data real time.
Contoh: Saat user login ke platform, kredensial kita (misal username dan password) dikirim ke server untuk diverifikasi. Pengiriman tersebut membutuhkan data delivery pada platform. Tanpa data delivery, user tidak bisa melakukan login dan mengakses akun.
JSON (JavaScript Object Notation) dan XML (eXtensible Markup Language) adalah format yang digunakan untuk pertukaran data antara server dan client dalam pengembangan aplikasi. Masing-masing memiliki kelebihan dan kekurangan, tapi JSON dianggap lebih baik daripada XML. Kenapa JSON lebih populer dibandingkan XML?
Kriteria | JSON | XML |
---|---|---|
Keterbacaan | JSON punya struktur yang lebih ringkas dan mudah dibaca manusia. JSON ditulis dalam format key-value pairs sehingga lebih mudah dipahami dan dikelola. | XML menggunakan opening tag dan closing tag untuk elemen datanya sehingga dokumennya lebih panjang dan lebih sulit dibaca. XML cenderung lebih verbose karena harus menggunakan banyak markup untuk menulis data. |
Ukuran data | Karena JSON lebih ringkas, ukuran datanya juga lebih kecil dibanding XML. Karena lebih ringkas, lebih sedikit data yang harus dikirim melalui jaringan, sehingga dapat mengurangi waktu loading dan penggunaan bandwidth. | XML memiliki overhead yang lebih besar karena memerlukan opening tag dan closing tag untuk setiap elemen, yang dapat memperbesar ukuran file. |
Compatibility dengan JavaScript | JSON adalah format yang berasal dari JavaScript, sehingga kompatibel dengan JavaScript. JSON dapat diubah menjadi objek JavaScript tanpa perlu parser lagi. | XML membutuhkan parser untuk mengubah data menjadi objek JavaScript, sehingga lebih lambat dan kompleks. |
Keamanan | JSON lebih aman terhadap serangan seperti XML External Entity (XXE) attack dibandingkan XML. | XML lebih rentan terhadap berbagai jenis serangan karena kompleksitas dan fitur-fiturnya seperti DTD (Document Type Definition). |
- Fungsi is_valid() pada Django Form
- Fungsi
is_valid()
memeriksa apakah data yang diterima dari user (melalui metode POST) memenuhi semua persyaratan yang sudah dibuat dalam form. Jika semua data valid, fungsi akan me-return nilaiTrue
. Jika ada data yang tidak valid, akan me-returnFalse
. - Fungsi
is_valid()
juga mengisi atributcleaned_data
. Ketikais_valid()
bernilaiTrue
, Django akan membersihkan (sanitize) data input lalu me-pass ke dalam atributcleaned_data
pada objek form. - Jika
is_valid()
mengembalikanFalse
, Django akan mengisi atributerrors
pada objek form. Atributerrors
akan berisi informasi tentang kesalahan validasi yang terjadi pada setiap field di form.
- Fungsi
- Mengapa Kita Membutuhkan Method is_valid()?
is_valid()
membantu kita menjaga integritas data karena sudah pasti semua semua data yang disimpan dalam sistem memenuhi persyaratan dan aturan validasi. --> ga mungkin ada data yang tidak lengkap atau formatnya salah.is_valid()
mencegah serangan keamanan seperti SQL Injection atau Cross-Site Scripting (XSS) dengan memastikan bahwa data input sudah disanitasi sebelum diproses atau disimpan dalam database.- Tanpa validasi
is_valid()
, data yang tidak valid bisa menyebabkan error di aplikasi. Misalnya user memasukkan string teks ke field yang seharusnya menerima int.
csrf_token
(Cross-Site Request Forgery token) adalah mekanisme keamanan saat ada request form dan HTTP POST request. Token ini melindungi aplikasi web dari serangan Cross-Site Request Forgery (CSRF) yaitu serangan di mana attacker memanipulasi user untuk mengirim request yang aneh-aneh tanpa diketahui user.
-
Mengapa Kita Membutuhkan
csrf_token
saat Membuat Form di Django? CSRF attack terjadi ketika attacker mensabotase session untuk melakukan action yang tidak diinginkan atas nama user tersebut (misalnya mengubah password, melakukan transaksi keuangan, dll).csrf_token
dihasilkan secara random dan unik, ditambahkan ke setiap form yang memerlukan POST (seperti form login, registrasi, dan update data). Sehingga, attacker tidak bisa mensabotase session tsb. Jika token CSRF tidak valid atau tidak ada, request tersebut dianggap mencurigakan dan akan ditolak oleh Django. -
Apa yang Dapat Terjadi Jika Kita Tidak Menambahkan
csrf_token
pada Form Django?- Attacker bisa mengirim request berbahaya yang mengirimkan POST request ke aplikasi web tanpa sepengetahuan user. Jika user telah masuk ke aplikasi tersebut, session akan digunakan untuk mengautentikasi request tersebut.
- Dengan menggunakan sesi tersebut, attacker bisa memanipulasi data, melakukan transaksi, menghapus akun, atau melakukan tindakan lain yang berdampak pada user atau sistem.
- CSRF attack dapat mengakibatkan hilangnya data user, membocorkan informasi sensitif, dll.
-
Bagaimana hal tersebut dapat dimanfaatkan oleh attacker?
- Attacker bisa membuat web palsu/email phishing yang mengandung form HTML atau link berbahaya. Saat user masuk ke aplikasi atau mengklik link atau mengirim form, POST request akan dikirim ke server menggunakan sesi user tersebut.
- Dengan menggunakan JavaScript atau hidden element, attacker bisa mengirim data secara otomatis ke aplikasi web target saat user reload webpage atau melakukan tindakan tertentu (seperti mengklik tombol).
- Karena permintaan datang dari sesi user yang sah, server akan mempercayai permintaan tersebut dan menganggap bahwa itu berasal dari user yang sah.
Pada tugas ini, kita akan membangun sistem registrasi dan autentikasi user pada aplikasi Django yang telah dibuat. Dengan adanya sistem ini, user harus memiliki akun yang valid untuk mengakses halaman utama aplikasi dan hanya dapat melihat data yang terkait dengan akun mereka.
Dalam mengimplementasikan Autentikasi, Session, dan Cookies pada Django untuk memenuhi checklist Tugas 4, terdapat 6 langkah utama yang perlu dilakukan:
-
Membuat Form untuk Registrasi dan Fungsi yang menghandle tugas tersebut
- Pertama, kita akan mengimport modul
UserCreationForm
danmessages
dari Django untuk membuat form registrasi dan menampilkan pesan notifikasi. - Kemudian, kita akan membuat fungsi
register
untuk menghandle user yang akan melakukan registrasi akun. Fungsi ini memiliki 6 fungsi utama:- Menampilkan form registrasi saat pertama kali diakses.
- Memproses data form ketika user mengirimkan data.
- Memvalidasi data yang dimasukkan user.
- Menyimpan data user baru ke dalam database.
- Menampilkan pesan sukses jika pendaftaran berhasil.
- Mengarahkan user ke halaman login.
- Setelah membuat fungsi
register
, kita akan membuat templateregister.html
sebagai tampilan form registrasi. Pada template tersebut, kita menggunakan tag{{ form.as_table }}
untuk menampilkan field-field form secara otomatis. - Terakhir, kita akan menambahkan URL Pattern di
urls.py
sehingga user bisa mengakses halaman/register
dan melakukan registrasi dengan fungsiregister
.
- Pertama, kita akan mengimport modul
-
Membuat Login Form
- Pertama, kita akan mengimpor modul
AuthenticationForm
,authenticate
, danlogin
dari Django untuk menghandle proses autentikasi. - Setelah itu, kita akan membuat fungsi
login_user
untuk menghandle user yang akan melakukan login ke aplikasi. Fungsi ini memiliki 5 fungsi utama:- Memproses data login form.
- Memvalidasi data login.
- Melakukan autentikasi user.
- Membuat session untuk user yang berhasil login.
- Mengarahkan user ke halaman utama (aplikasi main).
- Setelah membuat fungsi
login_user
, kita akan membuat templatelogin.html
sebagai tampilan halaman login. - Terakhir, kita akan menambahkan URL Pattern di
urls.py
sehingga user bisa mengakses halaman/login
dan melakukan autentikasi dengan fungsilogin_user
.
- Pertama, kita akan mengimpor modul
-
Membuat Fungsi Logout
-
Pertama, kita akan mengimpor modul
logout
dari Django untuk menghandle proses logout. -
Setelah itu, kita akan membuat fungsi
logout_user
untuk menghandle user yang akan melakukan logout. Fungsi ini memiliki 3 fungsi utama:- Menghapus user session yang sedang aktif.
- Mengarahkan user ke halaman login.
- Hapus cookie
last_login
.
-
Setelah membuat fungsi
logout_user
, kita akan membuat tombol logout pada halaman utama dan menghubungkannya dengan fungsilogout_user
. -
Terakhir, kita akan menambahkan URL Pattern di
urls.py
sehingga user bisa mengakses halaman/logout
dan mengakses fungsilogin_user
.
-
-
Merestriksi Akses Halaman Utama
Kita hanya ingin halaman utama dapat diakses oleh user yang sudah melakukan login. Oleh sebab itu, kita perlu melakukan restriksi akses ke halaman utama terbatas kepada user yang sudah melakukan login. Kita akan menggunakan decorator
login_required
pada fungsishow_main
yang sudah dibuat sebelumnya untuk memastikan hanya user yang sudah login yang dapat mengakses halaman utama. -
Menggunakan Cookies untuk Menyimpan Data Login Terakhir
- Kita akan menyimpan data login terakhir dengan menambahkan kode
response.set_cookie('last_login', str(datetime.datetime.now()))
di fungsilogin_user
untuk menyimpan waktu login terakhir dalam bentuk cookie saat user berhasil login. - Setelah menyimpan data login terakhir, kita akan menampilkannya pada halaman utama dengan cara menambahkan informasi cookie
last_login : request.COOKIES['last_login']
padacontext
diviews.py
lalu memanggil nilainya di halaman utama (main.html
) - Kita juga akan menghapus cookie saat user logout dengan menambahkan kode
response.delete_cookie('last_login')
di fungsilogout_user
- Kita akan menyimpan data login terakhir dengan menambahkan kode
-
Menghubungkan Model
ProductEntry
denganUser
Kita ingin seorang user hanya melihat product entries yang telah dibuat sendiri. Oleh karena itu, kita perlu menghubungkan model
ProductEntry
denganUser
dengan cara:- Tambah field
user
yang bertipeForeignKey
pada modelProductEntry
untuk menghubungkan setiap entri product dengan user yang membuatnya. - Setelah membuat field
user
, kita akn mengubah fungsicreate_product_entry
untuk menyimpan user yang sedang login sebagai pemilik entri mood dengan meset variabel user di modelProductEntry
dengan menambahkan kodeproduct_entry.user = request.user
- Selanjutnya, kita akan memfilter data
ProductEntry
supaya hanya menampilkan entri product yang dimiliki oleh user yang sedang login dengan mengubah variabelproduct_entries
di fungsishow_main
yang awalnya bernilaiMoodEntry.objects.all()
menjadiMoodEntry.objectsfilter(user=request.user)
- Setelah membuat perubahan pada model
ProductEntry
, kita melakukan migrasi untuk memperbarui struktur database.
- Tambah field
Kriteria | HttpResponseRedirect() |
redirect() |
---|---|---|
Level of abstraction | Merupakan low level function sehingga developer bisa memiliki kontrol yang lebih besar untuk pengaplikasian fungsi tersebut. HttpResponseRedirect() bisa mengatur atribut-atribut HTTP respons (misalnya status code, header, cookie, dll). |
Merupakan high level function yang merupakan shortcut dari HttpResponseRedirect() . redirect() menyederhanakan proses pembuatan objek HttpResponseRedirect karena secara otomatis mengatur status code dan header yang biasanya digunakan untuk redirect. |
Penggunaan | Biasanya digunakan dalam situasi yang memerlukan HTTP response customization yang lebih detail. Contoh: ketika mau mengatur status code yang berbeda (misal, 301 untuk redirect permanen) atau menambahkan header custom. | Biasanya lebih sering dipakai karena lebih mudah digunakan dan cukup fleksibel untuk kebutuhan redirect (tanpa situasi khusus/customization). |
Contoh Penggunaan | from django.http import HttpResponseRedirect# Menggunakan HttpResponseRedirect()def my_view(request): response = HttpResponseRedirect('/success/') response['Location'] = 'https://example.com' # Mengatur lokasi redirect secara manual return response |
from django.shortcuts import redirect # Menggunakan redirect()def my_view(request): return redirect('success') # Menggunakan URL name |
Kapan sebaiknya digunakan? | URLconf . |
URLconf . |
Secara garis besar, redirect()
lebih banyak digunakan karena lebih mudah dibaca, lebih terintegrasi dengan Django, dan lebih fleksibel. Tapi, HttpResponseRedirect()
tetap berguna ketika perlu melakukan redirect permanen (301), header customization, dan redirect ke URL eksternal.
Dalam Django, kita menghubungkan satu model dengan model lainnya untuk merepresentasikan hubungan antara data. Dalam kasus ini, kita mau menghubungkan model ProductEntry
dan User
karena kita ingin mengetahui siapa yang membuat entri product tersebut. Hubungan ini disebut relasi atau hubungan antar model.
Pada penghubungan model, kita menggunakan ForeignKey
. ForeignKey
adalah tipe field dalam Django yang digunakan untuk membuat hubungan one-to-one atau one-to-many antara dua model. Dalam kasus ProductEntry
dan User
, ForeignKey
akan membuat sebuah kolom tambahan dalam tabel ProductEntry
yang berisi ID dari user yang bersangkutan. Sehingga, setiap entri product akan menunjuk ke satu user tertentu (yang membuatnya).
Cara Kerja Penghubungan MoodEntry
dengan User
-
Tambah Field
user
pada modelProductEntry
Di file
models.py
, kita tambahkan fielduser
dengan tipeForeignKey
ke modelMoodEntry
.from django.db import models from django.contrib.auth.models import User class MoodEntry(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) # ... dst
-
Atur parameter
on_delete
Parameteron_delete
berfungsi untuk mengatur apa yang terjadi pada data ketika objeknya dihapus. Kita akan assign nilai parameter denganmodels.CASCADE
berarti jika user dihapus, maka semua entri product yang terkait dengan user tersebut juga akan dihapus. -
Simpan perubahan Setelah melakukan perubahan pada model, kita akan menjalankan perintah
python manage.py makemigrations
danpython manage.py migrate
untuk membuat dan menerapkan perubahan pada database.
-
Perbedaan authentication dan authorization, apakah yang dilakukan saat user login
Kriteria Authentication Authorization Definisi Proses verifikasi identitas user. Menjawab pertanyaan "Siapa kamu?" Proses pemberian izin kepada user yang sudah terverifikasi untuk mengakses resources atau melakukan request. Menjawab pertanyaan "Apa yang boleh kamu lakukan?". Tujuan Memastikan bahwa user adalah orang yang dia klaim (benar-benar dia) Mengontrol akses ke bagian-bagian sistem yang berbeda berdasarkan role user Mekanisme Biasanya menggunakan kredensial seperti username dan password, biometrik (sidik jari, wajah), token, atau OTP (One-Time Password) Menggunakan kebijakan akses seperti role-based access control (RBAC) atau attribute-based access control (ABAC) Contoh Memasukkan username dan password untuk masuk ke akun email, misalnya login ke SCELE Jika user memasukkan username dan password yang terasosiasi dengan role dosen, maka ia bisa membuat course baru, sedangkan jika user memasukkan username dan password yang terasosiasi dengan role mahasiswa, maka ia tidak bisa membuat course baru Implementasi Kebanyakan menggunakan library atau framework autentikasi yang sudah jadi Biasanya diimplementasikan dengan menggunakan role, permission, atau kebijakan yang lebih custom Urutan Proses Biasanya dilakukan duluan sebelum otorisasi Dilakukan setelah autentikasi berhasil -
Bagaimana Django mengimplementasikan kedua konsep tersebut
-
Autentikasi di Django
- Model
User
: Django memiliki modelUser
bawaan yang menyimpan informasi dasar seperti username, password, email, dll. Kita juga bisa meng-custom model tersebut. - Form autentikasi: Django menyediakan form
AuthenticationForm
yang bisa digunakan untuk menghandle login user. Form ini memeriksa apakah username dan password yang dimasukkan cocok dengan data yang ada di database. - Middleware: Berfungsi untuk memeriksa apakah user sudah melakukan login atau belum. Jika belum, user akan diarahkan ke halaman login.
- Session: Django menggunakan session untuk menyimpan informasi tentang user yang sedang login, sehingga sistem dapat mengetahui siapa yang sedang berinteraksi dengan aplikasi.
- Model
-
Otorisasi di Django
- Permission: Kita bisa membuat permission (izin) yang spesifik untuk setiap model atau action. Misal, kita bisa memberikan izin
delete_product
untuk menghapus produk bagi role admin. - Group: Kita bisa mengelompokkan permission ke dalam group. Contoh: group "client" memiliki permission "add_to_cart", "buy_items", dan "delete_from_cart".
- Custom Permission: Kita bisa membuat permission custom untuk kebutuhan spesifik.
- Permission: Kita bisa membuat permission (izin) yang spesifik untuk setiap model atau action. Misal, kita bisa memberikan izin
-
-
Bagaimana Django mengingat user yang telah login? Django menggunakan sistem session untuk mengingat user yang telah login.
- Pembuatan Session Ketika user berhasil login, Django akan membuat sebuah session yang unik untuk user tersebut. Session ini akan disimpan di server, bukan di browser pengguna. Setiap session memiliki session ID yang unik. Session ID tersebut akan dikirimkan ke browser user melalui cookie.
- Cookie Session ID Browser user akan menyimpan cookie session ID yang sudah dibuat saat user login. Setiap kali user mengirim request ke server, cookie session ID ini akan ikut dikirim dalam header request.
- Pencocokan Session Django akan memeriksa cookie session ID yang dikirim oleh browser. Jika session ID valid, Django akan mengambil data session dari server dan mengidentifikasi bahwa user tersebut sudah login. Namun, jika request tidak mengandung session ID atau session ID tidak valid, django akan mengidentifikasi bahwa user tersebut belum login dan menolak request yang dikirim.
-
Kegunaan lain dari cookies dan keamanan cookies
- Dengan menggunakan cookies, website bisa mengingat pengaturan user (misal: font size, color theme, atau page layout) sehingga meningkatkan user experience.
- Cookies membantu melacak perilaku user di website (misal: halaman yang sering dikunjungi, durasi, pola click, dll) yang membantu analisis web.
- Cookies dapat digunakan oleh perusahaan pengiklan untuk membuat user profile berdasarkan minat dan perilaku user di berbagai website. User profile ini kemudian digunakan untuk menampilkan iklan yang relevan dengan minat pengguna.
-
Apakah semua cookies aman digunakan?
Tidak semua cookies aman digunakan. Meskipun cookies memiliki banyak manfaat, terdapat beberapa risiko antara lain:
- Cookies bisa dipakai untuk melacak aktivitas user sehingga memungkinkan pihak tertentu membuat profil rinci tentang minat dan kebiasaan pengguna. Hal ini bisa saja merupakan pelanggaran privasi.
- Jika cookies tidak dikelola dengan aman, data yang tersimpan bisa dicuri. Hal ini menyebabkan informasi sensitif (misal kata sandi, informasi kartu kredit, dll) bisa bocor.
- Cross-Site Scripting (XSS). Cookies bisa digunakan untuk melakukan XSS, di mana attacker menyuntikkan skrip ke dalam situs web yang kemudian dieksekusi di browser pengguna.
- Cookie Poisoning untuk memodifikasi isi cookie untuk menipu server.
-
Implementasi Fungsi Hapus dan Edit Product
- Pertama, kita buka file
views.py
di foldermain
dan tambahkan fungsi baru bernamaedit_product
yang menerima parameterrequest
danid
. Fungsi ini digunakan untuk mengedit data product, jadi kita perlu mengambil data product yang ingin diedit berdasarkan id yang diberikan. - Kita kembali buka file
views.py
di foldermain
dan tambahkan fungsi baru bernamadelete_product
yang menerima parameterrequest
danid
. Fungsi ini digunakan untuk menghapus data product, jadi kita perlu mengambil data product yang ingin dihapus berdasarkan id yang diberikan. - Setelah menambahkan fungsi untuk mengedit dan menghapus produk, kita buka file
urls.py
di folder main dan tambahkan URL pattern untuk mengakses fungsiedit_product
dandelete_product
. - Kemudian, kita akan membuat template HTML sebagai interface supaya user bisa mengedit produk. Buka folder main/templates, buat template baru bernama
edit_product.html
untuk mengedit data product. - Kita juga akan menambahkan 2 buah tombol untuk mengedit dan menghapus produk untuk setiap produk yang ada. Buka template
main.html
dan tambahkan tombol edit dan hapus untuk setiap product.
- Pertama, kita buka file
-
Kustomisasi Desain
- Saya menggunakan framework css bootstrap dalam melakukan kustomisasi design. Pertama, kita tambahkan bootstrap di
base.html
untuk mengaktifkan fitur-fitur responsif yang disediakan oleh bootstrap. - Selanjutnya, kita kustomisasi halaman login di
login.html
. Pada halaman login, saya menggunakan fitur card yang disediakan bootstrap. Pada header card berisi heading 'login', sedangkan pada body card berisi tabel untuk menampilkan form login dengan tabel (form.as_table
) - Saya juga mengkustomisasi halaman register di
register.html
sama persis dengan halaman login, menggunakan fitur card yang berisi tabel untuk menampilkan form register dengan tabel (form.as_table
) - Selanjutnya, saya akan mengkustomisasi halaman tambah produk di
create_product_entry.html
. Sama dengan kustomisasi sebelumnya, saya menggunakan fitur card yang berisi tabel untuk menampilkan form register dengan tabel (form.as_table
) - Setelah itu, saya mengkustomisasi halaman
main.html
. Terdapat elemen heading yang bertuliskan 'Welcome to Pacilbay', saya juga menambahkan quote di bawah heading tersebut diikuti dengan informasi pribadi user. Saya menggunakan classrow
yang disediakan bootstrap dengan 3 kolom untuk menampilkan NPM, nama, dan kelas dari user. Selanjutnya, saya akan mengecek apakah terdapat product entries. Jika tidak ada product entries, akan muncul tulisan 'Belum ada data product pada Pacilbay :(' diikuti dengan gambar. Jika sudah ada product entries, saya mengiterasi setiap produk yang ada dan memanggil templatecard.html
sebagai interface card untuk menampilkan setiap produknya dengan mengirimkan parameterproduct_entry
. - Saya membuat template
card.html
untuk menampilkan detail informasi dari setiap produk. Saya menggunakan fitur kolom yang disediakan oleh bootstrap untuk menampilkan nama produk, kuantitas produk, deskripsi produk, dan harga. Saya juga menambahkan dua tombol untuk mengedit produk dan menghapus produk menggunakan classhstack
(horizontal stack) yang disediakan oleh bootstrap. - Masih dalam file yang sama, saya juga menambahkan
modal
/pop up tambahan yang berisi pesan konfirmasi saat user menekan tombol delete. Dalam pop up tersebut berisi tombol 'Cancel' untuk kembali ke halaman main tanpa menghapus produk, dan tombol 'Delete' untuk menghapus produk dan kembali ke halaman main.
- Saya menggunakan framework css bootstrap dalam melakukan kustomisasi design. Pertama, kita tambahkan bootstrap di
-
Membuat Navigation Bar
- Pertama, kita buat file
navbar.html
pada foldertemplates
di root folder untuk membuat navigation bar. - Dalam file tersebut, kita melakukan pengecekan apakah user sudah diotentikasi atau belum. Jika user belum diotentikasi, navbar akan menampilkan menu untuk login dan register. Jika user sudah diotentikasi, navbar akan menampilkan menu 'Home' untuk menampilkan halaman utama, 'Logout' untuk melakukan logout, dan 'Add product' untuk menambahkan item product.
- Terakhir, kita akan navbar tersebut ke semua template halaman web yang kita punya dengan menyertakan
{% include 'navbar.html' %}
- Pertama, kita buat file
Jika terdapat beberapa CSS selector untuk suatu elemen HTML, jelaskan urutan prioritas pengambilan CSS selector tersebut!
Ketika terdapat beberapa CSS selector yang diterapkan pada elemen HTML yang sama, browser akan menentukan CSS mana yang diterapkan berdasarkan prioritas atau yang dikenal dengan istilah specificity. Hal ini berguna untuk mencegah terjadinya konflik style yang bertabrakan. Urutan prioritas:
-
Inline Styles
Style yang diterapkan langsung pada elemen melalui atributstyle
memiliki prioritas paling tinggi. Karena Style ini ditulis langsung di dalam elemen HTML, Inline Styles akan selalu diutamakan dibandingkan selector lainnya. Contoh:<p style="color: red;">Teks ini merah</p>
Pada contoh di atas,
color: red
akan selalu diterapkan karena ditulis secara langsung di dalam elemen.
-
ID Selector ID Selector memiliki prioritas kedua setelah inline styles. Setiap elemen HTML dapat memiliki atribut id yang unik, dan style yang diterapkan pada ID ini akan mengalahkan style yang berasal dari class, atribut, atau elemen.
Contoh:
#judul { color: blue; }
Jika sebuah elemen memiliki ID judul, maka style yang ditetapkan di atas akan diterapkan pada elemen tersebut, kecuali ada inline style yang mengubahnya.
-
Class, Attribute, dan Pseudo-class Selector Class selector, atribut (misalnya
[type="text"]
), dan pseudo-class (misalnya:hover
,:active
) ada di tingkat prioritas ketiga. Jika tidak ada ID atau inline style yang mengubahnya, style dari class atau pseudo-class akan diterapkan.Contoh:
.button { background-color: green; }
style ini akan diterapkan pada elemen yang memiliki class
button
, namun akan kalah jika elemen tersebut memiliki ID atau inline style yang berbeda. -
Element dan Pseudo-element Selector Selector elemen (misalnya
h1
,p
,div
) dan pseudo-elemen (misalnya::before
,::after
) memiliki prioritas paling rendah. Ini berarti style yang diterapkan pada elemen hanya akan berlaku jika tidak ada style lain yang lebih spesifik.Contoh:
p { font-size: 16px; }
style ini hanya akan diterapkan jika tidak ada selector class, ID, atau inline style yang mengatur ukuran font pada elemen
.
Mengapa responsive design menjadi konsep yang penting dalam pengembangan aplikasi web? Berikan contoh aplikasi yang sudah dan belum menerapkan responsive design!
Responsive design adalah konsep dalam web development yang memastikan tampilan dan fungsionalitas website tetap optimal dari berbagai perangkat yang digunakan oleh user (misalnya desktop, tablet, atau smartphone). Konsep ini menjadi sangat penting karena seiring berjalannya waktu, penggunaan internet melalui perangkat mobile terus meningkat, sehingga website harus dapat menyesuaikan diri dengan berbagai ukuran layar dan resolusi.
Mengapa responsive design penting?
-
User Experience yang Lebih Baik Dengan responsive design, user dapat mengakses konten dengan mudah tanpa harus memperbesar atau memperkecil layar secara manual. Navigasi yang mudah dan tampilan yang proporsional akan meningkatkan kepuasan user saat menggunakan aplikasi.
Contoh: Sebuah situs berita yang tidak responsive mungkin membuat user mobile kesulitan membaca artikel karena teksnya terlalu kecil atau elemen-elemen layout berantakan. Website yang responsive akan secara otomatis menyesuaikan ukuran teks dan gambar agar mudah diakses dari layar kecil.
-
Meningkatkan SEO (Search Engine Optimization) Google mengutamakan website yang responsive dalam hasil pencarian, terutama untuk pencarian melalui perangkat mobile. Situs yang tidak responsive bisa kehilangan peringkat di search engine, yang berdampak pada berkurangnya pengunjung.
Contoh: Jika sebuah e-commerce website tidak responsive, Google akan menurunkan peringkatnya di hasil pencarian pengguna mobile, sehingga trafik dan potensi penjualan bisa menurun.
-
Efisiensi dalam Pengembangan dan Pemeliharaan Responsive design memungkinkan developer hanya perlu membuat satu versi situs yang dapat menyesuaikan tampilan di berbagai perangkat. Hal ini mengurangi kebutuhan untuk mengembangkan dan memelihara beberapa versi situs untuk desktop dan mobile.
Contoh: Daripada membuat satu website untuk desktop dan satu lagi untuk mobile, sebuah situs responsive bisa berfungsi baik di semua perangkat dengan hanya satu kode yang sama.
-
Adaptasi pada Berbagai Perangkat Karena pengguna mengakses internet dari berbagai jenis perangkat dengan ukuran layar yang berbeda, dari smartphone hingga monitor besar, website yang tidak responsive akan terlihat tidak proporsional. Responsive design memastikan tampilan tetap konsisten dan optimal di semua perangkat.
Contoh: Sebuah aplikasi pembelajaran online mungkin harus memastikan video, teks, dan quiz tetap mudah diakses baik di layar besar laptop maupun di layar kecil smartphone.
-
Airbnb Airbnb memiliki desain yang responsif di mana layout dan elemen UI (User Interface) otomatis menyesuaikan diri dengan ukuran layar pengguna. Pada perangkat mobile, navigasi dan konten tetap mudah diakses, gambar dioptimalkan, dan tombol lebih besar agar lebih mudah ditekan dengan jari.
-
Medium Medium, platform blog populer juga telah menerapkan responsive design. Artikel-artikel di Medium dapat dibaca dengan nyaman di berbagai ukuran layar, dengan teks yang mudah dibaca, gambar yang responsif, dan navigasi yang sederhana baik di desktop maupun mobile.
-
Situs Sekolah yang Ketinggalan Zaman Beberapa situs sekolah atau instansi pendidikan yang lama tidak menerapkan responsive design, sehingga ketika diakses melalui perangkat mobile, teksnya sangat kecil, tata letaknya kacau, dan tombol-tombolnya sulit diakses. User harus memperbesar layar untuk membaca konten atau menekan tombol.
-
Situs Berita Lama Beberapa situs berita yang sudah ada sejak lama dan belum diperbarui sering kali tidak responsif. Saat dibuka di perangkat mobile, layout yang kacau membuat user kesulitan untuk membaca artikel, dan elemen-elemen seperti gambar atau iklan sering kali menutupi sebagian besar layar.
Jelaskan perbedaan antara margin, border, dan padding, serta cara untuk mengimplementasikan ketiga hal tersebut!
Dalam web development, margin, border, dan padding adalah tiga properti CSS untuk mengatur tata letak dan spasi antar elemen.
-
Margin
Margin adalah ruang di luar elemen, yang mengatur jarak antara elemen tersebut dengan elemen lain di sekitarnya. Margin berada di paling luar dari box model dan tidak memengaruhi tampilan elemen itu sendiri, hanya jaraknya dari elemen lain.
Untuk mengatur margin bisa diatur secara keseluruhan (misalnya margin: 20px;) atau untuk setiap sisi (atas, kanan, bawah, kiri) dengan nilai yang berbeda.
Contoh:
.box { /* Margin sama untuk semua sisi */ margin: 20px; } .box1 { /* Margin berbeda untuk setiap sisi (top, right, bottom, left) */ margin: 10px 15px 20px 25px; }
-
Border Border adalah garis yang mengelilingi elemen dan terletak di antara padding dan margin. Border membatasi elemen secara visual dan bisa diatur ketebalan, warna, dan stylenya.
Untuk mengatur border biasanya diatur dengan properti shorthand seperti border, atau bisa diatur secara terpisah dengan
border-width
,border-style
, danborder-color
./* Border sama di semua sisi */ border: 2px solid blue; /* Border berbeda untuk setiap sisi */ border-top: 2px solid red; border-right: 2px solid green; border-bottom: 2px solid blue; border-left: 2px solid black;
-
Padding Padding adalah ruang di dalam elemen, yang mengatur jarak antara konten elemen (misalnya teks atau gambar) dengan border elemen. Padding memberikan "ruang bernapas" pada konten di dalam elemen tersebut.
Padding bisa diatur dengan cara yang mirip seperti margin. Kita bisa menggunakan shorthand untuk mengatur semua sisi sekaligus, atau mengatur setiap sisi secara terpisah.
/* Padding sama untuk semua sisi */ padding: 10px; /* Padding berbeda untuk setiap sisi (top, right, bottom, left) */ padding: 5px 10px 15px 20px;
Margin, border, dan padding dapat digunakan bersamaan untuk membuat elemen HTML dengan jarak, border, dan padding yang diatur seperti:
.box { margin: 20px; /* Jarak elemen dari elemen lain */ padding: 15px; /* Jarak konten di dalam elemen dengan border */ border: 2px solid black; /* Garis batas elemen */ }
<div class="box"> Ini adalah konten di dalam box dengan margin, border, dan padding. </div>
Dalam CSS, Flexbox dan Grid Layout adalah dua sistem tata letak modern yang membantu dalam mengatur elemen di halaman web. Masing-masing dapat menyusun elemen secara fleksibel dan responsif, dan memungkinkan desain yang kompleks dan mudah dikelola.
-
Flexbox (Flexible Box Layout)
Flexbox adalah sistem tata letak satu dimensi yang dirancang untuk menyusun elemen secara fleksibel baik secara horizontal (baris) maupun vertikal (kolom). Flexbox sangat berguna untuk tata letak yang dinamis dan responsif. Elemen-elemen yang ada di dalamnya bisa secara otomatis menyesuaikan diri tergantung pada ukuran layar atau ruang yang tersedia.
Kegunaan Flexbox
- Menyusun elemen secara fleksibel dalam baris atau kolom.
- Mudah digunakan untuk tata letak yang tidak terlalu rumit atau tata letak satu dimensi (baik baris atau kolom, tetapi bukan keduanya).
- Mengatasi masalah alignment (penyelarasan), seperti vertikal tengah atau jarak antar elemen yang sama tanpa menggunakan padding/margin yang rumit.
- Fleksibel untuk menyesuaikan elemen di dalam container, misalnya membuat elemen tetap responsif saat layar diperkecil atau diperbesar.
Contoh Implementasi Flexbox
.container { display: flex; justify-content: space-between; align-items: center; }
<div class="container"> <div class="box">Box 1</div> <div class="box">Box 2</div> <div class="box">Box 3</div> </div>
Pada contoh di atas:
display: flex
membuat elemen di dalam .container diatur dalam baris secara otomatis.justify-content: space-between
menyusun elemen di dalam container dengan jarak yang merata.align-items: center
menyusun elemen secara vertikal di tengah.
Properti Utama Flexbox
flex-direction
: Menentukan apakah elemen diatur dalam baris (row) atau kolom (column).justify-content
: Mengatur bagaimana elemen disusun di sepanjang baris (misalnyacenter
,space-between
,space-around
).align-items
: Menyusun elemen secara vertikal di dalam container.flex-wrap
: Mengatur apakah elemen dapat diteruskan ke baris/kolom baru jika tidak muat dalam satu baris atau kolom.
-
CSS Grid Layout
CSS Grid adalah sistem tata letak dua dimensi yang lebih kompleks dibandingkan Flexbox. Grid bisa menyusun elemen dalam baris dan kolom secara bersamaan sehingga lebih cocok untuk tata letak halaman yang lebih rumit. Grid bisa kita tentukan ukuran, jarak, dan alignment dari elemen-elemen di dalamnya.
Kegunaan Grid Layout
- Membuat tata letak dua dimensi (baris dan kolom) yang rumit terstruktur.
- Cocok untuk layout keseluruhan halaman yang perlu pembagian posisi dengan presisi, misal: header, sidebar, konten utama, dan footer.
- Fleksibilitas untuk mengatur ukuran setiap kolom dan baris secara proporsional, atau menggunakan ukuran fixed.
Contoh Implementasi Grid Layout
.container { display: grid; grid-template-columns: 1fr 2fr; grid-template-rows: auto; gap: 20px; }
<div class="container"> <div class="header">Header</div> <div class="sidebar">Sidebar</div> <div class="content">Main Content</div> <div class="footer">Footer</div> </div>
Pada contoh di atas:
display: grid
membuat container menjadi grid.grid-template-columns: 1fr 2fr
membuat dua kolom, dengan kolom kedua memiliki dua kali lebar kolom pertama.gap: 20px
mengatur jarak antara elemen grid.
Properti Utama Grid Layout
grid-template-columns
: Menentukan jumlah dan ukuran kolom.grid-template-rows
: Menentukan jumlah dan ukuran baris.gap
: Mengatur jarak antara baris dan kolom.grid-area
: Menentukan tata letak area tertentu pada grid (misalnya header, footer, dll.).
-
AJAX Get Pada aplikasi PacilBay, AJAX Get digunakan untuk mengambil data produk yang sudah ada dan memperbarui konten HTML tanpa perlu me-reload seluruh halaman sehingga memberikan user experience yang lebih baik karena halaman menjadi lebih responsif. Langkah-langkah implementasi AJAX Get dalam PacilBay:
- Kita akan mengganti bagian card yang digunakan untuk menampilkan detail produk, dan menggantinya dengan placeholder dengan ID
product_entry_cards
. Elemen ini akan diisi dengan data mood yang diambil secara dinamis menggunakan AJAX. - Kita akan membuat fungsi javascript untuk mengambil data produk untuk melakukan AJAX Get ke server untuk mengambil data product. Kita akan menggunakan
fetch()
yang merupakan API bawaan JavaScript untuk membuat request. - Kita juga akan memastikan bahwa data yang kita ambil adalah data milik user yang sedang login dengan menambahkan CSRF token ke header permintaan AJAX.
async function getProductEntries(){ return fetch("{% url 'main:show_json' %}").then((res) => res.json()) }
- Kita akan membuat URL endpoint, method (GET), dan header yang diperlukan. Selanjutnya, setelah data diterima, parse data JSON menjadi objek JavaScript yang dapat digunakan untuk memperbarui tampilan
- Setelah kita memparse objek JSON menjadi objek javascript, kita akan menambahkan konten tersebut untuk memperbarui tampilan HTML dalam bentuk cards yang berisi detail produk.
async function refreshProductEntries() { document.getElementById("product_entry_cards").innerHTML = ""; document.getElementById("product_entry_cards").className = ""; const productEntries = await getProductEntries(); let htmlString = ""; let classNameString = ""; if (productEntries.length === 0) { classNameString = "flex flex-col items-center justify-center min-h-[24rem] p-6"; htmlString = ` <!-- Kode untuk menampilkan gambar jika tidak ada produk dalam PacilBay --> `; } else{ classNameString = "relative grid grid-cols-1 sm:grid-cols-2 gap-8 lg:grid-cols-3 gap-8" productEntries.forEach((item) => { const product_name = DOMPurify.sanitize(item.fields.product_name); // Membersihkan data dari XSS Script const price = DOMPurify.sanitize(item.fields.price); const product_description = DOMPurify.sanitize(item.fields.product_description); const available_qty = DOMPurify.sanitize(item.fields.available_qty); htmlString += ` <!-- Kode untuk menampilkan card jika ada produk yang terdaftar dalam PacilBay --> `; }); } document.getElementById("product_entry_cards").className = classNameString; document.getElementById("product_entry_cards").innerHTML = htmlString; } refreshProductEntries();
- Kita akan mengganti bagian card yang digunakan untuk menampilkan detail produk, dan menggantinya dengan placeholder dengan ID
-
AJAX Post
AJAX POST digunakan untuk mengirim data dari klien (browser) ke server. Dalam konteks aplikasi PacilBay, kita akan menggunakan POST untuk menambahkan produk baru ke database. Dengan menggunakan AJAX, user dapat menambahkan produk tanpa harus melakukan reload halaman. Langkah-langkah implementasi AJAX Post:
- Kita akan membuat tombol yang akan digunakan untuk mentrigger event untuk mengirimkan Ajax Post. Saya meletakkan tombol ini di sebelah tombol untuk menambahkan produk (tanpa AJAX). Kemudian, kita akan membuat modal yang berisi form untuk input data produk.
- Dalam
views.py
, kita akan buat view baru yang akan menangani POST request. Dalam view ini, ambil data dari request POST, validasi data, dan simpan ke dalam database.
@csrf_exempt @require_POST def add_product_entry_ajax(request): product_name = strip_tags(request.POST.get("product_name")) price = strip_tags(request.POST.get("price")) product_description = strip_tags(request.POST.get("product_description")) available_qty = strip_tags(request.POST.get("available_qty")) user = request.user new_product = ProductEntry( product_name = product_name, price = price, product_description = product_description, available_qty = available_qty, user=user ) new_product.save() return HttpResponse(b"CREATED", status=201)
- Setelah menambah function baru pada view, kita akan menambahkan path baru yang mengarah ke view yang baru dibuat di dalam
urls.py
- Setelah tampilan dan fungsi dibuat, kita akan menghubungan form dengan path. Kita akan atur atribut action pada form ke path yang telah dibuat. Setelah itu, kita akan gunakan metode POST untuk mengirimkan data ke server untuk disimpan dalam database.
- Terakhir, kita akan mengirim data menggunakan AJAX. Pertama, kita akan buat event listener pada tombol submit form. Kemudian, kita akan menggunakan
fetch()
untuk mengirim POST request ke server. Kemudian, kita akan menghandle respons dengan memperbarui tampilan dan menutup modal (jika berhasil) atau menampilkan pesan error (jika gagal)
function addProductEntry() { fetch("{% url 'main:add_product_entry_ajax' %}", { method: "POST", body: new FormData(document.querySelector('#productEntryForm')), }) .then(response => refreshProductEntries()) document.getElementById("productEntryForm").reset(); // menghapus data yang sudah ada di modal document.querySelector("[data-modal-toggle='crudModal']").click(); return false; }
JavaScript adalah bahasa pemrograman yang penting dalam pengembangan web modern karena memungkinkan kita untuk membuat halaman web yang interaktif, dinamis, dan responsif. Manfaat javascript:
-
Menambah interaktivitas
JavaScript memungkinkan kita membuat elemen-elemen di halaman web menjadi interaktif. Misal ketika user mengklik tombol, JavaScript bisa mentrigger aksi tertentu seperti menampilkan sebuah modal, menjalankan animasi, atau mengirim data ke server. JavaScript juga bisa digunakan untuk memvalidasi input user sebelum data dikirim ke server sehingga mengurangi potensi kesalahan data dan meningkatkan kualitas data.
-
Menambahkan dinamisme
JavaScript membuat kita bisa memanipulasi Document Object Model (DOM) sehingga kita bisa mengubah konten, style, dan struktur halaman secara dinamis. JavaScript juga bisa membuat efek visual yang lebih kompleks seperti animasi, transition, dan hover
-
Menambahkan responsivitas web
JavaScript membuat kita bisa membangun aplikasi satu halaman (Single Page Application) di mana seluruh konten halaman ada di dalam satu halaman HTML, dan hanya bagian tertentu yang diupdate secara dinamis seriring berjalannya interaksi. SPA membuat aplikasi menjadi lebih cepat dan responsif.
-
Integrasi dengan aplikasi lain
JavaScript bisa digunakan untuk berkomunikasi dengan server menggunakan AJAX untuk mengirim dan menerima data. Ada banyak juga library dan framework JavaScript yang bisa mempercepat pengembangan aplikasi, seperti React, Angular, dan Vue.js.
Contoh penggunaan javascript dalam web:
- Formulir: Validasi input, pengiriman data secara asynchronous, menampilkan error message.
- Animasi: Membuat elemen-elemen bergerak dan berinteraksi dengan user.
- Game: Membangun game sederhana sampai yang kompleks yang bisa berjalan langsung di dalam browser.
- Single Page Application (SPA): Membuat aplikasi web yang serasa aplikasi desktop karena navigasinya mulus dan load halaman cepat.
- Grafik dan visualisasi data: Membuat grafik dan visualisasi data yang interaktif.
-
Apa itu
await
?await
adalah keyword dalam JavaScript yang digunakan untuk menunggu hasil dari sebuah promise. Promise adalah objek yang merepresentasikan hasil dari sebuah operasi asynchronous , seperti request data dari server menggunakanfetch()
. -
Kenapa kita menggunakan
await
saat menggunakanfetch()
?Ketika kita menggunakan
fetch()
, kita sebenarnya sedang membuat sebuah promise. Promise ini akan diselesaikan ketika request data selesai diproses oleh server. Jika kita tidak menggunakanawait
, kode kita akan terus berjalan tanpa menunggu hasil dari promise tersebut. Hal ini bisa menyebabkan karena bisa saja kita ternyata mencoba mengakses data yang belum ada, dan menjadikan data tidak sinkron.// Tanpa await fetch('/data') .then(response => response.json()) .then(data => { console.log(data); // Data mungkin belum tersedia jika kode setelah ini dieksekusi lebih cepat }); // Dengan await (dalam fungsi async) async function fetchData() { const response = await fetch('/data'); const data = await response.json(); console.log(data); // Data pasti sudah tersedia di sini }
-
Apa yang terjadi jika kita tidak menggunakan
await
?- Kode setelah
fetch()
akan langsung dieksekusi meskipun data belum selesai diambil. - Jika kita mencoba mengakses data yang diambil dari
fetch()
sebelum promise selesai, kita akan mendapatkan nilai undefined atau error. - Sebenarnya kita bisa menggantikan
await()
denganthen()
dancatch()
. Namun, kode akan menjadi lebih kompleks dan sulit dipahami karena kita harus menggunakanthen()
dancatch()
untuk menangani promise. Jika kita menggunakanawait
, kode menjadi lebih linear dan mirip dengan kode synchronous. Kita juga bisa memastikan bahwa data sudah tersedia sebelum digunakan. Kita juga bisa menggunakantry...catch
untuk menangani error secara lebih baik.
- Kode setelah
Dalam aplikasi PacilBay, kita menggunakan await
dalam fungsi refreshProductEntries
untuk memastikan bahwa proses mendapatkan product entries sudah selesai sebelum kita menampilkannya.
Pembersihan data (data sanitization) dapat mencegah serangan-serangan seperti injection attack (SQL injection, XSS, dll.). Melakukan sanitization di frontend tidak cukup untuk menjamin keamanan aplikasi secara keseluruhan. Kita juga harus melakukan sanitization di backend karena:
-
Keamanan tambahan
Jika pengguna mematikan JavaScript, maka validasi di frontend tidak akan berjalan. Kalau kita melakukan validasi di backend, kita memastikan bahwa data yang masuk ke sistem selalu bersih walaupun di konfigurasi browser user javascriptnya non aktif. Data sanitization di backend juga untuk melindungi serangan curl atau Postman dapat langsung mengirim data ke endpoint backend tanpa melalui frontend
-
Konsistensi
Dengan melakukan validasi di backend maupun frontend, kita bisa memastikan bahwa aturan validasi data selalu konsisten yang akan menghindari inkonsistensi data yang tersimpan.
-
Perlindungan terhadap perubahan frontend
Frontend diubah dengan mudah oleh pengguna atau penyerang. Validasi backend akan menambah proteksi keamanan menjadi lapisan yang lebih sulit untuk diterobos.