Nama : Michael Marcellino Satyanegara
NPM : 2206083325
Kelas : PBP E
Adaptable : Support Inventory
Checklist untuk tugas ini adalah sebagai berikut.
-
Pastikan bahwa kita sudah download aplikasi Django terlebih dahulu. Kalian bisa melakukan download pada link berikut Django.
-
Buatlah direktori utama (folder utama) yang akan kita gunakan untuk membuat sebuah proyek Django baru.
-
Kita buka command prompt untuk Windows atau terminal shell untuk Unix pada direktori utama tersebut.
-
Pada command prompt atau terminal shell, buatlah virtual environment dengan menjalankan sebuah perintah.
python -m venv envPenggunaan virtual environment ini bertujuan melakukan isolasi pada aplikasi yang dibuat agar tidak terjadi tabrakan/gangguan terhadap versi lain yang ada pada komputer kita.
-
Setelah kita buat virtual environment, sekarang kita aktifkan virtual environment tersebut dengan perintah.
env\Scripts\activate.bat -> (Untuk Windows) Atau source env/bin/activate -> (Untuk Mac/Linux)Kita dapat mengetahui Virtual environment aktif, saat baris input pada terminal kita ditandai dengan (env).
-
Buatlah file baru dengan nama
requirements.txtpada direktori utama dan tambahkan beberapa dependencies ke dalam file tersebut.django gunicorn whitenoise psycopg2-binary requests urllib3 -
Setelah membuat file, sekarang kita install file
requirements.txtyang berisi beberapa dependencies dengan perintah.pip install -r requirements.txt -
Setelah install berhasil, sekarang kita buat proyek Django baru dengan perintah.
django-admin startproject {Nama App} .Keterangan : {Nama App} itu bebas sesuai dengan nama proyek Django yang kita inginkan.
-
Sekarang kita akan melakukan konfigurasi proyek dan menjalankan server. Yang perlu kita lakukan pertama adalah kita buka file dengan nama
setting.pydi dalam direktori proyek (direktori dengan nama app kita), lalu pada bagianALLOWED_HOSTSkita tambahkan*.... ALLOWED_HOSTS = ["*"] ...Hal ini bertujuan agar dengan menetapkan nilai ["*"], kita dapat mengizinkan akses ke semua host, sehingga aplikasi dapat diakses secara luas.
-
Setelah itu, kita kembali ke command prompt atau terminal shell, lalu kita jalankan server django dengan perintah.
python manage.py runserver -> (Untuk Windows) Atau ./manage.py runserver -> (Untuk Unix) -
Untuk melihat hasil proyek django yang berhasil kita buat, kita dapat melihatnya pada peramban web berikut http://localhost:8000.
-
Terakhir untuk mematikan server, kita dapat menekan
Ctrl + Cpada command prompt atau terminal shell. Setelah itu, kita dapat menonaktifkan virtual environment dengan perintah berikut.deactivate
-
Buka kembali command prompt atau terminal shell pada direktori utama proyek Django. Lalu aktifkan virtual environment tersebut dengan perintah.
env\Scripts\activate.bat -> (Untuk Windows) Atau source env/bin/activate -> (Untuk Mac/Linux) -
Untuk membuat aplikasi baru dengan nama
main. Kita perlu melakukan perintah berikut.python manage.py startapp mainSetelah melakukan perintah, maka akan muncul direktori baru dengan nama
mainyang nanti akan berisi struktur awal untuk membuat aplikasi. -
Agar
maindapat dijalankan, kita perlu untuk mendaftarkan aplikasimainke dalam proyek dengan perintah berikut.Pada direktori proyek terdapat berkas dengan nama settings.py
Buka berkas tersebut, lalu pada bagian
INSTALLED_APPS, kita tambahkan 'main' ke dalam daftar aplikasi.INSTALLED_APPS = [ ..., 'main', ... ]
- Untuk melakukan routing, yang pertama kita lakukan adalah membuat berkas baru dengan nama
urls.pydi dalam direktorimain. - Isi berkas tersebut dengan kode berikut.
Tujuan dari pembuatan berkas ini adalah untuk bertanggung jawab dalam mengatur rute URL yang terkait dengan aplikasi
from django.urls import path from main.views import show_main app_name = 'main' urlpatterns = [ path('', show_main, name='show_main'), ]
main.
namesebagai nama item dengan tipe CharField.
amountsebagai jumlah item dengan tipe IntegerField.
descriptionsebagai deskripsi item dengan tipe TextField.
- Untuk membuat model, yang pertama kita lakukan adalah membuka berkas
models.pypada direktori aplikasimain. - Isi berkas tersebut dengan kode berikut.
Penjelasan :
from django.db import models class Product(models.Model): name = models.CharField(max_length=255) date = models.DateField(auto_now_add=True) amount = models.IntegerField() description = models.TextField()
name,date,amount, dandescriptionadalah atribut atau field pada model. Setiap field memiliki tipe data yang sesuai sepertiCharField,DateField,IntegerField, danTextField. - Sebelum kita mengaplikasikan aplikasi kita, kita harus melakukan migrasi model terlebih dahulu. Migrasi ini adalah instruksi untuk mengubah struktur tabel basis data sesuai dengan perubahan model yang didefinisikan dalam kodemu.
- Untuk membuat migrasi model, buka kembali command prompt atau terminal shell pada direktori
maindan jalankan perintah berikut.Tujuan perintah ini adalah menciptakan berkas migrasi yang berisi perubahan model yang belum diaplikasikan ke dalam basis data.python manage.py makemigrations - Setelah itu, untuk menerapkan migrasi ke dalam basis data lokal, kita perlu menjalankan perintah berikut.
python manage.py migrate
5. Membuat sebuah fungsi pada views.py untuk dikembalikan ke dalam sebuah template HTML yang menampilkan nama aplikasi serta nama dan kelas kamu.
-
Untuk membuat sebuah fungsi, yang pertama kita lakukan adalah membuka berkas
views.pypada direktori aplikasimain. -
Tambahkan kode berikut pada baris import.
from django.shortcuts import render
Fungsi dari kode tersebut adalah untuk me-render tampilan HTML dengan menggunakan data yang diberikan.
-
Isi kembali berkas tersebut dengan fungsi
show_mainyang berisi kode berikut.def show_main(request): context = { 'app': '{Nama App kalian}', 'name': '{Nama kalian}', 'class': '{Kelas kalian}' } return render(request, "main.html", context)
Pada bagian
main.htmlitu merupakan berkas yang kita buat dalam direktoritemplatesdan direktori tersebut berada di dalam direktori aplikasimainsebagai tempat untuk menampilkan tampilan HTML. (Jadi jika berkasmain.htmlini belum dibuat, lebih baik dibuat terlebih dahulu). -
Setelah itu, buka berkas
main.htmlyang berada di dalam direktoritemplates. -
Isi berkas tersebut dengan kode berikut.
... <h5>App: </h5> <p>{{ app }}<p> <h5>Name: </h5> <p>{{ name }}<p> <h5>Class: </h5> <p>{{ class }}<p> ...
Penjelasan : Sintaks Django
{{ app }},{{ name }}dan{{ class }}merupakan tempat untuk menampilkan nilai yang telah didefinisikan dalamcontextyang ada pada berkasviews.py.
6. Membuat sebuah routing pada urls.py aplikasi main untuk memetakan fungsi yang telah dibuat pada views.py.
-
Sama seperti poin pada nomor 3. Yang pertama kita lakukan untuk melakukan routing adalah membuat berkas baru dengan nama
urls.pydi dalam direktorimain. -
Isi berkas tersebut dengan kode berikut.
from django.urls import path from main.views import show_main app_name = 'main' urlpatterns = [ path('', show_main, name='show_main'), ]
Tujuan dari pembuatan berkas ini adalah untuk bertanggung jawab dalam mengatur rute URL yang terkait dengan aplikasi
main.Namun, karena tadi kita sudah melakukannya sekarang kita lanjutkan ke step berikutnya.
-
Sekarang kita akan menambahkan rute URL dalam
urls.pyproyek (Direktori proyek dengan nama app kita) untuk menghubungkannya ke tampilanmain. Yang pertama kita lakukan adalah membuka berkasurls.pydi dalam direktori proyek dengan nama app kita, bukan yang ada di dalam direktori aplikasimain. -
Tambahkan kode berikut pada baris import.
... from django.urls import path, include ...
Penjelasan : Fungsi include digunakan untuk melakukan import rute URL dari aplikasi main ke dalam berkas
urls.pyproyek. -
Isi kembali berkas tersebut dengan kode berikut pada bagian
urlpatterns.urlpatterns = [ ... path('main/', include('main.urls')), ... ]
Penjelasan : Path URL
'main/'akan diarahkan ke rute yang didefinisikan dalam berkasurls.pyaplikasimain. -
Setelah itu, kita dapat menjalankan aplikasi kita dengan menyalakan server Django dengan perintah berikut. (Jalankan pada command prompt atau terminal shell)
python manage.py runserver -
Untuk melihat hasil proyek django yang berhasil kita buat, kita dapat melihatnya pada peramban web berikut http://localhost:8000.
7. Melakukan deployment ke Adaptable terhadap aplikasi yang sudah dibuat sehingga nantinya dapat diakses oleh teman-temanmu melalui Internet.
- Buatlah akun Adaptable.io dengan menggunakan akun GitHub yang digunakan sebagai tempat untuk menyimpan repositori proyek aplikasi Djago kalian.
- Jika sudah membuat akun dan login pada Adaptable, tekan tombol
NEW APP. PilihConnect an Existing Repository. - Pilihlah repositori proyek aplikasi Djago kalian sebagai basis aplikasi yang akan di-deploy. Pilih branch yang ingin dijadikan sebagai deployment branch.
- Sebagai template deployment, pilihlah
Python App Template. - Selanjutnya sebagai tipe basis data yang akan digunakan, pilihlah
PostgreSQL. - Lakukan penyesuaian setting versi Python yang kalian miliki. Untuk mengeceknya, nyalakan virtual environment dan jalankan perintah python --version. Lalu pada bagian
Start Commandmasukkan perintahpython manage.py migrate && gunicorn {nama repositori kalian}.wsgi. - Setelah itu, masukkan nama aplikasi yang kalian buat dan nama ini akan menjadi domain situs web aplikasi kalian.
- Terakhir, centang bagian
HTTP Listener on PORTdan lakukanDeploy Appuntuk memulai proses deployment aplikasi kalian. Tunggu sampai semuaDeployment Statusberwarna hijau yang menandakan keberhasilan pembuatan aplikasi kalian pada Adapatable.
B. 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.
-
Workflow dimulai dari user yang meminta request kepada Django. Django akan menerima request tersebut dengan menggunakan URL (
url.py). -
Setelah itu, URL akan memanggil VIEWS (
views.py) yang akan mengatur berbagai macam bentuk interaksi seperti meminta, mengelola dan menyajikan data yang nanti akan diolah oleh MODELS (model.py) yang dilanjutkan ke dalam APP Database. Data yang didapatkan dari MODELS tersebut akan dikirim oleh VIEWS ke TEMPLATE (main.html) dan akan ditampilkan dalam bentuk berkas HTML. -
Pada berkas HTML, berisi berbagai macam kode html seperti kode untuk membuat list, tabel, menentukan warna font, mangatur format penulisan, menentukan ukuran font dan masih banyak lagi. Selain itu, pada berkas HTML juga mengandung tag template Django agar dapat memasukan data yang ada pada berkas
views.pyke dalam berkasmain.html. -
Setelah semua selesai diolah, data tersebut akan ditampilkan dalam bentuk rendered web page kepada user.
C. Jelaskan mengapa kita menggunakan virtual environment? Apakah kita tetap dapat membuat aplikasi web berbasis Django tanpa menggunakan virtual environment?
-
Tujuan kita menggunakan virtual environment :
Menciptakan tempat khusus agar proyek perangkat lunak yang kita kerjakan dapat bekerja dengan lebih teratur dan lebih aman.
Mengisolasi proyek-proyek lain sehingga tidak ada konflik dalam melakukan pekerjaan. Hal ini bertujuan karena terkadang untuk setiap proyek yang kita kerjakan memerlukan spesifikasi atau versi yang berbeda dari spesifikasi utama perangkat kita.
Dapat melakukan install untuk paket-paket Python yang diperlukan dalam proyek tanpa merusak instalasi Python Global pada perangkat kita. Selain itu, kita juga dapat menghapus paket tersebut dengan bebas selama berada dalam virtual environment tanpa memperhatikan dampak pada sistem operasi utama perangkat kita.
-
Kita tetap dapat membuat aplikasi web berbasis Django tanpa menggunakan virtual environment. Namun, hal ini sangatlah tidak direkomendasikan karena jika kita melakukan install Django ke lingkungan default/global maka kita hanya akan dapat menargetkan satu versi Django di perangkat kita dan hal ini bisa menjadi masalah jika kita ingin membuat situs web baru yang menggunakan versi Django terbaru sambil mempertahankan situs web yang bergantung pada versi Django yang lama.
Oleh karena itu, kita disarankan untuk menggunakan virtual environment dalam membuat aplikasi web berbasis Django agar kita dapat menggunakan berbagai versi Django dalam perangkat kita untuk menciptakan berbagai jenis proyek baru berbasis Django. Selain itu, agar menambah keamanan dalam membuat proyek tanpa perlu memperhatikan dampak pada sistem operasi utama pada perangkat kita.
MVC (Model-View-Controller), MVT (Model-View-Template), dan MVVM (Model-View-ViewModel) adalah sebuah pola arsitektur dalam membuat sebuah aplikasi dengan cara memisahkan kode menjadi tiga bagian yang akan digunakan dalam pengembangan perangkat lunak (membuat aplikasi berbasis web). Tujuan utama dari memisahkan kode menjadi tiga bagian ini adalah untuk mempermudah proses pengembangan, perawatan, dan pengelolaan kode yang lebih terstruktur dan rapi.
-
MVC (Model-View-Controller):
Memisahkan kode menjadi 3 bagian yaitu:
-
Model
Bertugas dalam menyiapkan, mengatur, memanipulasi, dan mengorganisasikan data yang ada di database.
-
View
Bertugas dalam menampilkan informasi dalam bentuk Graphical User Interface (GUI).
-
Controller
Bertugas dalam menghubungkan serta mengatur model dan view agar dapat saling terhubung. Controller akan mengambil data hasil pengolahan model dan mengaturnya di bagian view untuk ditampilkan kepada pengguna.
-
MVT (Model-View-Template):
Memiliki konsep yang sama seperti MVC, MVT memiliki Model dan View yang bertugas dalam menyiapkan dan menampilkan informasi. Namun, dalam MVT terdapat komponen Template yang bertugas dalam mengatur data agar dapat ditampilkan dalam HTML. Konsep ini juga bekerja khusus dalam kerangka kerja web Django untuk pengembangan aplikasi web berbasis Python.
-
MVVM (Model-View-ViewModel):
Memisahkan kode menjadi 3 bagian yaitu:
-
Model
Bertugas dalam merepresentasikan data yang akan digunakan pada logika bisnis. Umumnya kelas-kelas yang ada di dalamnya berupa POJO atau Plain Old Java Object dan Data Classes jika kita menggunakan Kotlin.
-
View
Layer yang berisi UI dari aplikasi untuk mengatur bagaimana informasi akan ditampilkan. Layer ini akan berisi kelas-kelas, seperti Activity dan Fragment.
-
ViewModel
Bertugas untuk berinteraksi dengan model di mana data yang ada akan diteruskan ke layer view.
Pada tugas ini, kamu akan menjalankan implementasi konsep data delivery serta menerapkan beberapa konsep yang telah dipelajari selama sesi tutorial.
Checklist untuk tugas ini adalah sebagai berikut:
Pada hakikatnya, form POST dan form GET memiliki fungsi yang sama yaitu untuk mengirimkan nilai variabel ke file lain yang telah diatur. Selain itu pengiriman nilai ini juga bisa dikirimkan ke database.
Untuk perbedaannya dapat dilihat sebagai berikut:
-
POST
- Nilai variabel tidak ditampilkan di URL.
- Digunakan untuk mengirim data-data yang bersifat pribadi dan rahasia seperti password.
- Jumlah nilai variabel tidak dibatasi oleh panjang string.
- Untuk melakukan input nilai variabel biasanya melalui form.
- Pemanggilan method
POSTmenggunakan$_POSTyang berfungsi untuk memanggil data yang telah diinputkan agar bisa ditampilkan di file action. - Lebih aman karena method
POSTmengirimkan data secara langsung (Bersifat Private).
-
GET
- Nilai variabel ditampilkan di URL sehingga user dapat melakukan input nilai variabel baru dengan mudah.
- Digunakan untuk mengirim data-data yang tidak terlalu penting.
- Jumlah nilai variabel dibatasi untuk panjang string hanya sampai 2047 karakter.
- Untuk melakukan input nilai variabel biasanya melalui link.
- Pemanggilan method
GETmenggunakan$_GETyang memiliki fungsi yang sama dengan$_POSTnamun ini khusus untuk pemanggilan methodGET. - Kurang aman karena method
GETmengirimkan data secara tidak langsung (Bersifat Public).
-
XML (Extensible Markup Language)
- XML menggunakan tag untuk merepresentasikan data. Setiap data yang akan dikirim dimulai dan diakhiri dengan tag yang sama dan dapat berisi tag lain di dalamnya. Struktur data XML hanya dapat diurai menggunakan pengurai XML. XML dapat mengirim hampir semua jenis data, seperti tipe data JSON, boolean, date, image, dan namespace.
-
JSON (JavaScript Object Notation)
- JSON menyimpan data dalam bentuk key-value pairs, yang bisa menjadi array atau nested objects. Bentuk tersebut lebih mudah diurai dengan fungsi-fungsi standar pada JavaScript. JSON dapat mengirim hampir semua jenis data, seperti string, number, object, array, boolean, dan null.
-
HTML (HyperText Markup Language)
- Biasanya digunakan untuk mengatur view dan struktur dalam pembuatan halaman web, bukan sebagai tempat pengiriman data.
Karena JSON memiliki banyak kelebihan terutama dalam kemudahannya untuk dipahami oleh bahasa manusia dan mesin. Selain itu, JSON juga memiliki kelebihan sebagai berikut:
- JSON dapat diurai menggunakan fungsi-fungsi standar JavaScript yang lebih mudah diakses.
- Kecepatan parsing (Pengenalan bagian terkecil dari suatu dokumen) dan transmisi data pada JSON lebih cepat daripada XML. Hal ini karena pada JSON, syntax dan ukuran file-nya tergolong berukuran kecil.
- Melakukan penyimpanan data dalam bentuk array sehingga pengiriman data menjadi lebih mudah.
- JSON bersifat independen dan merupakan turunan dari Object JavaScript. Selain itu, JSON juga mendukung untuk bahasa pemrograman lain seperti PostgreSQL.
- JSON unggul dalam penanganan API baik untuk aplikasi berbasis web ataupun desktop.
-
Buatlah berkas baru dengan nama
forms.pypada direktorimain. -
Isi berkas tersebut dengan kode berikut.
from django.forms import ModelForm from main.models import Product class ProductForm(ModelForm): class Meta: model = Product fields = ["name", "price", "description"]
Penjelasan :
model = Productuntuk menunjukkan model yang digunakan untuk form yang akan disimpan menjadi sebuah objekProduct. Danfields = ["name", "price", "description"]untuk menunjukkan isi field dari objekProductyang digunakan untuk form. -
Buka berkas
views.pypada direktorimaindan tambahkan kode berikut pada bagian import.from django.http import HttpResponseRedirect from main.forms import ProductForm from main.forms import Product from django.urls import reverse
-
Untuk menerima
requestdan menambahkan data produk ketika data dikirim dari form, kita tambahkan methodcreate_productpada berkasviews.py.def create_product(request): form = ProductForm(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_product.html", context)
Penjelasan :
form = ProductForm(request.POST or None)kode ini digunakan untuk membuat ProductForm baru berdasarkan input dari user padarequest.POST.return HttpResponseRedirect(reverse('main:show_main'))digunakan untuk melakukan redirect setelah data form berhasil disimpan. -
Selain itu, tambahkan kode berikut pada method
show_mainpada berkas yang sama.def show_main(request): products = Product.objects.all() context = { 'products': products } return render(request, "main.html", context)
Penjelasan :
products = Product.objects.all()kode ini berguna untuk mengambil seluruh object Product yang tersimpan pada database dan akan ditampilkan didalam bagiancontext -> 'products': products -
Buka berkas
urls.pypada direktorimaindan tambahkan kode berikut pada bagian import.from main.views import show_main, create_product
Setelah itu, tambahkan pada bagian
urlpatterns... path('create-product', create_product, name='create_product'), ...
-
Untuk menampilkan pada HTML, buat folder
templatespada direktori utama dan buat berkas baru didalamnya dengan namabase.html. Berkasbase.htmlini berfungsi sebagai tempat untuk template dasar yang dapat digunakan sebagai kerangka umum untuk berkas html lainnya di dalam proyek. Setelah itu, isi berkas tersebut dengan kode 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>Agar berkas
base.htmlterdeteksi sebagai berkas template. Buka berkassettings.pypada direktori{app django}dan tambahkan kode berikut pada bagian TEMPLATES.... TEMPLATES = [ { ... 'DIRS': [BASE_DIR / 'templates'], ... } ] ...
-
Pada direktori
main/templatesbuatlah berkas baru dengan namacreate_product.htmldan isi berkas tersebut dengan kode berikut.{% extends 'base.html' %} {% block content %} <h1>Add New Product</h1> <form method="POST"> {% csrf_token %} <table> {{ form.as_table }} <tr> <td></td> <td> <input type="submit" value="Add Product"/> </td> </tr> </table> </form> {% endblock %}Penjelasan :
<form method="POST">berfungsi sebagai penanda block pada form dengan method POST.{% csrf_token %}bagian ini sebagai token security yang akan di-generate otomatis oleh Django untuk mencegah adanya serangan berbahaya.<input type="submit" value="Add Product"/>digunakan sebagai tombol submit dan mengirimkan request ke berkasviewdan methodcreate_product(request)yang ada didalamnya. -
Pada direktori yang sama buka berkas
main.htmldan ubah kode berikut dengan kode baru sebagai berikut.{% extends 'base.html' %} {% block content %} <h1>{{ appname }}</h1> <h5>Name:</h5> <p>{{name}}</p> <h5>Class:</h5> <p>{{class}}</p> <table> <tr> <th>Name</th> <th>Price</th> <th>Description</th> <th>Date Added</th> </tr> {% for product in products %} <tr> <td>{{product.name}}</td> <td>{{product.price}}</td> <td>{{product.description}}</td> <td>{{product.date_added}}</td> </tr> {% endfor %} </table> <br /> <a href="{% url 'main:create_product' %}"> <button> Add New Product </button> </a> {% endblock content %}
2. Tambahkan 5 fungsi views untuk melihat objek yang sudah ditambahkan dalam format HTML, XML, JSON, XML by ID, dan JSON by ID.
Sebelum menambahkan fungsi untuk format XML dan JSON, yang pertama harus kita lakukan adalah membuka berkas views.py pada direktori main dan tambahkan kode berikut pada bagian import.
from django.http import HttpResponse
from django.core import serializers-
Buka berkas
urls.pypada direktori {{app Django}} dan ubah pada bagianurlpatternsdengan kode berikut.urlpatterns = [ path('', include('main.urls')), path('admin/', admin.site.urls), ]
-
Buka berkas
views.pypada direktorimaindan tambahkan methodshow_maindengan kode berikut.def show_main(request): products = Product.objects.all() context = { 'appname': 'nama app' 'name': 'nama 'class': 'kelas' 'products': products } return render(request, "main.html", context)
-
Buka berkas
main.htmlpada direktorimain/templatesdan isi berkas tersebut dengan kode berikut.{% extends 'base.html' %} {% block content %} <h1>{{ appname }}</h1> <h5>Name:</h5> <p>{{name}}</p> <h5>Class:</h5> <p>{{class}}</p> <table> <tr> <th>Name</th> <th>Price</th> <th>Description</th> <th>Date Added</th> </tr> {% for product in products %} <tr> <td>{{product.name}}</td> <td>{{product.price}}</td> <td>{{product.description}}</td> <td>{{product.date_added}}</td> </tr> {% endfor %} </table> <br /> <a href="{% url 'main:create_product' %}"> <button> Add New Product </button> </a> {% endblock content %} -
Buka command prompt atau terminal shell pada direktori utama. Lalu aktifkan virtual environment tersebut dengan perintah.
env\Scripts\activate.bat -> (Untuk Windows) Atau source env/bin/activate -> (Untuk Mac/Linux) -
Setelah itu, kita dapat menjalankan aplikasi kita dengan menyalakan server Django dengan perintah berikut. (Jalankan pada command prompt atau terminal shell)
python manage.py runserver -
Untuk melihat hasil proyek django yang berhasil kita buat, kita dapat melihatnya pada peramban web berikut http://localhost:8000/.
-
Buka berkas
views.pypada direktorimaindan tambahkan methodshow_xmldengan kode berikut.def show_xml(request): data = Product.objects.all() return HttpResponse(serializers.serialize("xml", data), content_type="application/xml")
Penjelasan :
return HttpResponseyang berisi parameter data hasil query yang sudah diserialisasi menjadi XML dan parametercontent_type="application/xml".`serializers`` digunakan untuk melakukan translate objek model menjadi format XML.
-
Buka berkas
urls.pypada direktorimaindan tambahkan kode beriku pada bagianimport.from main.views import show_main, create_product, show_xml
-
Setelah itu, pada berkas yang sama, tambahkan kode berikut pada bagian
urlpatterns... path('xml/', show_xml, name='show_xml'), ...
-
Buka command prompt atau terminal shell pada direktori utama. Lalu aktifkan virtual environment tersebut dengan perintah.
env\Scripts\activate.bat -> (Untuk Windows) Atau source env/bin/activate -> (Untuk Mac/Linux) -
Setelah itu, kita dapat menjalankan aplikasi kita dengan menyalakan server Django dengan perintah berikut. (Jalankan pada command prompt atau terminal shell)
python manage.py runserver -
Untuk melihat hasil proyek django yang berhasil kita buat, kita dapat melihatnya pada peramban web berikut http://localhost:8000/xml.
-
Buka berkas
views.pypada direktorimaindan tambahkan methodshow_jsondengan kode berikut.def show_json(request): data = Product.objects.all() return HttpResponse(serializers.serialize("json", data), content_type="application/json")
Penjelasan :
return HttpResponseyang berisi parameter data hasil query yang sudah diserialisasi menjadi JSON dan parametercontent_type="application/json".`serializers`` digunakan untuk melakukan translate objek model menjadi format JSON.
-
Buka berkas
urls.pypada direktorimaindan tambahkan kode beriku pada bagianimport.from main.views import show_main, create_product, show_xml, show_json
-
Setelah itu, pada berkas yang sama, tambahkan kode berikut pada bagian
urlpatterns... path('json/', show_json, name='show_json'), ...
-
Buka command prompt atau terminal shell pada direktori utama. Lalu aktifkan virtual environment tersebut dengan perintah.
env\Scripts\activate.bat -> (Untuk Windows) Atau source env/bin/activate -> (Untuk Mac/Linux) -
Setelah itu, kita dapat menjalankan aplikasi kita dengan menyalakan server Django dengan perintah berikut. (Jalankan pada command prompt atau terminal shell)
python manage.py runserver -
Untuk melihat hasil proyek django yang berhasil kita buat, kita dapat melihatnya pada peramban web berikut http://localhost:8000/json.
-
Buka berkas
views.pypada direktorimaindan tambahkan methodshow_xml_by_iddengan kode berikut.def show_xml_by_id(request): data = Product.objects.filter(pk=id) return HttpResponse(serializers.serialize("xml", data), content_type="application/xml")
Penjelasan :
return HttpResponseyang berisi parameter data hasil query yang sudah diserialisasi menjadi XML dan parametercontent_type="application/xml".`serializers`` digunakan untuk melakukan translate objek model menjadi format XML.
-
Buka berkas
urls.pypada direktorimaindan tambahkan kode beriku pada bagianimport.from main.views import show_main, create_product, show_xml, show_json, show_xml_by_id
-
Setelah itu, pada berkas yang sama, tambahkan kode berikut pada bagian
urlpatterns... path('xml/<int:id>/', show_xml_by_id, name='show_xml_by_id'), ...
-
Buka command prompt atau terminal shell pada direktori utama. Lalu aktifkan virtual environment tersebut dengan perintah.
env\Scripts\activate.bat -> (Untuk Windows) Atau source env/bin/activate -> (Untuk Mac/Linux) -
Setelah itu, kita dapat menjalankan aplikasi kita dengan menyalakan server Django dengan perintah berikut. (Jalankan pada command prompt atau terminal shell)
python manage.py runserver -
Untuk melihat hasil proyek django yang berhasil kita buat, kita dapat melihatnya pada peramban web berikut http://localhost:8000/xml/[id]. (Contoh :
http://localhost:8000/xml/1)
-
Buka berkas
views.pypada direktorimaindan tambahkan methodshow_json_by_iddengan kode berikut.def show_json_by_id(request): data = Product.objects.filter(pk=id) return HttpResponse(serializers.serialize("json", data), content_type="application/json")
Penjelasan :
return HttpResponseyang berisi parameter data hasil query yang sudah diserialisasi menjadi JSON dan parametercontent_type="application/json".`serializers`` digunakan untuk melakukan translate objek model menjadi format JSON.
-
Buka berkas
urls.pypada direktorimaindan tambahkan kode beriku pada bagianimport.from main.views import show_main, create_product, show_xml, show_json, show_xml_by_id, show_json_by_id
-
Setelah itu, pada berkas yang sama, tambahkan kode berikut pada bagian
urlpatterns... path('json/<int:id>/', show_json_by_id, name='show_json_by_id'), ...
-
Buka command prompt atau terminal shell pada direktori utama. Lalu aktifkan virtual environment tersebut dengan perintah.
env\Scripts\activate.bat -> (Untuk Windows) Atau source env/bin/activate -> (Untuk Mac/Linux) -
Setelah itu, kita dapat menjalankan aplikasi kita dengan menyalakan server Django dengan perintah berikut. (Jalankan pada command prompt atau terminal shell)
python manage.py runserver -
Untuk melihat hasil proyek django yang berhasil kita buat, kita dapat melihatnya pada peramban web berikut http://localhost:8000/json/[id]. (Contoh :
http://localhost:8000/json/1)
Pada tugas ini, kamu akan mengimplementasikan konsep authentication, session, cookies, serta menerapkan beberapa konsep yang telah dipelajari selama sesi tutorial.
Checklist untuk tugas ini adalah sebagai berikut:
UserCreationForm adalah form kelas bawaan Django yang digunakan untuk mengatur registrasi pengguna baru. Form ini digunakan untuk membuat atau mendaftarkan pengguna baru dalam aplikasi yang berisi validasi untuk field seperti username, password, dan konfirmasi password.
-
Kelebihan :
- Mudah Digunakan : Salah satu fitur bawaan Django sehingga kita tidak harus membuat form registrasi pengguna dari awal.
- Validasi Terintergrasi : Memiliki validasi terintegrasi untuk berbagai bidang seperti username, password, dan email. Ini membantu memastikan data yang dimasukkan oleh pengguna sesuai dengan aturan yang telah ditentukan.
- Keamanan Terintegrasi : Otomatis menangani beberapa aspek keamanan seperti penyimpanan password yang dihash dan melindungi dari serangan seperti serangan pencucian data (CSRF).
- Fungsionalitas Fleksibel : Dapat menambahkan bidang tambahan atau mengubah perilaku form sesuai kebutuhan.
-
Kekurangan :
- Terbatas pada Model Pengguna Bawaan : UserCreationForm hanya dirancang untuk bekerja dengan model pengguna bawaan Django. Jika memiliki kebutuhan khusus dan menggunakan model pengguna yang berbeda, mungkin perlu menyesuaikan atau membuat form pendaftaran pengguna sendiri.
- Kustomisasi Tambahan Diperlukan : Perlu menambahkan logika tambahan, seperti pengiriman email konfirmasi atau integrasi dengan pustaka autentikasi pihak ketiga, tergantung pada kebutuhan aplikasi.
- Tidak Mendukung Opsi Autentikasi Tambahan : Perlu menambahkan logika tambahan, untuk autentikasi yang lebih kompleks, seperti otentikasi berdasarkan sertifikat atau perangkat eksternal.
B. Apa perbedaan antara autentikasi dan otorisasi dalam konteks Django, dan mengapa keduanya penting?
-
Autentikasi :
Proses memeriksa identitas pengguna untuk memastikan bahwa mereka adalah siapa yang mereka klaim. Ini melibatkan verifikasi bahwa pengguna telah memberikan informasi kredensial yang benar, seperti username dan password. Tujuannya adalah untuk memastikan bahwa pengguna yang masuk ke dalam sistem adalah pengguna yang asli.
-
Otorisasi :
Proses yang memutuskan apa yang diizinkan atau tidak diizinkan oleh pengguna yang telah terautentikasi. Ini menentukan apa yang dapat diakses dan apa yang tidak dapat diakses oleh pengguna berdasarkan peran dan hak akses yang mereka miliki dalam aplikasi. Otorisasi mengendalikan tingkat akses pengguna terhadap sumber daya dan tindakan tertentu dalam aplikasi.
-
Mengapa Keduanya Penting :
-
Keamanan:
Autentikasi membantu melindungi aplikasi dari penggunaan yang tidak sah dengan memastikan bahwa hanya pengguna yang asli yang dapat masuk ke dalam sistem.
Otorisasi memastikan bahwa pengguna hanya memiliki akses ke sumber daya yang mereka izinkan.
-
Privasi Pengguna:
Autentikasi membantu menjaga privasi data pengguna dengan memastikan bahwa hanya pengguna yang asli yang dapat mengakses informasi pribadi mereka.
Otorisasi memungkinkan pengguna untuk mengendalikan tingkat akses terhadap data mereka sendiri.
C. Apa itu cookies dalam konteks aplikasi web, dan bagaimana Django menggunakan cookies untuk mengelola data sesi pengguna?
Cookies dalam konteks aplikasi web adalah kepingan data yang disimpan di perangkat pengguna. Dalam Django, cookies digunakan untuk mengelola data informasi sementara, seperti ID sesi, preferensi, dan lainnya. Django menyediakan dukungan bawaan untuk mengelola cookies melalui objek request.session. Anda dapat menyimpan, mengambil, dan menghapus data sesi dengan mudah menggunakan mekanisme ini.
Django menggunakan cookies dengan nama sessionid, untuk mengidentifikasi sesi pengguna. Ketika pengguna terautentikasi, ID sesi disimpan dalam cookie, yang kemudian digunakan untuk mengidentifikasi pengguna saat melakukan login kembali ke server atau berpindah page dalam aplikasi.
D. Apakah penggunaan cookies aman secara default dalam pengembangan web, atau apakah ada risiko potensial yang harus diwaspadai?
Penggunaan cookies dalam pengembangan web dapat aman secara default jika dilakukan dengan benar dan dengan memperhatikan praktik keamanan secara baik. Namun, ada beberapa risiko potensial yang perlu diwaspadai:
-
Session Hijacking :
Serangan keamanan di mana seorang penyerang mencoba mengambil alih atau memanfaatkan sesi pengguna yang sah yang telah diautentikasi ke dalam suatu aplikasi web. Salah satu metode yang umum digunakan dalam session hijacking adalah memanfaatkan cookies yang digunakan untuk mengelola sesi pengguna.
-
Cross-Site Request Forgery (CSRF):
Serangan yang mengeksploitasi kepercayaan antara pengguna dan situs web yang mereka akses. Salah satu elemen yang sering dimanfaatkan dalam serangan CSRF adalah cookies, terutama authentication cookies yang digunakan untuk mengidentifikasi pengguna yang telah diautentikasi di situs web.
-
Cross-Site Scripting (XSS) :
Serangan keamanan yang memungkinkan penyerang menyisipkan skrip berbahaya ke dalam halaman web yang akan dieksekusi oleh pengguna lain yang mengakses halaman tersebut. Dalam konteks cookies, serangan XSS dapat memengaruhi cookies pengguna, yang dapat digunakan oleh penyerang untuk mencuri informasi atau melakukan tindakan yang tidak sah atas nama pengguna yang asli.
-
Cookie Theft via Physical Access:
Serangan di mana penyerang fisik mendapatkan akses ke perangkat atau komputer pengguna yang terautentikasi di suatu situs web dan mencuri cookies yang tersimpan dalam perangkat tersebut. Serangan ini biasanya terjadi ketika pengguna meninggalkan perangkat mereka tanpa pengawasan atau perangkat tersebut dicuri oleh penyerang.
-
Buka command prompt atau terminal shell pada direktori utama. Lalu aktifkan virtual environment tersebut dengan perintah.
env\Scripts\activate.bat -> (Untuk Windows) Atau source env/bin/activate -> (Untuk Mac/Linux) -
Buka file
views.pypada direktorimaindan tambahkan kode berikut pada bagianimport.from django.shortcuts import redirect from django.contrib.auth.forms import UserCreationForm from django.contrib import messages
Penjelasan : UserCreationForm adalah impor formulir bawaan yang memudahkan pembuatan formulir pendaftaran pengguna dalam aplikasi web. Dengan formulir ini, pengguna baru dapat mendaftar dengan mudah di situs web Anda tanpa harus menulis kode dari awal.
-
Tambahkan method
registerpada fileviews.pydengan kode berikut.def register(request): form = UserCreationForm() if request.method == "POST": form = UserCreationForm(request.POST) if form.is_valid(): form.save() messages.success(request, 'Your account has been successfully created!') return redirect('main:login') context = {'form':form} return render(request, 'register.html', context)
Penjelasan :
form = UserCreationForm(request.POST)digunakan untuk membuat UserCreationForm baru dari yang sudah di-impor sebelumnya dengan memasukkan QueryDict berdasarkan input dari user padarequest.POST. Danform.save()digunakan untuk membuat dan menyimpan data dari form tersebut. -
Pada direktori
main/templatesbuat file baru dengan namaregister.htmldan isi dengan kode berikut.{% extends 'base.html' %} {% block meta %} <title>Register</title> {% endblock meta %} {% block content %} <div class = "login"> <h1>Register</h1> <form method="POST" > {% csrf_token %} <table> {{ form.as_table }} <tr> <td></td> <td><input type="submit" name="submit" value="Daftar"/></td> </tr> </table> </form> {% if messages %} <ul> {% for message in messages %} <li>{{ message }}</li> {% endfor %} </ul> {% endif %} </div> {% endblock content %} -
Buka file
urls.pyyang ada pada direktorimaindan tambahkan kode berikut pada bagianimport.from main.views import register
-
Setelah itu, pada file yang sama, tambahkan kode berikut pada bagian
urlpatterns... path('register/', register, name='register'), ...
-
Buka file
views.pypada direktorimaindan tambahkan kode berikut pada bagianimport.from django.contrib.auth import authenticate, login
Penjelasan : function
authenticatedanloginyang di-impor diatas akan digunakan untuk melakukan autentikasi dan login jika autentikasi berhasil. -
Tambahkan method
login_userpada fileviews.pydengan kode berikut.def login_user(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return redirect('main:show_main') else: messages.info(request, 'Sorry, incorrect username or password. Please try again.') context = {} return render(request, 'login.html', context)
Penjelasan :
authenticate(request, username=username, password=password)digunakan untuk melakukan autentikasi pengguna berdasarkan username dan password yang diterima dari request yang dikirim oleh pengguna saat login. -
Pada direktori
main/templatesbuat file baru dengan namalogin.htmldan isi dengan kode berikut.{% extends 'base.html' %} {% block meta %} <title>Login</title> {% endblock meta %} {% block content %} <div class = "login"> <h1>Login</h1> <form method="POST" action=""> {% csrf_token %} <table> <tr> <td>Username: </td> <td><input type="text" name="username" placeholder="Username" class="form-control"></td> </tr> <tr> <td>Password: </td> <td><input type="password" name="password" placeholder="Password" class="form-control"></td> </tr> <tr> <td></td> <td><input class="btn login_btn" type="submit" value="Login"></td> </tr> </table> </form> {% if messages %} <ul> {% for message in messages %} <li>{{ message }}</li> {% endfor %} </ul> {% endif %} Don't have an account yet? <a href="{% url 'main:register' %}">Register Now</a> </div> {% endblock content %} -
Buka file
urls.pyyang ada pada direktorimaindan tambahkan kode berikut pada bagianimport.from main.views import login_user
-
Setelah itu, pada file yang sama, tambahkan kode berikut pada bagian
urlpatterns... path('login/', login_user, name='login'), ...
-
Buka file
views.pypada direktorimaindan tambahkan kode berikut pada bagianimport.from django.contrib.auth import logout
-
Tambahkan method
logout_userpada fileviews.pydengan kode berikut.def logout_user(request): logout(request) return redirect('main:login')
Penjelasan :
logout(request)digunakan untuk menghapus sesi pengguna yang saat ini masuk. Danreturn redirect('main:login')mengarahkan pengguna ke halaman login dalam aplikasi Django. -
Buka file
main.htmlpada direktorimain/templatesdan tambahkan kode berikut dibawah bagianbutton ADD NEW PRODUCT.... <a href="{% url 'main:logout' %}"> <button> Logout </button> </a> ...
-
Buka file
urls.pyyang ada pada direktorimaindan tambahkan kode berikut pada bagianimport.from main.views import logout_user
-
Setelah itu, pada file yang sama, tambahkan kode berikut pada bagian
urlpatterns... path('logout/', logout_user, name='logout'), ...
-
Buka file
views.pypada direktorimaindan tambahkan kode berikut pada bagianimport.from django.contrib.auth.decorators import login_required
Penjelasan :
from django.contrib.auth.decorators import login_requireddigunakan untuk mengharuskan pengguna login sebelum dapat mengakses suatu halaman web. -
Tambahkan kode berikut diatas method
show_mainpada fileviews.py.... @login_required(login_url='/login') def show_main(request): ...
-
Buka file
views.pypada direktorimaindan tambahkan kode berikut pada bagianimport.import datetime from django.http import HttpResponseRedirect from django.urls import reverse
-
Pada method
login_userganti kode yang ada padaif user is not Nonedengan potongan kode berikut.... if user is not None: login(request, user) response = HttpResponseRedirect(reverse("main:show_main")) response.set_cookie('last_login', str(datetime.datetime.now())) return response ...
Penjelasan :
response.setcookie('last_login', str(datetime.datetime.now()))berfungsi untuk membuat cookie last_login dan menambahkannya ke dalam response. -
Pada method
show_maintambahkan kode berikut pada bagiancontext.context = { ... 'last_login': request.COOKIES['last_login'], ... }
-
Pada method
logout_userubah seluruh fungsinya dengan kode berikut.def logout_user(request): logout(request) response = HttpResponseRedirect(reverse('main:login')) response.delete_cookie('last_login') return response
-
Buka file
main.htmlpada direktorimain/templatesdan tambahkan kode berikut di antara tabel dan buttonlogout.... <h5>Sesi terakhir login: {{ last_login }}</h5> ...
-
Buka file
models.pypada direktorimaindan tambahkan kode pada bagianimport.... from django.contrib.auth.models import User ...
-
Pada model
Producttambahkan kode berikut.class Product(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) ...
-
Buka file
views.pypada direktorimaindan ubah kode pada bagian methodcreate_productdengan kode berikut.def create_product(request): form = ProductForm(request.POST or None) if form.is_valid() and request.method == "POST": product = form.save(commit=False) product.user = request.user product.save() return HttpResponseRedirect(reverse('main:show_main')) ...
-
Ubah juga pada bagian method
show_maindengan kode berikutdef show_main(request): products = Product.objects.filter(user=request.user) context = { 'name': request.user.username, ... } ...
-
Buka command prompt atau terminal shell pada direktori utama. Jalankan perintah berikut.
python manage.py makemigrations -
Setelah itu, jalankan perintah berikut.
python manage.py migrate
7. Membuat dua akun pengguna dengan masing-masing tiga dummy data menggunakan model yang telah dibuat pada aplikasi sebelumnya untuk setiap akun di lokal.
-
Buka command prompt atau terminal shell pada direktori utama. Lalu aktifkan virtual environment tersebut dengan perintah.
env\Scripts\activate.bat -> (Untuk Windows) Atau source env/bin/activate -> (Untuk Mac/Linux) -
Jalankan proyek Django dengan perintah.
python manage.py runserver -
Buka http://localhost:8000/ di browser dan tekan tombol register now
-
Daftarkan diri untuk membuat akun. Setelah membuat akun, halaman web akan kembali ke page login dan lakukan login sesuai dengan username dan password yang sudah didaftarkan.
-
Tekan button
add new productuntuk menambahkan produk dan lakukan sebanyak tiga kali untuk menambahkan tiga produk baru. -
Tekan button
logoutuntuk kembali ke page login dan daftarkan lagi satu akun sesuai denganlangkah nomor 4. -
Ulangi
langkah nomor 5dan terciptalah dua akun pengguna dengan masing-masing memiliki tiga dummy data.
Pada tugas ini, kamu akan mengimplementasikan desain web berdasarkan beberapa hal yang sudah kamu pelajari selama tutorial (CSS, Framework, dsb).
Checklist untuk tugas ini adalah sebagai berikut:
A. 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
-
Yang saya tambahkan untuk kustomisasi pada halaman login, register dan tambah inventori adalah menambahkan background,melakukan penataan tempat agar terlihat rapi dan melakukan setting pada button
<style> body { background-image: url("https://wallpapercave.com/wp/wp4194085.png"); background-size: 100% 100%; background-repeat: no-repeat; background-attachment: fixed; font-family: "Comic Sans MS", Times, serif; } .login-box { display: flex; justify-content: center; align-items: center; height: 100vh; max-width: 100%; } .login { background-color: rgba(255, 255, 255, 0.8); border-radius: 5px; text-align: center; padding: 15px; width: 400px; } .form-control { width: 125px; padding: 10px; border-radius: 10px; font-family: "Comic Sans MS", Times, serif; } .btn.btn-primary { width: 100px; padding: 5px; border-radius: 5px; cursor: pointer; font-family: "Comic Sans MS", Times, serif; font-weight: bold; } td { padding: 10px; } </style>
Penjelasan : Pada bagian body saya menambahkan background image dan melakukan setup ukuran. login-box dan login memiliki konsep yang sama sebagai tempat untuk penataan letak data. form-control, btn btn-primary dan td untuk melakukan penataan secara detail untuk setiap data yang ditampilkan
Kustomisasi halaman daftar inventori menjadi lebih berwarna maupun menggunakan apporach lain seperti menggunakan Card.
-
Yang saya tambahkan sebagai kustomisasi halaman daftar inventori adalah memberikan warna pada tabel/font tulisan dan penataan untuk setiap data tabel
<style> body { background-image: url("http://m.gettywallpapers.com/wp-content/uploads/2023/06/Computer-Wallpaper-Aesthetic-Minimalist.jpg"); background-size: 100% 100%; background-repeat: no-repeat; background-attachment: fixed; font-family: "Comic Sans MS", Times, serif; } .information-box { display: flex; justify-content: center; align-items: center; height: 75vh; max-width: 100%; } #button { font-weight: bold; cursor: pointer; padding: 5px; width: 100%; } table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid black; padding: 8px; text-align: center } th { background-color: #17a2b8; color: white; } tr.bg-info { background-color: #17a2b8; color: white; } tr.bg-primary { background-color: #007bff; color: white; } tr.bg-success { background-color: #28a745; color: white; } h1 { color: white; } </style>
Penjelasan : table berfungsi sebagai class untuk tag table. th, td, bg-info, bg-primary, bg-success, h1, button merupakan class yang berisi style untuk memberikan warna dan penataan data agar menjadi center.
- Universal Selector :
-
Manfaat : Selector ini memilih semua elemen dalam dokumen HTML, sehingga dapat digunakan untuk memberikan style kepada semua elemen.
-
Waktu yang Tepat : Universal selector sebaiknya digunakan dengan hati-hati, karena dapat mengakibatkan kinerja CSS yang buruk jika digunakan secara berlebihan. Namun Universal selector akan berguna jika kita ingin mengaplikasikan style untuk seluruh elemen HTML dalam halaman.
- ID Selector :
-
Manfaat : Memilih elemen berdasarkan atribut id, yang harus unik dalam satu halaman HTML, sehingga dapat digunakan untuk memberikan style tertentu secara spesifik.
-
Waktu yang Tepat : Gunakan ID selector saat ingin merubah style elemen khusus dengan ID tertentu.
- Class Selector :
-
Manfaat : Memilih elemen berdasarkan atribut class, yang dapat digunakan pada beberapa elemen, sehingga dapat digunakan untuk memberikan style beberapa elemen dengan class yang sama.
-
Waktu yang Tepat : Cocok digunakan untuk mengganti gaya elemen yang memiliki class tertentu. Dapat digunakan pada beberapa elemen sekaligus.
- Type Selector (Element Selector) :
-
Manfaat : Memilih semua elemen dengan jenis tertentu (misalnya, semua paragraf atau semua heading).
-
Waktu yang Tepat : Cocok digunakan saat ingin mengganti style elemen tertentu di seluruh halaman web.
- Attribute Selector :
-
Manfaat : Memilih elemen berdasarkan atribut dan nilainya. Ini berguna ketika ingin memilih elemen dengan atribut khusus.
-
Waktu yang Tepat : Mengaplikasikan style atau pada elemen-elemen yang memiliki atribut tertentu.
-
<head> : Ini adalah kontainer untuk elemen-elemen yang menggambarkan informasi tentang dokumen, seperti judul halaman, meta informasi, dan tautan ke file eksternal seperti CSS dan JavaScript.
-
<title> : Menentukan judul halaman yang akan ditampilkan di tab atau judul jendela browser.
-
<meta> : Digunakan untuk menyisipkan informasi tentang halaman, seperti karakter set, deskripsi, dan kata kunci.
-
<style> : Ini digunakan untuk menyertakan aturan gaya CSS di dalam dokumen HTML.
-
<body> : Ini adalah elemen yang berisi konten utama halaman web, seperti teks, gambar, dan elemen-elemen lainnya.
-
<h1>, <h2>, <h3>, <h4>, <h5>, <h6> : Digunakan untuk menampilkan judul atau heading dengan tingkat hierarki yang berbeda. <h1> adalah yang paling tinggi, sedangkan <h6> adalah yang terendah.
-
<a> : Mendefinisikan tautan hyperlink ke halaman lain.
-
<img> : Digunakan untuk menampilkan gambar di halaman web.
-
<ul>, <ol>, <li> : Elemen ini digunakan untuk membuat daftar tidak berurutan <ul>, daftar terurut (<ol>), dan item dalam daftar (<li>).
-
<div>: Elemen ini digunakan untuk mengelompokkan dan mengatur elemen-elemen HTML ke dalam blok yang dapat diubah gayanya.
-
<table>, <tr>, <td>, <th> : Elemen ini digunakan untuk membuat tabel dan mengatur data dalam tabel.
-
<form> : Digunakan untuk membuat formulir interaktif yang memungkinkan pengguna untuk mengirimkan data.
-
<input> : Elemen ini digunakan dalam formulir untuk mengumpulkan data dari pengguna.
- Margin :
-
Margin adalah ruang di luar batas elemen.
-
Margin digunakan untuk mengatur jarak antara elemen yang satu dengan elemen yang lain di luar elemen itu sendiri.
-
Margin tidak memiliki latar belakang atau warna latar belakang, dan area margin biasanya transparan.
- Padding :
-
Padding adalah ruang di antara batas dalam elemen dan kontennya sendiri.
-
Padding digunakan untuk mengatur jarak antara konten elemen dan batas elemen itu sendiri.
-
Dapat mengatur warna latar belakang atau gambar latar belakang di dalam area padding.
E. Jelaskan perbedaan antara framework CSS Tailwind dan Bootstrap. Kapan sebaiknya kita menggunakan Bootstrap daripada Tailwind, dan sebaliknya?
- Tailwind :
-
Tailwind CSS membangun tampilan dengan menggabungkan kelas-kelas utilitas yang telah didefinisikan sebelumnya (Utility-First Approach).
-
Tailwind CSS memiliki file CSS yang lebih kecil sedikit dibandingkan Bootstrap dan hanya akan memuat kelas-kelas utilitas yang ada
-
Tailwind CSS memiliki memberikan fleksibilitas dan adaptabilitas tinggi terhadap proyek
-
Tailwind tidak mengimpor banyak gaya bawaan, sehingga tidak perlu menimpa banyak aturan gaya jika ingin membuat tampilan yang berbeda dari yang disediakan oleh Tailwind.
- Bootstrap :
-
Bootstrap menggunakan gaya dan komponen yang telah didefinisikan, yang memiliki tampilan yang sudah jadi dan dapat digunakan secara langsung (Component-Based).
-
Bootstrap memiliki file CSS yang lebih besar dibandingkan dengan Tailwind CSS karena termasuk banyak komponen yang telah didefinisikan.
-
Bootstrap sering kali menghasilkan tampilan yang lebih konsisten di seluruh proyek karena menggunakan komponen yang telah didefinisikan.
-
Bootstrap sering digunakan dalam fase prototyping karena dapat dengan cepat mengimplementasikan komponen-komponen siap pakai tanpa harus menulis banyak kode kustom.
- Kapan Sebaiknya Digunakan :
-
Bootstrap sebaiknya digunakan jika memerlukan UI yang konsisten dengan komponen-komponen siap pakai, membutuhkan prototyping cepat, atau jika tidak ingin menyesuaikan style secara mendalam.
-
Tailwind CSS lebih cocok jika ingin membangun UI yang sangat kustom, memiliki kontrol yang lebih besar atas gaya, dan ingin menghindari kelas-kelas bawaan yang tidak digunakan. Ini juga dapat menjadi pilihan yang lebih baik jika memiliki proyek yang lebih besar dan kompleks yang memerlukan penyesuaian yang mendalam.
Pada tugas ini, kamu akan mengimplementasikan AJAX pada aplikasi yang telah kamu buat pada tugas sebelumnya.
Checklist untuk tugas ini adalah sebagai berikut:
-
Asynchronous Programming
- Tugas-tugas yang memerlukan waktu lama atau Input/Output yang lambat dijalankan secara non-blok. Ini berarti ketika suatu tugas memulai operasi yang memerlukan waktu, aplikasi tidak harus menunggu hingga tugas tersebut selesai sebelum melanjutkan tugas-tugas lainnya.
- Biasanya melibatkan callback functions, promises*, atau async/await untuk mengelola tugas-tugas yang berjalan secara asinkron.
- Dapat meningkatkan efisiensi program.
-
Synchronous Programming
- Tugas-tugas dieksekusi satu per satu dalam urutan yang telah ditentukan. Artinya, satu tugas harus selesai sebelum tugas berikutnya dimulai.
- Kode pada program berjalan secara blok, yang berarti jika ada tugas yang memerlukan waktu lama, itu akan menghentikan eksekusi seluruh program hingga tugas tersebut selesai.
- Sederhana dan mudah dipahami, namun dapat mengakibatkan aplikasi menjadi lambat dan tidak responsif.
B. 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.
Paradigma event-driven programming adalah cara berpemrograman di mana aplikasi merespons peristiwa atau kejadian yang terjadi, seperti tindakan pengguna (klik mouse atau input keyboard), perubahan status variabel, atau data yang diterima dari sumber eksternal seperti permintaan HTTP. Aplikasi yang mengikuti paradigma ini memahami dan menanggapi peristiwa-peristiwa ini dengan menjalankan kode tertentu yang terkait dengan setiap peristiwa, jadi aplikasi tidak mengeksekusi operasi secara berurutan, tetapi program akan menunggu dan merespons events yang terjadi.
Contoh penerapannya:
-
Aplikasi Desktop:
- Tombol Klik
- Perubahan Fokus
- Mouse Hover
-
Aplikasi Web:
- Klik Tombol
- Submit Formulir
- Perubahan Isian Formulir
-
Aplikasi Mobile:
- Sentuhan Layar
- Rotasi Perangkat
-
Sistem Operasi:
- Penyisipan Perangkat USB
- Ketika Baterai Rendah
-
Game Development:
- Ketika Karakter Pemain Bertabrakan
- Pencetakan Tombol Pada Kontroler
Asynchronous programming dalam konteks AJAX adalah pendekatan di mana permintaan HTTP (seperti permintaan untuk mengambil data dari server) dijalankan secara asinkron, artinya aplikasi web Anda tidak harus menunggu hingga permintaan tersebut selesai sebelum melanjutkan eksekusi kode lainnya. Ini memungkinkan aplikasi untuk tetap responsif, karena Anda dapat menjalankan tugas-tugas lain selama permintaan sedang dalam proses.
Berikut adalah alur asynchronous programming pada AJAX:
- Membuat Objek XMLHttpRequest: Anda mulai dengan membuat objek XMLHttpRequest. Ini adalah objek yang memungkinkan Anda berinteraksi dengan server secara asinkron dan mengirim permintaan HTTP.
- Mengatur Fungsi Event Handler: Anda kemudian menetapkan fungsi event handler yang akan dijalankan ketika permintaan selesai atau ketika ada perubahan dalam status permintaan. Fungsi ini biasanya akan menangani respons dari server.
- Mengatur Permintaan: Anda mengatur detail permintaan, seperti metode HTTP (GET, POST, dll.) dan URL yang akan diminta.
- Mengirim Permintaan (Send).
- Melanjutkan Eksekusi Kode Lain: Setelah permintaan dikirim, kode program Anda dapat melanjutkan eksekusi tugas-tugas lainnya, sehingga menjaga aplikasi tetap responsif.
- Penanganan Respons: Ketika permintaan selesai atau ada perubahan status, fungsi penanganan event yang telah ditetapkan akan dieksekusi.
D. 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.
-
Fetch API:
A. Kelebihan:
-
Modern & Native: Fetch API adalah bagian dari standar JavaScript modern, sehingga tidak perlu mengunduh atau memasang perpustakaan tambahan.
-
Promise-based: Membuat kode asinkron lebih mudah dikelola dan diurai.
-
Ringan: Fetch API lebih ringan daripada jQuery karena hanya berfokus pada tugas pemrosesan HTTP. Fetch API juga adalah API JavaScript murni dan lebih ringan daripada jQuery. Ini dapat mengurangi source load halaman dan mempercepat load time.
B. Kekurangan:
-
Kurva Pembelajaran: Fetch API bisa terasa lebih rumit untuk pemula karena melibatkan Promise dan memerlukan lebih banyak kode dibandingkan jQuery.
-
Kompatibilitas Terbatas: Meskipun banyak browser modern mendukung Fetch API, beberapa versi browser lama mungkin tidak.
-
-
Library jQuery:
A. Kelebihan:
-
Sederhana dan Mudah Dipahami: jQuery adalah perpustakaan JavaScript yang sangat mudah dipelajari, bahkan bagi pemula. Ini menyederhanakan banyak aspek pengembangan web, termasuk AJAX.
-
Kompatibilitas yang Kuat: jQuery dirancang untuk bekerja dengan berbagai versi browser, termasuk browser lama, sehingga menjadikannya pilihan yang lebih aman jika Anda perlu mendukung berbagai platform.
-
Berbagai Fitur Tambahan: Selain AJAX, jQuery juga memiliki banyak fitur tambahan yang berguna untuk manipulasi DOM dan animasi.
B. Kekurangan:
-
Ukuran Besar: jQuery adalah perpustakaan yang cukup besar, sehingga dapat memperlambat waktu pemuatan halaman web jika tidak dioptimalkan dengan baik.
-
Kinerja: Dalam beberapa situasi, Fetch API dapat memiliki kinerja yang lebih baik daripada jQuery karena jQuery memiliki beberapa lapisan abstraksi tambahan.
-
-
Pendapat saya
Menurut saya, Fetch API lebih baik karena memiliki kinerja yang cepat serta perpustakaan yang lengkap, walaupun memiliki kompleksitas yang tinggi, tujuan AJAX dalam memproses request asinkronus dapat lebih mudah diproses di dalam Fetch API. Maka dari itu, penggunaan Fetch API lebih disarankan dibandingkan jQuery. Dan juga seiring berjalannya waktu, penggunaan jQuery dalam pengembangan web semakin berkurang, karena kemajuan teknologi JavaScript.
-
Buka file
views.pypada direktorimain. Dan tambahkan methodget_product_json.def get_product_json(request): product_item = Product.objects.all() return HttpResponse(serializers.serialize('json', product_item))
-
Tambahkan method yang sudah dibuat pada file
urls.pypada direktorimaindengan kode berikut.from main.views import get_product_ajax
path('get-product/', get_product_json, name='get_product_json'),
-
Buka file
main.htmlpada direktorimain\Templateshapus bagian table dan ubah dengan kode berikut.<table id="product_table"></table>
-
Pada file yang sama tambahkan kode berikut pada bagian paling bawah.
<script> async function getProducts() { return fetch("{% url 'main:get_product_json' %}").then((res) => res.json()) } async function refreshProducts() { document.getElementById("product_table").innerHTML = "" const products = await getProducts() let htmlString = `<tr> <th>Name</th> <th>Price</th> <th>Description</th> <th>Date Added</th> </tr>` products.forEach((item) => { htmlString += `\n<tr> <td>${item.fields.name}</td> <td>${item.fields.price}</td> <td>${item.fields.description}</td> <td>${item.fields.date_added}</td> </tr>` }) document.getElementById("product_table").innerHTML = htmlString } refreshProducts() </script>
-
Buka file
views.pypada direktorimain. Dan tambahkan import serta methodadd_product_ajax.from django.views.decorators.csrf import csrf_exempt from django.http import HttpResponseNotFound
@csrf_exempt def add_product_ajax(request): if request.method == 'POST': name = request.POST.get("name") price = request.POST.get("price") description = request.POST.get("description") user = request.user new_product = Product(name=name, price=price, description=description, user=user) new_product.save() return HttpResponse(b"CREATED", status=201) return HttpResponseNotFound()
-
Tambahkan method yang sudah dibuat pada file
urls.pypada direktorimaindengan kode berikut.from main.views import add_product_ajax
path('create-product-ajax/', add_product_aja, name='add_product_ajax')
-
Buka file
main.htmlpada direktorimain\Templatesdan tambahkan kode berikut.<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 Product</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="price" class="col-form-label">Price:</label> <input type="number" class="form-control" id="price" name="price"></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 class="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 Product</button> </div> </div> </div> </div>
-
Pada file yang sama tambahkan fungsi button berikut.
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal">Add Product by AJAX</button>
-
Pada file yang sama, pada bagian script tambahkan kode berikut ini.
<script> ... function addProduct() { fetch("{% url 'main:add_product_ajax' %}", { method: "POST", body: new FormData(document.querySelector('#form')) }).then(refreshProducts) document.getElementById("form").reset() return false } document.getElementById("button_add").onclick = addProduct </script>
-
Buka command prompt atau terminal shell pada direktori utama. Lalu aktifkan virtual environment tersebut dengan perintah.
env\Scripts\activate.bat -> (Untuk Windows) Atau source env/bin/activate -> (Untuk Mac/Linux) -
Untuk mengumpulkan file static dari setiap aplikasi ke dalam satu folder, jalankan perintah berikut ini.
python manage.py collectstatic







