Modul Web Python - 9-11des2019
Modul Web Python - 9-11des2019
Pertemuan Ke-2
Struktur Django
Django Model
Django View
Django Template
Memulai Membuat Aplikasi Web dengan Django
Pretemuan Ke-3
Membuat Model dan Aplikasi Perpustakaan
Django Admin
Membuat Home Page
Membuat Halaman List Buku
Membuat Halaman untuk Author
Pertemuan Ke-1
Installing Basic Software
Web Server Gateway Interface (WSGI)
Python Basic
Installing basic software
Python 3.7
Pip
https://bootstrap.pypa.io/get-pip.py
python get-pip.py
virtual environment
( pip install virtualenvwrapper / virtualenvwrapper-win )
IDE Visual Studio Code
cmder
docker (optional)
mysql
HEIDI SQL
Menggunakan PIP
pip --version python -m pip --version
pip install package python -m pip install
package
https://git.io/fjQDr
print(‘Hasilnya =‘,ganjilGenap(10))
perulanganFor(10)
#web_application.py
from wsgiref.simple_server import make_server Inisialisasi Header
def application(environ, start_response): Request Response Function
path = environ.get('PATH_INFO')
if path == '/':
response_body = "Index"
else: Request routing dan response
response_body = "Hello"
status = "200 OK" build
response_headers = [("Content-Length",
str(len(response_body)))]
start_response(status, response_headers) Compile Response
return [response_body]
httpd = make_server(
'127.0.0.1', 8051, application)
Serve HTTP
httpd.serve_forever()
Bagaimana WSGI Bekerja
Microservices
a.k.a Efektifitas Penggunaan WSGI
Framework WSGI
Kenapa Django
- stable dan salah satu framework python yang paling sering di
update (latest version 2.2.3) 1 July 2019
- fokus pada rapid development dan DRY ( Don’t Repeat Yourself )
- Termasuk Batre
- Komunitas yang luas
- Customizeable Framework
- Proteksi dari Serangan
Yang perlu di perhatikan dengan
Django
- Regex
- Django tidak terbilang cepat dalam response, dari setiap update hanya
mengembangkan fitur
- Semakin besar aplikasi yang dibuat semakin lambat dan berat
- Jika terlalu mengikuti aturan django, hasil aplikasi akan terlalu monolithic
- Template error tidak terlihat
- Bukan untuk project kecil
Pengguna Django
Pertemuan Ke-2
Struktur Django
Membuat Aplikasi Dalam Project
Django View
Django Model
Django Template
Pemahaman Model
Struktur Django
Struktur Folder Project
testing/
db.sqllite3 # file database sementara
manage.py # script untuk jalanin django pada project ini
testing/ # project fodler
__init__.py # Treat this folder as python dir
__pycache__/ # cache hasil compile python
settings.py # semua setting website disimpan disini
urls.py # mapping / route website ke view
wsgi.py # web server yang digunakan django
sebagai gateway
Membuat Aplikasi Dalam Project
jalankan perintah python manage.py startapp aplikasi
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
‘aplikasi’,
]
Django MTV
Struktur Django
View FBV vs CBV
Function Based View
Class Based View
Pros Pros
- mudah di implementasi - Code Reuseability
- mudah di baca - Don’t Repeat Yourself
- straightforward code - Code Extendability
Cons Cons
- tidak reuseable - susah dibaca
- import numpuk
Function Based View
views.py
def contact(request):
if request.method == 'POST':
# Code block for POST request
else:
# Code block for GET request (will also match PUT, HEAD, DELETE, etc)
urls.py
urlpatterns = [
url(r'contact/$', views.contact, name='contact'),
]
Class Based View
views.py
from django.views import View
class ContactView(View):
def get(self, request):
# Code block for GET request
urls.py
urlpatterns = [
url(r'contact/$', views.ContactView.as_view(), name='contact'),
]
Model
- Database Tables di django diartikan sebagai class dan disebut “Model”
- Django DB Toolset lebih sering di sebut Object Relational Mapper (ORM)
- Bukan hanya operasi CREATE TABLE, tapi semua operasi CRUD
Post.objects.filter(title__contains='title')
Template
- Template Language
- Template Inheritance
- Melarang Code Execution
- Don’t Repeat Yourselves
URL Mapper
- Buka file testing/testing/urls.py
- tambahkan pattern buat aplikasi “aplikasi”
- redirect default url ke “aplikasi”
- import semua static url
- buat file urls.py di aplikasi
- jalankan makemigration -> python manage.py makemigration
- jalankan migrate -> python manage.py migrate
4
Pemahaman Model
Intruksi
- Membuat aplikasi Perpustakaan
- Model Object menggunakan UML berikut
Definisi Model
- pada django models adalah sebuah rangka data dari sebuah
aplikasi, Table Database yang dibuat dalam bentuk class dan
disebut Model
- dimana models terdapat bagian dari “fields”, “methods” dan
“metadata”
- Fields adalah kolom kolom yang akan dibuat pada table dengan
sudah mendefinisikan tipe data kolom tersebut
- Methods adalah function buatan untuk model tersebut dimana
khusus untuk return dari database
- Metadata adalah fitur yang dibuat untuk django dimana kita bisa
specify custom order atau database name
- Tersirat pada file “models.py” pada setiap aplikasi
Contoh sebuah model
Model - Fields
- setiap field yang dibuat akan menjadi sebuah kolom pada sebuah table di
database, diambil dari nama variable tersebut
- pada contoh diatas akan membuat kolom bernama my_field_name
dengan Tipe Data Alhpa Numberic (varchar (?))
- menambahkan argumen argumen untuk custom definisi
- pada contoh diatas menggunakan max_length untuk menentukan ukuran
maksimal huruf dan mempunya deskripsi dengan argumen help_text
Jenis Jenis Field Tipe
SlugField max_length ManyToManyField model
SmallIntegerField limit_choices_to
TextField OneToOneField
TimeField auto_now
auto_now_add
URLField max_length
ForeignKey model
related_name
to_field
db_constraint (True)
on_delete
Jenis Jenis Field Tipe
AutoField FileField upload_to
BigIntegerField storage
BinaryField FloatField
blank
choices
db_column
db_index
db_tablespace
default
editable
error_messages
help_text
primary_key
unique
unique_for_[date|month|year]
verbose_name
validators
Model - Metadata
class Meta:
ordering = ['-my_field_name']
app_label
db_table
db_tablespace
get_latest_by
managed
order_with_respect_to
ordering
permissions
proxy
unique_together
index_together
verbose_name
verbose_name_plural
Model - Methods
1. pada dasarnya setiap file model harus di definisikan dengan __str__()
supaya sesuai dengan standar python
2. Biasanya penggunaan ini lebih sering digunakan untuk model advance
Segelintir tentang Model Management
- Membuat dan merubah records
wild_books = Book.objects.filter(title__contains='wild')
number_wild_books = wild_books.count()
def __str__(self):
"""String for representing the Model object."""
return self.name
class Book(models.Model):
"""Model representing a book (but not a specific copy of a book)."""
title = models.CharField(max_length=200)
# Foreign Key used because book can only have one author, but authors
can have multiple books
# Author as a string rather than object because it hasn't been declared
yet in the file
author = models.ForeignKey('Author', on_delete=models.SET_NULL,
null=True)
def __str__(self):
"""String for representing the Model object."""
return self.title
def get_absolute_url(self):
"""Returns the url to access a detail record for this book."""
return reverse('book-detail', args=[str(self.id)])
BookInstance Model (1)
import uuid # Required for unique book instances
class BookInstance(models.Model):
"""Model representing a specific copy of a book (i.e. that can be
borrowed from the library)."""
id = models.UUIDField(primary_key=True, default=uuid.uuid4,
help_text='Unique ID for this particular book across whole library')
book = models.ForeignKey('Book', on_delete=models.SET_NULL, null=True)
imprint = models.CharField(max_length=200)
due_back = models.DateField(null=True, blank=True)
LOAN_STATUS = (
('m', 'Maintenance'),
('o', 'On loan'),
('a', 'Available'),
('r', 'Reserved'),
)
BookInstance Model (2)
status = models.CharField(
max_length=1,
choices=LOAN_STATUS,
blank=True,
default='m',
help_text='Book availability',
)
class Meta:
ordering = ['due_back']
def __str__(self):
"""String for representing the Model object."""
return f'{self.id} ({self.book.title})'
Author Model
class Author(models.Model):
"""Model representing an author."""
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
date_of_birth = models.DateField(null=True, blank=True)
date_of_death = models.DateField('Died', null=True, blank=True)
class Meta:
ordering = ['last_name', 'first_name']
def get_absolute_url(self):
"""Returns the url to access a particular author instance."""
return reverse('author-detail', args=[str(self.id)])
def __str__(self):
"""String for representing the Model object."""
return f'{self.last_name}, {self.first_name}'
Perintah Menjalankan Migration
python manage.py makemigraitons <apps>
Perintah ini membuat file migrasi untuk semua aplikasi yang migrasi tersedia, jika
ditambahkan nama apps maka apps tersebut saja yang akan dibuatkan migrasi file nya
ke dalam folder migrations
Note : Selalu hapus isi folder migration untuk melakukan make migration ulang.
Hasil dari migrate
Django Admin
Django Admin ???
- Auto CMS
- konfigurasi django untuk
- optional untuk digunakan
- Model Test
Register Model ke Django Admin
buka file /perpustakaan/katalog/admin.py
dan daftarkan semua model ke dalam file ini seperti berikut
from katalog.models import Author, Genre, Book, BookInstance
admin.site.register(Book)
admin.site.register(Author)
admin.site.register(Genre)
admin.site.register(BookInstance)
Membuat super user
python3 manage.py createsuperuser
minimal 5 record
dimulai dengan urutan model
Author, Genre, Book dan BookInstances
List View Django Admin (1)
Membuat Halaman lebih menarik pada setiap model dengan memberikan list
view, ikuti langkah berikut
def display_genre(self):
"""Create a string for the Genre. This is required to display genre
in Admin."""
return ', '.join(genre.name for genre in self.genre.all()[:3])
display_genre.short_description = 'Genre'
List View Django Admin (4)
List View Django Admin (5)
Mengontrol Field yang dibutuhkan
pada admin.py di class tinggal tambahkan line berikut pada AuthorAdmin
inlines = [BooksInstanceInline]
Membuat Home Page
Main Data Flow
Define Resource URL
URL yang kita butuhkan
- Note : pada dasarnya pada template untuk mendapatkan url index cukup
dengan seperti berikut <a href="{% url 'index' %}">Home</a>
Index Page - Specify view
pada aplikasi katalog buka file views.py dan tambahkan line berikut
from catalog.models import Book, Author, BookInstance, Genre
def index(request):
# Hitung data dari object
num_books = Book.objects.all().count()
num_instances = BookInstance.objects.all().count()
context = {
'num_books': num_books,
'num_instances': num_instances,
'num_instances_available': num_instances_available,
'num_authors': num_authors,
}
# Render the HTML template index.html with the data in the context variable
return render(request, 'index.html', context=context)
Penjelasan Template
Block dan Extends, Lets talk with code!
Index Page - Template
1. Pada project buat satu folder namanya Templates dan buat sebuah file
dengan nama file base_generic.html dengan line code PADA SLIDE
SELANJUTNYA
Masih lanjut di line kedua, pada bagian <int:pk> ini menjelaskan kalau url ini
id buku, disini dispesifikasi secara spesial dimana idbuku ini harus berupa
integer dan parameter variable nya adalah pk
\w Cocokkan hanya karakter dari alphabetic ataupun special character ataupun angka
+ Cocokkan satu atau lebih karakter sebelumnya. Misalnya, untuk mencocokkan satu digit atau lebih,
Anda akan menggunakan \ d +. Untuk mencocokkan satu atau lebih karakter "a", Anda bisa
menggunakan tanda +
* Cocokkan nol atau lebih dari karakter sebelumnya. Misalnya, untuk mencocokkan apa pun atau kata
yang dapat Anda gunakan \ w *
() Tangkap bagian dari pola di dalam kurung. Setiap nilai yang ditangkap akan diteruskan ke tampilan
sebagai parameter yang tidak disebutkan namanya (jika beberapa pola ditangkap, parameter terkait
akan diberikan dalam urutan pengambilan yang dinyatakan).
(?P<name>...) Ambil pola (ditunjukkan oleh ...) sebagai variabel bernama (dalam hal ini "nama"). Nilai yang diambil
diteruskan ke tampilan dengan nama yang ditentukan. Oleh karena itu, pandangan Anda harus
menyatakan argumen dengan nama yang sama!
[ ] Cocokkan dengan satu karakter di set. Misalnya, [abc] akan cocok dengan 'a' atau 'b' atau 'c'. [- \ w]
akan cocok dengan karakter '-' atau karakter kata apa pun.
Lanjut Book List Page
Book List Page - View
Bikin Class BookListView di aplikasi katalog pada file views.py dengan line
code berikut
class BookListView(generic.ListView):
model = Book
def get_queryset(self):
return Book.objects.filter(title__icontains='war')[:5]
Book List Page - View (2)
Penjelasan lanjut tentang Class Based View, bisa dilihat dari line code
sebelumnya, untuk line class BookListView(generic.ListView): Maksudnya adalah
untuk mendeklarasi CBV pada django
pada line model = Book Maksudnya adalah untuk spesifikasi model yang dipakai
Bermaksud untuk define custom queryset pada class ini, hasilnya akan
menampilkan data buku yang hanya memiliki title salah satu katanya ada
“war”
Book Detail Page - View
Bikin Class BookDetailView di aplikasi katalog pada file views.py dengan line
code berikut
class BookDetailView(generic.DetailView):
model = Book
“SEMOGA SUKSES”