Python Zero To Hero
Python Zero To Hero
PYTHON ZERO
TO HERO
Saya, Ruby Abdullah, merasa sangat terhormat dapat berbagi pengetahuan dan pengalaman
saya dalam dunia pemrograman Python melalui buku ini. Sebagai seorang AI Software Engineer
dan CEO dari Ruby Thalib AI and Data Consultant, saya memiliki kesempatan untuk bekerja
dengan berbagai teknologi canggih dan menghadapi beragam tantangan menarik. Buku ini,
"Python Zero to Hero", adalah hasil dari perjalanan panjang saya dalam memahami dan
menerapkan Python dalam berbagai aspek pengembangan perangkat lunak.
Saya berharap buku ini dapat menjadi panduan yang bermanfaat bagi Anda yang ingin memulai
atau memperdalam pengetahuan tentang Python. Terima kasih telah memilih buku ini sebagai
referensi Anda. Semoga sukses dalam perjalanan belajar Anda!
Salam hangat,
Ruby Abdullah
AI Software Engineer & CEO
Ruby Thalib AI and Data Consultant
Bab 1 Pengenalan Python
2. Jalankan Installer
• Pada jendela installer, pastikan Anda mencentang opsi "Add Python to PATH".
• Pilih "Install Now" untuk instalasi standar atau "Customize installation" untuk opsi
kustom.
3. Verifikasi Instalasi
• Buka Command Prompt (CMD).
2. Instal Python
• Untuk distribusi berbasis Debian/Ubuntu, gunakan:
1. Gunakan Homebrew
• Jika belum memiliki Homebrew, instal terlebih dahulu dengan perintah berikut di
terminal:
2. Instal Python
3. Verifikasi Instalasi
• Ketik python3 --version atau python3 -V di terminal untuk memverifikasi instalasi.
virtualenv myenv
source myenv/bin/activate # Linux/Mac
.\myenv\Scripts\activate # Windows
Tipe Data
Dalam Python, terdapat beberapa tipe data dasar yang sering digunakan dalam pemrograman.
Berikut adalah penjelasan tentang tipe data dasar tersebut:
1. Integer
Integer adalah tipe data yang digunakan untuk menyimpan bilangan bulat (tanpa desimal).
Contohnya, 5, -3, 100.
Contoh:
x = 5
y = -3
z = 100
print(type(x)) # Output: <class 'int'>
print(type(y)) # Output: <class 'int'>
print(type(z)) # Output: <class 'int'>
2. Float
Float adalah tipe data yang digunakan untuk menyimpan bilangan desimal. Contohnya, 5.0, -3.14,
100.25.
Contoh:
a = 5.0
b = -3.14
c = 100.25
print(type(a)) # Output: <class 'float'>
print(type(b)) # Output: <class 'float'>
print(type(c)) # Output: <class 'float'>
3. String
String adalah tipe data yang digunakan untuk menyimpan teks. String dapat didefinisikan
menggunakan tanda kutip tunggal (' ') atau tanda kutip ganda (" ").
Contoh:
s1 = 'Hello'
s2 = "Python"
print(type(s1)) # Output: <class 'str'>
print(type(s2)) # Output: <class 'str'>
4. Boolean
Boolean adalah tipe data yang hanya memiliki dua nilai: True atau False. Tipe data ini sering
digunakan dalam operasi logika dan kondisi.
Contoh:
is_active = True
is_closed = False
print(type(is_active)) # Output: <class 'bool'>
print(type(is_closed)) # Output: <class 'bool'>
x = 10
y = 3
print(x + y) # Output: 13
print(x - y) # Output: 7
print(x * y) # Output: 30
print(x / y) # Output: 3.3333333333333335
print(x // y) # Output: 3 (pembagian bulat)
print(x % y) # Output: 1 (sisa bagi)
print(x ** y) # Output: 1000 (pangkat)
s1 = 'Hello'
s2 = 'World'
print(s1 + ' ' + s2) # Output: 'Hello World' (penggabungan string)
print(s1 * 3) # Output: 'HelloHelloHello' (pengulangan string)
a = True
b = False
print(a and b) # Output: False
print(a or b) # Output: True
print(not a) # Output: False
Dengan memahami tipe data dasar ini, Anda dapat mulai memanipulasi data dalam program
Python Anda. Tipe data ini merupakan fondasi penting yang akan sering digunakan dalam
berbagai operasi pemrograman di Python. Selanjutnya, kita akan membahas tentang kondisi jika-
maka dalam Python.
Kondisi jika-maka dalam Python memungkinkan Anda untuk membuat keputusan di dalam
program berdasarkan kondisi tertentu. Struktur ini sering digunakan untuk mengontrol alur
program berdasarkan perbandingan atau pengujian logika.
1. Pernyataan if
Pernyataan if digunakan untuk mengeksekusi blok kode tertentu jika suatu kondisi terpenuhi
(benar).
Contoh:
x = 10
if x > 5:
print("x lebih besar dari 5") # Output: x lebih besar dari 5
2. Pernyataan if-else
Pernyataan if-else digunakan ketika Anda ingin mengeksekusi blok kode alternatif jika kondisi
if tidak terpenuhi (salah).
Contoh:
x = 3
if x > 5:
print("x lebih besar dari 5")
else:
print("x tidak lebih besar dari 5") # Output: x tidak lebih besar dari 5
3. Pernyataan if-elif-else
Pernyataan if-elif-else digunakan untuk menguji beberapa kondisi. Jika kondisi if pertama tidak
terpenuhi, program akan menguji kondisi elif berikutnya, dan seterusnya. Jika tidak ada kondisi
yang terpenuhi, blok else akan dieksekusi.
Contoh:
x = 7
if x > 10:
print("x lebih besar dari 10")
elif x > 5:
print("x lebih besar dari 5 tetapi tidak lebih besar dari 10") # Output: x lebih
besar dari 5 tetapi tidak lebih besar dari 10
else:
print("x tidak lebih besar dari 5")
Contoh:
x = 8
if x > 5:
print("x lebih besar dari 5") # Output: x lebih besar dari 5
if x % 2 == 0:
print("x adalah bilangan genap") # Output: x adalah bilangan genap
else:
print("x adalah bilangan ganjil")
else:
print("x tidak lebih besar dari 5")
Contoh Aplikasi Praktis
nilai = 75
if nilai >= 85:
print("Nilai A")
elif nilai >= 70:
print("Nilai B") # Output: Nilai B
elif nilai >= 60:
print("Nilai C")
else:
print("Nilai D")
angka = -3
if angka > 0:
print("Angka positif")
elif angka == 0:
print("Angka nol")
else:
print("Angka negatif") # Output: Angka negatif
Dengan memahami kondisi jika-maka, Anda dapat membuat program yang dapat mengambil
keputusan berdasarkan kondisi tertentu. Ini adalah salah satu konsep dasar yang sangat penting
dalam pemrograman, yang memungkinkan Anda untuk mengontrol alur eksekusi program Anda.
Selanjutnya, kita akan membahas tentang looping dalam Python.
Looping
Looping atau perulangan memungkinkan Anda untuk mengeksekusi blok kode berulang kali
selama kondisi tertentu terpenuhi. Python mendukung dua jenis loop utama: while loop dan
for loop.
1. while Loop
while loop akan terus mengeksekusi blok kode selama kondisi yang diberikan bernilai benar
(True). Jika kondisi menjadi salah (False), eksekusi loop akan berhenti.
Contoh:
i = 1
while i <= 5:
print(i) # Output: 1 2 3 4 5
i += 1
2. for Loop
for loop digunakan untuk mengulangi elemen-elemen dalam urutan (seperti list, tuple, string,
atau range).
Contoh:
break
break digunakan untuk menghentikan loop sebelum kondisi loop terpenuhi.
Contoh:
i = 1
while i <= 10:
if i == 5:
break
print(i) # Output: 1 2 3 4
i += 1
continue
continue digunakan untuk melewati iterasi saat ini dan melanjutkan ke iterasi berikutnya.
Contoh:
Loop bersarang adalah loop di dalam loop lainnya. Ini digunakan ketika Anda perlu melakukan
perulangan dalam perulangan.
Contoh:
total = 0
for i in range(1, 11):
total += i
print("Total:", total) # Output: Total: 55
Dengan memahami konsep looping, Anda dapat mengeksekusi tugas berulang dengan efisien
dalam program Python Anda. Looping adalah alat yang sangat kuat dalam pemrograman,
memungkinkan Anda untuk mengelola dan memproses data dalam jumlah besar dengan mudah.
Selanjutnya, kita akan membahas tentang struktur data dalam Python.
Struktur Data
Struktur data adalah cara untuk mengorganisir dan menyimpan data agar bisa diakses dan
dimodifikasi dengan efisien. Python memiliki beberapa struktur data built-in yang sangat
berguna: list , tuple , dictionary , dan set .
1. List
List adalah struktur data yang dapat menyimpan berbagai jenis data dalam urutan tertentu. List
bersifat mutable, artinya elemen-elemen di dalamnya dapat diubah setelah list dibuat.
Contoh:
# Membuat list
buah = ["apel", "jeruk", "pisang"]
2. Tuple
Tuple mirip dengan list , namun bersifat immutable, artinya elemen-elemen di dalamnya tidak
dapat diubah setelah tuple dibuat.
Contoh:
# Membuat tuple
angka = (1, 2, 3, 4, 5)
3. Dictionary
Dictionary adalah struktur data yang menyimpan data dalam pasangan kunci-nilai. Kunci harus
unik dan bersifat immutable, sedangkan nilai dapat diubah.
Contoh:
# Membuat dictionary
mahasiswa = {
"nama": "Budi",
"umur": 21,
"jurusan": "Informatika"
}
4. Set
Set adalah struktur data yang menyimpan koleksi elemen unik dan tidak berurutan. Set
digunakan untuk operasi matematika seperti union, intersection, dan difference.
Contoh:
# Membuat set
angka = {1, 2, 3, 4, 5}
kontak = {
"Andi": "081234567890",
"Budi": "089876543210"
}
print(kontak["Andi"]) # Output: 081234567890
kontak["Cici"] = "082112345678"
print(kontak) # Output: {'Andi': '081234567890', 'Budi': '089876543210', 'Cici':
'082112345678'}
data = [1, 2, 3, 1, 2, 4, 5]
data_set = set(data)
print(data_set) # Output: {1, 2, 3, 4, 5}
Dengan memahami struktur data ini, Anda dapat mengorganisir dan memanipulasi data dalam
program Python Anda dengan cara yang lebih efisien dan efektif. Struktur data ini sangat penting
dalam pemrograman karena memungkinkan Anda untuk mengelola data dalam berbagai bentuk
dan ukuran. Selanjutnya, kita akan membahas tentang cara membuat fungsi dalam Python.
Function (Fungsi)
Fungsi adalah blok kode yang dapat digunakan kembali yang melakukan tugas tertentu. Fungsi
membantu membuat kode lebih modular, mudah dibaca, dan mudah dipelihara. Python
memungkinkan Anda untuk mendefinisikan fungsi Anda sendiri atau menggunakan fungsi
bawaan.
1. Definisi Fungsi
Fungsi didefinisikan menggunakan kata kunci def diikuti oleh nama fungsi, tanda kurung, dan
titik dua. Blok kode fungsi harus diindentasi.
Struktur dasar:
Contoh:
def salam(nama):
return f"Halo, {nama}!"
2. Memanggil Fungsi
Untuk menggunakan fungsi, Anda harus memanggilnya dengan menyebutkan nama fungsi
diikuti oleh tanda kurung yang berisi argumen (jika ada).
Contoh:
Fungsi dapat memiliki parameter, yang merupakan variabel yang digunakan untuk menerima
nilai saat fungsi dipanggil. Nilai yang Anda berikan kepada parameter saat memanggil fungsi
disebut argumen.
Contoh:
4. Parameter Default
Anda dapat memberikan nilai default kepada parameter. Jika argumen tidak diberikan saat fungsi
dipanggil, nilai default akan digunakan.
Contoh:
Anda dapat menggunakan *args dan **kwargs untuk menangani jumlah argumen yang tidak
terbatas dalam fungsi.
Contoh *args :
def jumlahkan(*args):
total = 0
for angka in args:
total += angka
return total
Contoh `kwargs`:**
def cetak_info(**kwargs):
for kunci, nilai in kwargs.items():
print(f"{kunci}: {nilai}")
6. Fungsi Lambda
Fungsi lambda adalah fungsi anonim kecil yang dapat memiliki sejumlah argumen tetapi hanya
satu ekspresi. Fungsi lambda sering digunakan untuk tugas-tugas sederhana yang membutuhkan
fungsi singkat.
Contoh:
tambah = lambda a, b: a + b
print(tambah(5, 3)) # Output: 8
genap = lambda x: x % 2 == 0
print(genap(4)) # Output: True
print(genap(5)) # Output: False
def faktorial(n):
if n == 0:
return 1
else:
return n * faktorial(n - 1)
print(faktorial(5)) # Output: 120
def adalah_prima(n):
if n <= 1:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
Dengan memahami konsep fungsi dalam Python, Anda dapat menulis kode yang lebih modular,
rapi, dan mudah dipelihara. Fungsi memungkinkan Anda untuk membagi program menjadi
bagian-bagian kecil yang dapat dikelola dan diuji secara terpisah. Selanjutnya, kita akan
membahas tentang cara mengimpor dan menginstal library serta package dalam Python.
Python memiliki ekosistem library dan package yang sangat kaya, yang memungkinkan Anda
untuk menambah fungsionalitas ke dalam program Anda tanpa harus menulis kode dari awal.
Library dan package ini bisa diimpor ke dalam program Python Anda untuk memanfaatkan
fungsionalitas tambahan.
Mengimpor library atau package dalam Python dilakukan menggunakan pernyataan import .
Anda dapat mengimpor seluruh library atau hanya bagian tertentu dari library tersebut.
import math
import numpy as np
pip adalah manajer paket untuk Python yang digunakan untuk menginstal library dan package
dari Python Package Index (PyPI).
Menginstal library:
Mengupgrade library:
pip install --upgrade nama_library
Menghapus library:
Anda dapat mengelola dependensi proyek Anda dengan menggunakan file requirements.txt .
File ini berisi daftar library yang dibutuhkan oleh proyek Anda.
numpy==1.21.0
pandas==1.3.3
matplotlib==3.4.3
import numpy as np
import pandas as pd
data = {
'Nama': ['Alice', 'Bob', 'Charlie'],
'Umur': [24, 27, 22]
}
df = pd.DataFrame(data)
print(df)
# Output:
# Nama Umur
# 0 Alice 24
# 1 Bob 27
# 2 Charlie 22
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Grafik x vs y')
plt.show()
Dengan memahami cara mengimpor dan menginstal library serta package, Anda dapat
memanfaatkan berbagai fungsionalitas tambahan yang disediakan oleh komunitas Python. Ini
akan memperluas kemampuan program Anda dan memungkinkan Anda untuk menyelesaikan
tugas-tugas kompleks dengan lebih efisien. Selanjutnya, kita akan membahas tentang
Pemrograman Berorientasi Objek (OOP) dalam Python.
Kelas adalah cetak biru atau template untuk membuat objek. Kelas mendefinisikan atribut dan
metode yang dimiliki oleh objek.
Objek adalah instance dari kelas. Setiap objek memiliki atribut dan metode yang didefinisikan
oleh kelasnya.
class Anjing:
def __init__(self, nama, umur):
self.nama = nama
self.umur = umur
def menggonggong(self):
return f"{self.nama} menggonggong!"
Atribut adalah variabel yang dimiliki oleh objek. Atribut didefinisikan dalam metode __init__
(konstruktor) kelas.
Metode adalah fungsi yang dimiliki oleh objek. Metode didefinisikan di dalam kelas dan biasanya
memanipulasi atau mengakses atribut objek.
Contoh:
class Mobil:
def __init__(self, merk, model, tahun):
self.merk = merk
self.model = model
self.tahun = tahun
def deskripsi(self):
return f"{self.merk} {self.model}, tahun {self.tahun}"
3. Enkapsulasi
Enkapsulasi adalah konsep OOP yang membatasi akses langsung ke atribut atau metode objek
dan hanya memungkinkan manipulasi melalui metode yang didefinisikan. Ini melindungi data
dari perubahan yang tidak diinginkan.
Contoh:
class BankAccount:
def __init__(self, nama, saldo):
self.__nama = nama # Atribut privat
self.__saldo = saldo # Atribut privat
def cek_saldo(self):
return self.__saldo
4. Pewarisan (Inheritance)
Pewarisan adalah konsep OOP yang memungkinkan sebuah kelas untuk mewarisi atribut dan
metode dari kelas lain. Kelas yang diwarisi disebut kelas induk (parent class), sedangkan kelas
yang mewarisi disebut kelas anak (child class).
Contoh:
class Hewan:
def __init__(self, nama):
self.nama = nama
def berbicara(self):
pass # Metode abstrak
class Anjing(Hewan):
def berbicara(self):
return "Guk guk!"
class Kucing(Hewan):
def berbicara(self):
return "Meong!"
5. Polimorfisme (Polymorphism)
Polimorfisme adalah konsep OOP yang memungkinkan metode yang sama untuk memiliki
perilaku yang berbeda pada kelas yang berbeda. Polimorfisme memungkinkan penggunaan
metode yang sama pada objek dari berbagai kelas.
Contoh:
class Burung:
def bersuara(self):
return "Cuit cuit!"
class Ayam(Burung):
def bersuara(self):
return "Kukuruyuk!"
class Itik(Burung):
def bersuara(self):
return "Kwek kwek!"
Dengan memahami konsep-konsep OOP seperti kelas dan objek, atribut dan metode,
enkapsulasi, pewarisan, dan polimorfisme, Anda dapat menulis kode yang lebih modular,
terstruktur, dan mudah dipelihara. OOP memungkinkan Anda untuk menciptakan model yang
lebih dekat dengan konsep dunia nyata, membuat program Anda lebih intuitif dan fleksibel.
Selanjutnya, kita akan membahas lebih dalam tentang penggunaan Python dalam pengolahan
data.
Bab 2 Pengolahan data menggunakan Python
NumPy adalah library Python yang digunakan untuk pengolahan data berbasis array. NumPy
menyediakan objek array multidimensi yang kuat serta berbagai fungsi matematis untuk
melakukan operasi pada array tersebut. Berikut adalah pengenalan dasar penggunaan NumPy.
1. Instalasi NumPy
Untuk menggunakan NumPy, Anda perlu menginstalnya terlebih dahulu. Anda dapat
menginstalnya menggunakan pip .
Membuat Array
Array NumPy dapat dibuat menggunakan fungsi array() dari library NumPy. Anda juga dapat
menggunakan fungsi lain seperti zeros() , ones() , dan arange() untuk membuat array.
Contoh:
import numpy as np
Anda dapat mengakses elemen dalam array menggunakan indeks. NumPy menggunakan indeks
berbasis nol (indeks pertama dimulai dari 0).
Contoh:
NumPy menyediakan berbagai operasi aritmatika yang dapat dilakukan pada array.
Contoh:
# Penjumlahan
print(array_a + array_b) # Output: [5 7 9]
# Pengurangan
print(array_a - array_b) # Output: [-3 -3 -3]
# Perkalian
print(array_a * array_b) # Output: [4 10 18]
# Pembagian
print(array_a / array_b) # Output: [0.25 0.4 0.5 ]
Contoh:
# Akar kuadrat
print(np.sqrt(array)) # Output: [1. 2. 3. 4.]
# Logaritma
print(np.log(array)) # Output: [0. 1.38629436 2.19722458 2.77258872]
# Sinus
print(np.sin(array)) # Output: [0.84147098 -0.7568025 0.41211849 -0.28790332]
Contoh:
Anda dapat menggunakan teknik indexing dan slicing untuk mengakses sebagian elemen dari
array.
Contoh:
Contoh:
# Mean (rata-rata)
print(np.mean(array)) # Output: 3.0
# Median
print(np.median(array)) # Output: 3.0
# Standar Deviasi
print(np.std(array)) # Output: 1.4142135623730951
Dengan memahami dasar-dasar pengolahan data array menggunakan NumPy, Anda dapat
melakukan operasi matematis dan manipulasi data dengan lebih efisien. NumPy adalah alat yang
sangat kuat untuk analisis data, dan memahami penggunaannya adalah langkah penting dalam
pengolahan data menggunakan Python. Selanjutnya, kita akan membahas tentang pengolahan
data CSV menggunakan pandas.
Pandas adalah library Python yang sangat populer untuk pengolahan data. Library ini
menyediakan struktur data dan alat analisis data yang mudah digunakan, termasuk untuk
pengolahan data CSV. CSV (Comma-Separated Values) adalah format file yang sering digunakan
untuk menyimpan data tabular. Berikut adalah pengenalan dasar penggunaan pandas untuk
pengolahan data CSV.
1. Instalasi Pandas
Untuk menggunakan pandas, Anda perlu menginstalnya terlebih dahulu. Anda dapat
menginstalnya menggunakan pip .
Anda dapat membaca data dari file CSV ke dalam DataFrame pandas menggunakan fungsi
read_csv() .
Contoh:
import pandas as pd
Contoh:
import pandas as pd
# Membuat DataFrame
data = pd.DataFrame({
'Nama': ['Alice', 'Bob', 'Charlie'],
'Umur': [24, 27, 22]
})
Contoh:
import pandas as pd
# Menghapus kolom
data = data.drop(columns=['KolomBaru'])
# Menampilkan statistik deskriptif
print(data.describe())
Anda dapat memilih dan memfilter data dalam DataFrame menggunakan indexing, slicing, dan
kondisi logis.
Contoh:
import pandas as pd
# Seleksi kolom
print(data['Kolom1'])
print(data[['Kolom1', 'Kolom2']])
Contoh:
import pandas as pd
# Membuat DataFrame
data1 = pd.DataFrame({
'Nama': ['Alice', 'Bob'],
'Umur': [24, 27]
})
data2 = pd.DataFrame({
'Nama': ['Charlie', 'David'],
'Umur': [22, 23]
})
7. Mengelompokkan Data
Pandas menyediakan fungsi groupby() untuk mengelompokkan data dan melakukan operasi
agregasi.
Contoh:
import pandas as pd
# Membuat DataFrame
data = pd.DataFrame({
'Nama': ['Alice', 'Bob', 'Charlie', 'Alice', 'Bob'],
'Nilai': [85, 90, 88, 92, 85]
})
Pandas menyediakan fungsi untuk menangani data yang hilang (missing data).
Contoh:
import pandas as pd
Dengan memahami dasar-dasar pengolahan data CSV menggunakan pandas, Anda dapat
melakukan berbagai operasi manipulasi dan analisis data dengan efisien. Pandas adalah alat
yang sangat kuat dan fleksibel untuk bekerja dengan data tabular dalam Python. Selanjutnya, kita
akan membahas tentang pengolahan data gambar menggunakan OpenCV dan Pillow.
Pengolahan data gambar adalah proses manipulasi dan analisis gambar digital. Python memiliki
beberapa library yang kuat untuk pengolahan gambar, termasuk OpenCV dan Pillow. Berikut
adalah pengenalan dasar penggunaan OpenCV dan Pillow untuk pengolahan data gambar.
Untuk menggunakan OpenCV dan Pillow, Anda perlu menginstalnya terlebih dahulu. Anda dapat
menginstalnya menggunakan pip .
Dengan OpenCV:
import cv2
# Membaca gambar
image = cv2.imread('image.jpg')
# Menyimpan gambar
cv2.imwrite('output.jpg', image)
Dengan Pillow:
# Membaca gambar
image = Image.open('image.jpg')
# Menyimpan gambar
image.save('output.jpg')
3. Menampilkan Gambar
Dengan OpenCV:
import cv2
# Membaca gambar
image = cv2.imread('image.jpg')
# Menampilkan gambar
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Dengan Pillow:
# Membaca gambar
image = Image.open('image.jpg')
# Menampilkan gambar
image.show()
import cv2
# Membaca gambar
image = cv2.imread('image.jpg')
Dengan Pillow:
# Membaca gambar
image = Image.open('image.jpg')
Dengan OpenCV:
import cv2
# Membaca gambar
image = cv2.imread('image.jpg')
Dengan Pillow:
from PIL import Image
# Membaca gambar
image = Image.open('image.jpg')
Dengan OpenCV:
import cv2
# Membaca gambar
image = cv2.imread('image.jpg')
Dengan Pillow:
# Membaca gambar
image = Image.open('image.jpg')
7. Rotasi Gambar
Dengan OpenCV:
import cv2
# Membaca gambar
image = cv2.imread('image.jpg')
Dengan Pillow:
# Membaca gambar
image = Image.open('image.jpg')
Dengan OpenCV:
import cv2
# Membaca gambar
image = cv2.imread('image.jpg')
Dengan Pillow:
# Membaca gambar
image = Image.open('image.jpg')
Dengan memahami dasar-dasar pengolahan data gambar menggunakan OpenCV dan Pillow,
Anda dapat melakukan berbagai operasi manipulasi gambar dengan efisien. OpenCV dan Pillow
adalah alat yang sangat kuat untuk bekerja dengan gambar dalam Python, dan memahami
penggunaannya adalah langkah penting dalam pengolahan data gambar. Selanjutnya, kita akan
membahas tentang bagaimana mengintegrasikan semua konsep yang telah dipelajari untuk
membangun aplikasi pengolahan data yang lebih kompleks.
Bab 3 Pembuatan REST API dengan FastAPI
Pengenalan FastAPI
FastAPI adalah framework modern untuk membangun aplikasi web dan API menggunakan
Python. Dikembangkan oleh Sebastián Ramírez, FastAPI dirancang untuk menawarkan kinerja
tinggi dengan penulisan kode yang bersih dan mudah dipahami.
FastAPI adalah framework web untuk Python yang memungkinkan Anda untuk membangun API
RESTful dengan cepat dan efisien. FastAPI menggunakan tipe anotasi Python untuk menghasilkan
dokumentasi API secara otomatis dan menawarkan validasi input secara otomatis menggunakan
Pydantic.
• Kinerja Tinggi: Dibangun di atas ASGI (Asynchronous Server Gateway Interface) dan
menggunakan Uvicorn sebagai server ASGI default, FastAPI mampu menangani permintaan
dengan sangat cepat.
• Validasi Input Otomatis: Menggunakan Pydantic untuk validasi input dan penanganan
kesalahan secara otomatis.
• Kinerja yang Cepat: FastAPI menawarkan kinerja yang setara dengan Node.js dan Go,
menjadikannya salah satu framework Python tercepat.
• Mudah Digunakan: Penulisan kode dengan FastAPI intuitif dan mudah dipahami, dengan
dukungan dokumentasi yang sangat baik.
• Validasi Input yang Kuat: Dengan Pydantic, FastAPI memastikan bahwa data yang diterima
oleh API selalu divalidasi dengan benar.
• Pengembangan Cepat: Dengan fitur seperti dokumentasi otomatis dan validasi input,
FastAPI memungkinkan pengembangan aplikasi dengan cepat dan efisien.
1. Aplikasi FastAPI: Sebuah aplikasi FastAPI adalah instance dari kelas FastAPI .
2. Route dan Endpoint: Route adalah URL yang digunakan untuk mengakses endpoint
tertentu dalam aplikasi API. Endpoint adalah fungsi yang menangani permintaan HTTP ke
route tertentu.
3. Path Parameters: Parameter yang ditentukan dalam path URL. Contoh: /items/{item_id} .
4. Query Parameters: Parameter yang ditentukan setelah tanda tanya ? dalam URL. Contoh:
/items?skip=0&limit=10 .
5. Request Body: Data yang dikirim oleh klien dalam permintaan HTTP POST, PUT, atau PATCH.
6. Response Model: Model yang digunakan untuk menentukan struktur data yang akan
dikembalikan oleh API.
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
Penjelasan:
• read_root() adalah fungsi yang menangani permintaan GET ke root URL dan
mengembalikan pesan "Hello, World!".
• read_item(item_id: int, q: str = None) adalah fungsi yang menangani permintaan GET ke
/items/{item_id} dan mengembalikan item_id serta parameter query q (jika ada).
Dengan memahami konsep dasar ini, Anda dapat mulai membangun API menggunakan FastAPI.
Selanjutnya, kita akan membahas tentang instalasi dan persiapan lingkungan untuk memulai
proyek FastAPI.
FastAPI dan Uvicorn adalah dua komponen utama yang Anda perlukan untuk memulai
pembangunan aplikasi API. FastAPI adalah framework web, sedangkan Uvicorn adalah server
ASGI yang cepat untuk menjalankan aplikasi FastAPI.
Langkah-langkah instalasi:
myenv\Scripts\activate
• Di macOS/Linux:
source myenv/bin/activate
Setelah menginstal FastAPI dan Uvicorn, langkah berikutnya adalah menyiapkan proyek FastAPI.
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
2. Penjelasan:
• main:app menunjukkan file main.py dan objek app di dalamnya.
• --reload memungkinkan server untuk otomatis memuat ulang ketika ada perubahan
pada kode.
Mengakses Aplikasi:
1. Buka browser dan akses http://127.0.0.1:8000 untuk melihat pesan "Hello, World!". Anda
juga dapat mengakses dokumentasi otomatis yang dihasilkan oleh FastAPI di
http://127.0.0.1:8000/docs (Swagger UI) dan http://127.0.0.1:8000/redoc (Redoc).
Struktur Direktori Proyek FastAPI
Untuk proyek FastAPI yang lebih besar dan kompleks, penting untuk memiliki struktur direktori
yang terorganisir. Berikut adalah contoh struktur direktori yang disarankan:
my_fastapi_project/
├── app/
│ ├── __init__.py
│ ├── main.py
│ ├── models.py
│ ├── schemas.py
│ ├── crud.py
│ ├── database.py
│ ├── routers/
│ │ ├── __init__.py
│ │ ├── items.py
│ │ └── users.py
│ └── core/
│ ├── __init__.py
│ ├── config.py
│ └── security.py
├── requirements.txt
└── README.md
Penjelasan:
Endpoint dalam FastAPI adalah titik akhir (URL) yang dapat diakses oleh klien untuk berinteraksi
dengan aplikasi. Endpoint didefinisikan menggunakan decorator seperti @app.get() ,
@app.post() , dan sebagainya, yang menunjukkan metode HTTP yang digunakan.
Mulailah dengan membuat file baru bernama main.py dan mendefinisikan aplikasi FastAPI
dasar.
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
Penjelasan:
• @app.get("/") adalah decorator yang mendefinisikan endpoint GET pada root URL ( / ).
• read_root() adalah fungsi yang menangani permintaan GET ke root URL dan
mengembalikan pesan "Hello, World!".
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id}
Penjelasan:
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price}
Penjelasan:
FastAPI menyediakan beberapa decorator untuk mendefinisikan endpoint dengan metode HTTP
yang berbeda, seperti @app.get() , @app.post() , @app.put() , @app.delete() , dan lain-lain.
@app.delete("/items/{item_id}")
def delete_item(item_id: int):
return {"item_id": item_id, "status": "deleted"}
Penjelasan:
• update_item(item_id: int, item: Item) menerima parameter item_id dan objek Item , lalu
mengembalikan informasi tentang item yang diperbarui.
Berikut adalah contoh aplikasi FastAPI lengkap dengan endpoint GET, POST, PUT, dan DELETE.
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id}
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_id": item_id, "item_name": item.name, "item_price": item.price}
@app.delete("/items/{item_id}")
def delete_item(item_id: int):
return {"item_id": item_id, "status": "deleted"}
Menjalankan Aplikasi:
Untuk menjalankan aplikasi, buka terminal dan jalankan perintah berikut:
Dengan memahami cara membuat endpoint dasar menggunakan FastAPI, Anda dapat mulai
membangun API yang lebih kompleks dan menangani berbagai permintaan HTTP. Selanjutnya,
Anda dapat menjelajahi cara menangani request dan response secara lebih mendetail.
Dalam pengembangan API dengan FastAPI, memahami cara menangani request dan response
adalah hal yang penting. FastAPI menyediakan berbagai fitur untuk mempermudah proses ini,
termasuk penggunaan Pydantic untuk validasi data dan tipe anotasi untuk memastikan tipe data
yang tepat.
FastAPI menggunakan Pydantic untuk validasi dan parsing request body. Anda dapat
mendefinisikan model data dengan Pydantic untuk memastikan bahwa data yang dikirimkan oleh
klien sesuai dengan yang diharapkan.
Contoh:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.post("/items/")
def create_item(item: Item):
return item
Penjelasan:
• Item adalah model Pydantic yang mendefinisikan struktur data yang diterima oleh
endpoint.
• Endpoint /items/ menerima request body berupa objek Item dan mengembalikan data
yang sama.
FastAPI memungkinkan Anda untuk mengelola path parameters dan query parameters dengan
mudah.
Path Parameters:
Path parameters adalah bagian dari URL yang digunakan untuk mengidentifikasi sumber daya
tertentu.
Contoh:
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id}
Penjelasan:
• item_id: int mendefinisikan path parameter item_id yang harus berupa integer.
Query Parameters:
Query parameters adalah bagian dari URL yang digunakan untuk mengirimkan data non-
hierarkis.
Contoh:
@app.get("/items/")
def read_item(skip: int = 0, limit: int = 10):
return {"skip": skip, "limit": limit}
Penjelasan:
• skip dan limit adalah query parameters dengan nilai default masing-masing 0 dan 10.
Anda dapat menggunakan Pydantic untuk mendefinisikan model data yang akan dikembalikan
sebagai response. Anda juga dapat menentukan status code yang dikembalikan oleh endpoint.
Contoh:
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
class ItemResponse(BaseModel):
name: str
price_with_tax: float
Penjelasan:
• status_code=201 menunjukkan bahwa status code untuk response adalah 201 (Created).
FastAPI memungkinkan Anda untuk menangani request body yang kompleks dengan
menggunakan nested models dan list.
Contoh:
app = FastAPI()
class SubItem(BaseModel):
name: str
description: str = None
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
sub_items: List[SubItem] = []
@app.post("/items/")
def create_item(item: Item):
return item
Penjelasan:
• SubItem adalah model Pydantic yang digunakan sebagai nested model dalam Item .
• sub_items adalah daftar ( List ) dari objek SubItem .
Dengan memahami cara menangani request dan response dalam FastAPI, Anda dapat
membangun API yang robust dan efisien. FastAPI memberikan fleksibilitas dan kemudahan
dalam menangani berbagai jenis data dan memastikan bahwa API Anda berfungsi dengan baik
dan aman. Selanjutnya, Anda dapat mempelajari cara mengimplementasikan operasi CRUD
dalam aplikasi FastAPI.
Operasi CRUD (Create, Read, Update, Delete) adalah dasar dari aplikasi yang mengelola data.
FastAPI memudahkan implementasi operasi CRUD dengan menggunakan model data yang
divalidasi oleh Pydantic dan integrasi yang baik dengan berbagai database.
Pydantic digunakan untuk mendefinisikan model data yang akan divalidasi saat request masuk
dan keluar dari API.
Contoh:
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
Penjelasan:
• Item adalah model Pydantic yang mendefinisikan struktur data dengan tipe data yang jelas
untuk setiap atribut.
Contoh:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
items = []
@app.post("/items/", response_model=Item)
def create_item(item: Item):
items.append(item)
return item
Penjelasan:
• create_item menerima objek Item sebagai request body dan menambahkannya ke daftar
items .
Operasi Read digunakan untuk membaca atau mengambil data dari sistem.
Contoh:
@app.get("/items/", response_model=List[Item])
def read_items():
return items
@app.get("/items/{item_id}", response_model=Item)
def read_item(item_id: int):
return items[item_id]
Penjelasan:
Operasi Update digunakan untuk memperbarui data yang ada dalam sistem.
Contoh:
@app.put("/items/{item_id}", response_model=Item)
def update_item(item_id: int, item: Item):
items[item_id] = item
return item
Penjelasan:
• update_item menerima item_id dan objek Item sebagai request body dan memperbarui
item dalam daftar items berdasarkan item_id .
Contoh:
@app.delete("/items/{item_id}", response_model=Item)
def delete_item(item_id: int):
return items.pop(item_id)
Penjelasan:
• delete_item menghapus item dari daftar items berdasarkan item_id dan mengembalikan
item yang dihapus.
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
items = []
@app.post("/items/", response_model=Item)
def create_item(item: Item):
items.append(item)
return item
@app.get("/items/", response_model=List[Item])
def read_items():
return items
@app.get("/items/{item_id}", response_model=Item)
def read_item(item_id: int):
if item_id >= len(items):
raise HTTPException(status_code=404, detail="Item not found")
return items[item_id]
@app.put("/items/{item_id}", response_model=Item)
def update_item(item_id: int, item: Item):
if item_id >= len(items):
raise HTTPException(status_code=404, detail="Item not found")
items[item_id] = item
return item
@app.delete("/items/{item_id}", response_model=Item)
def delete_item(item_id: int):
if item_id >= len(items):
raise HTTPException(status_code=404, detail="Item not found")
return items.pop(item_id)
Penjelasan:
• delete_item menghapus item berdasarkan item_id , dengan pengecekan apakah item ada
atau tidak.
Dengan memahami dan mengimplementasikan operasi CRUD ini, Anda dapat mengelola data
dalam aplikasi FastAPI dengan efektif. Operasi CRUD adalah dasar dari banyak aplikasi web dan
API, memungkinkan interaksi penuh dengan data dalam sistem. Selanjutnya, Anda dapat
menjelajahi cara mengintegrasikan aplikasi FastAPI dengan database untuk menyimpan dan
mengambil data dengan lebih efisien.
Integrasi dengan database adalah langkah penting dalam membangun aplikasi yang persisten,
dimana data disimpan di database dan dapat diakses kembali. FastAPI dapat dengan mudah
diintegrasikan dengan berbagai jenis database, salah satunya menggunakan SQLAlchemy untuk
database relasional.
SQLAlchemy adalah toolkit SQL dan Object-Relational Mapping (ORM) untuk Python yang
memungkinkan Anda untuk berinteraksi dengan database menggunakan objek Python.
Instalasi SQLAlchemy
Instal SQLAlchemy dan asyncpg (untuk PostgreSQL) atau aiomysql (untuk MySQL) untuk
mendukung operasi asinkron.
Contoh:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL = "postgresql://user:password@localhost/dbname"
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
Penjelasan:
Buat model database dengan mewarisi Base . Model ini akan direpresentasikan sebagai tabel
dalam database.
Contoh:
class Item(Base):
__tablename__ = "items"
Penjelasan:
• Setiap kolom direpresentasikan oleh instance Column dengan tipe data yang sesuai.
Membuat dan Mengelola Skema Database
Tambahkan fungsi untuk membuat skema database berdasarkan model yang telah didefinisikan.
Contoh:
def init_db():
Base.metadata.create_all(bind=engine)
Panggil fungsi ini saat aplikasi mulai untuk memastikan skema database dibuat.
Contoh:
models.Base.metadata.create_all(bind=engine)
app = FastAPI()
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
Penjelasan:
• get_db adalah fungsi dependency yang menghasilkan sesi database dan menutupnya
setelah digunakan.
Membuat Operasi CRUD dengan Database
Contoh:
@app.post("/items/", response_model=schemas.Item)
def create_item(item: schemas.ItemCreate, db: Session = Depends(get_db)):
db_item = models.Item(**item.dict())
db.add(db_item)
db.commit()
db.refresh(db_item)
return db_item
@app.get("/items/{item_id}", response_model=schemas.Item)
def read_item(item_id: int, db: Session = Depends(get_db)):
db_item = db.query(models.Item).filter(models.Item.id == item_id).first()
if db_item is None:
raise HTTPException(status_code=404, detail="Item not found")
return db_item
@app.put("/items/{item_id}", response_model=schemas.Item)
def update_item(item_id: int, item: schemas.ItemCreate, db: Session = Depends(get_db)):
db_item = db.query(models.Item).filter(models.Item.id == item_id).first()
if db_item is None:
raise HTTPException(status_code=404, detail="Item not found")
for key, value in item.dict().items():
setattr(db_item, key, value)
db.commit()
db.refresh(db_item)
return db_item
@app.delete("/items/{item_id}", response_model=schemas.Item)
def delete_item(item_id: int, db: Session = Depends(get_db)):
db_item = db.query(models.Item).filter(models.Item.id == item_id).first()
if db_item is None:
raise HTTPException(status_code=404, detail="Item not found")
db.delete(db_item)
db.commit()
return db_item
Penjelasan:
Berikut adalah contoh lengkap aplikasi FastAPI dengan operasi CRUD yang terintegrasi dengan
database:
models.Base.metadata.create_all(bind=engine)
app = FastAPI()
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.post("/items/", response_model=schemas.Item)
def create_item(item: schemas.ItemCreate, db: Session = Depends(get_db)):
db_item = models.Item(**item.dict())
db.add(db_item)
db.commit()
db.refresh(db_item)
return db_item
@app.get("/items/", response_model=List[schemas.Item])
def read_items(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
items = db.query(models.Item).offset(skip).limit(limit).all()
return items
@app.get("/items/{item_id}", response_model=schemas.Item)
def read_item(item_id: int, db: Session = Depends(get_db)):
db_item = db.query(models.Item).filter(models.Item.id == item_id).first()
if db_item is None:
raise HTTPException(status_code=404, detail="Item not found")
return db_item
@app.put("/items/{item_id}", response_model=schemas.Item)
def update_item(item_id: int, item: schemas.ItemCreate, db: Session = Depends(get_db)):
db_item = db.query(models.Item).filter(models.Item.id == item_id).first()
if db_item is None:
raise HTTPException(status_code=404, detail="Item not found")
for key, value in item.dict().items():
setattr(db_item, key, value)
db.commit()
db.refresh(db_item)
return db_item
@app.delete("/items/{item_id}", response_model=schemas.Item)
def delete_item(item_id: int, db: Session = Depends(get_db)):
db_item = db.query(models.Item).filter(models.Item.id == item_id).first()
if db_item is None:
raise HTTPException(status_code=404, detail="Item not found")
db.delete(db_item)
db.commit()
return db_item
Dengan integrasi ini, Anda dapat menyimpan dan mengambil data dari database, memastikan
bahwa data tetap persisten dan dapat diakses kembali di masa mendatang. Integrasi dengan
database adalah langkah penting untuk membangun aplikasi yang skalabel dan dapat
diandalkan. Selanjutnya, Anda dapat mengeksplorasi autentikasi dan otorisasi untuk
mengamankan aplikasi Anda.
Autentikasi dan otorisasi adalah dua konsep penting dalam keamanan aplikasi. Autentikasi
memastikan bahwa pengguna yang mengakses aplikasi adalah pengguna yang sah, sedangkan
otorisasi menentukan apa yang dapat dilakukan oleh pengguna tersebut dalam aplikasi.
OAuth2 adalah protokol standar untuk otentikasi dan otorisasi. FastAPI menyediakan dukungan
bawaan untuk OAuth2.
Langkah-langkah:
class User(Base):
__tablename__ = "users"
class UserCreate(BaseModel):
username: str
password: str
class UserInDB(UserCreate):
hashed_password: str
class UserOut(BaseModel):
id: int
username: str
def get_password_hash(password):
return pwd_context.hash(password)
SECRET_KEY = "your_secret_key"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@app.post("/token", response_model=Token)
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
user = authenticate_user(fake_users_db, form_data.username, form_data.password)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Incorrect username or password",
headers={"WWW-Authenticate": "Bearer"},
)
access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
access_token = create_access_token(
data={"sub": user.username}, expires_delta=access_token_expires
)
return {"access_token": access_token, "token_type": "bearer"}
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
Otorisasi berbasis peran memungkinkan Anda untuk mengatur akses ke endpoint tertentu
berdasarkan peran pengguna.
Contoh:
class UserRole(BaseModel):
username: str
roles: List[str]
fake_roles_db = {
"alice": ["admin"],
"bob": ["user"]
}
Penjelasan:
JWT adalah token yang digunakan untuk autentikasi. Token ini dienkripsi dan dikirimkan dalam
header HTTP untuk mengautentikasi permintaan.
Contoh:
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
SECRET_KEY = "your_secret_key"
ALGORITHM = "HS256"
@app.get("/users/me")
def read_users_me(current_user: str = Depends(get_current_user)):
return {"username": current_user}
Penjelasan:
Validasi input dan penanganan error adalah aspek penting dalam pengembangan API yang
andal. FastAPI menyediakan alat yang kuat untuk validasi input menggunakan Pydantic dan
mekanisme untuk menangani error secara efektif.
FastAPI menggunakan Pydantic untuk validasi input secara otomatis. Pydantic memastikan
bahwa data yang diterima oleh API sesuai dengan tipe data dan batasan yang telah ditentukan.
Contoh:
app = FastAPI()
class Item(BaseModel):
name: str
description: str = Field(None, max_length=300)
price: float = Field(..., gt=0)
tax: float = Field(None, ge=0)
@app.post("/items/")
def create_item(item: Item):
return item
Penjelasan:
• Field digunakan untuk menambahkan validasi tambahan pada atribut model, seperti
max_length , gt (greater than), dan ge (greater or equal).
• FastAPI akan secara otomatis memvalidasi input berdasarkan definisi model Item .
FastAPI menyediakan kelas HTTPException untuk menangani error HTTP. Anda dapat
menggunakan HTTPException untuk mengembalikan kode status dan pesan error khusus.
Contoh:
@app.get("/items/{item_id}")
def read_item(item_id: int):
if item_id < 0:
raise HTTPException(status_code=400, detail="Invalid item ID")
return {"item_id": item_id}
Penjelasan:
• HTTPException digunakan untuk mengembalikan error dengan kode status 400 (Bad
Request) jika item_id kurang dari 0.
Anda dapat membuat custom exception handler untuk menangani jenis error tertentu secara
khusus.
Contoh:
@app.exception_handler(ItemNotFoundException)
def item_not_found_exception_handler(request: Request, exc: ItemNotFoundException):
return JSONResponse(
status_code=404,
content={"message": f"Item with ID {exc.item_id} not found"},
)
@app.get("/items/{item_id}")
def read_item(item_id: int):
if item_id >= len(items):
raise ItemNotFoundException(item_id=item_id)
return items[item_id]
Penjelasan:
Middleware adalah komponen yang digunakan untuk memproses permintaan dan respons
sebelum atau setelah endpoint dijalankan. Anda dapat menggunakan middleware untuk
penanganan error global.
Contoh:
class ErrorHandlerMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
try:
response = await call_next(request)
except Exception as e:
return JSONResponse(status_code=500, content={"message": "Internal Server
Error"})
return response
middleware = [
Middleware(ErrorHandlerMiddleware)
]
app = FastAPI(middleware=middleware)
@app.get("/")
def read_root():
raise Exception("This is a test error")
Penjelasan:
Dengan memahami dan mengimplementasikan validasi dan penanganan error, Anda dapat
memastikan bahwa aplikasi FastAPI Anda lebih robust dan dapat menangani berbagai kondisi
error dengan baik. Validasi input yang kuat membantu mencegah data yang tidak valid masuk ke
sistem, sementara penanganan error yang efektif memastikan bahwa pengguna mendapatkan
feedback yang jelas dan tepat ketika terjadi masalah. Selanjutnya, Anda dapat mengeksplorasi
dokumentasi otomatis yang dihasilkan oleh FastAPI.
FastAPI secara otomatis menghasilkan dokumentasi API yang interaktif menggunakan Swagger
UI dan Redoc. Ini membantu pengembang dan pengguna API untuk memahami, menguji, dan
menggunakan endpoint yang tersedia.
• Swagger UI: Antarmuka pengguna yang interaktif untuk menguji endpoint API secara
langsung dari browser.
Setelah menjalankan aplikasi FastAPI, Anda dapat mengakses dokumentasi di URL berikut:
• Redoc: http://127.0.0.1:8000/redoc
Swagger UI:
Swagger UI memberikan antarmuka interaktif yang memungkinkan Anda untuk menguji
endpoint API. Anda dapat mengirimkan permintaan HTTP (GET, POST, PUT, DELETE) dan melihat
respons secara langsung.
Redoc:
Redoc menyediakan dokumentasi API yang rapi dan terstruktur. Ini sangat berguna untuk
memahami hierarki endpoint dan model data yang digunakan oleh API.
Anda dapat menyesuaikan dokumentasi API dengan menambahkan metadata pada aplikasi
FastAPI.
Contoh:
app = FastAPI(
title="My API",
description="This is a sample API using FastAPI",
version="1.0.0",
terms_of_service="http://example.com/terms/",
contact={
"name": "API Support",
"url": "http://example.com/contact/",
"email": "[email protected]",
},
license_info={
"name": "Apache 2.0",
"url": "https://www.apache.org/licenses/LICENSE-2.0.html",
},
)
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
Penjelasan:
Anda dapat mengelompokkan endpoint menggunakan tag untuk membuat dokumentasi lebih
terstruktur.
Contoh:
app = FastAPI()
@app.get("/items/", tags=["items"])
def read_items():
return [{"name": "Item 1"}, {"name": "Item 2"}]
@app.post("/items/", tags=["items"])
def create_item(item: dict):
return item
@app.get("/users/", tags=["users"])
def read_users():
return [{"username": "User 1"}, {"username": "User 2"}]
Penjelasan:
Anda dapat menambahkan deskripsi pada endpoint dan mendefinisikan model response untuk
memperkaya dokumentasi.
Contoh:
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
Penjelasan:
Anda dapat menyembunyikan endpoint tertentu dari dokumentasi jika tidak ingin ditampilkan.
Contoh:
@app.get("/hidden-endpoint", include_in_schema=False)
def hidden_endpoint():
return {"message": "This endpoint is hidden from the documentation"}
Penjelasan:
Dengan memahami dan menggunakan dokumentasi otomatis yang dihasilkan oleh FastAPI, Anda
dapat membuat API Anda lebih mudah digunakan dan dipahami oleh pengembang lain.
Dokumentasi yang baik membantu dalam pengembangan, pemeliharaan, dan pengujian API
secara efektif. Selanjutnya, Anda dapat mengeksplorasi cara menulis dan menjalankan pengujian
untuk API FastAPI Anda.
Pengujian adalah langkah penting dalam pengembangan aplikasi untuk memastikan bahwa
fungsionalitas yang diimplementasikan bekerja sesuai yang diharapkan. FastAPI mendukung
berbagai jenis pengujian, termasuk unit testing dan integration testing.
Unit test memeriksa fungsionalitas individu dari unit kecil kode, sedangkan integration test
memeriksa bagaimana beberapa unit bekerja bersama-sama.
Instalasi Pytest:
1. Pytest adalah framework pengujian yang kuat dan mudah digunakan untuk Python.
pip install pytest
client = TestClient(app)
def test_read_root():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "Hello, World!"}
def test_create_item():
response = client.post(
"/items/",
json={"name": "Item 1", "description": "This is item 1", "price": 10.0, "tax":
1.0}
)
assert response.status_code == 200
assert response.json() == {
"name": "Item 1",
"description": "This is item 1",
"price": 10.0,
"tax": 1.0
}
Penjelasan:
• TestClient dari FastAPI digunakan untuk mengirimkan permintaan HTTP ke aplikasi FastAPI.
• test_read_root menguji endpoint root ( / ) dan memeriksa status kode dan respons JSON.
• test_create_item menguji endpoint untuk membuat item ( /items/ ) dan memeriksa status
kode serta respons JSON.
pytest
Pytest akan secara otomatis menemukan dan menjalankan semua fungsi yang dimulai dengan
test_ .
Mocking digunakan untuk menggantikan bagian dari sistem dengan tiruan yang dikendalikan
selama pengujian. FastAPI mendukung pengujian asinkron yang memungkinkan Anda untuk
menguji fungsi asinkron secara efektif.
Contoh Mocking:
def test_create_item_with_mock():
with patch("main.get_db") as mock_get_db:
mock_get_db.return_value = iter([mock_db_session])
response = client.post(
"/items/",
json={"name": "Item 1", "description": "This is item 1", "price": 10.0,
"tax": 1.0}
)
assert response.status_code == 200
assert response.json() == {
"name": "Item 1",
"description": "This is item 1",
"price": 10.0,
"tax": 1.0
}
Penjelasan:
• patch digunakan untuk menggantikan fungsi get_db dengan mock yang mengembalikan
sesi database tiruan ( mock_db_session ).
@pytest.mark.asyncio
async def test_read_item():
async with AsyncClient(app=app, base_url="http://test") as ac:
response = await ac.get("/items/1")
assert response.status_code == 200
assert response.json() == {"item_id": 1}
Penjelasan:
Untuk menguji aplikasi yang terhubung dengan database, Anda perlu menyiapkan lingkungan
pengujian yang terisolasi.
Contoh:
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
Base.metadata.create_all(bind=engine)
def override_get_db():
try:
db = TestingSessionLocal()
yield db
finally:
db.close()
app.dependency_overrides[get_db] = override_get_db
client = TestClient(app)
def test_create_item():
response = client.post(
"/items/",
json={"name": "Item 1", "description": "This is item 1", "price": 10.0, "tax":
1.0}
)
assert response.status_code == 200
assert response.json() == {
"name": "Item 1",
"description": "This is item 1",
"price": 10.0,
"tax": 1.0
}
Penjelasan:
• create_engine dan sessionmaker digunakan untuk membuat engine dan sesi database
untuk pengujian.
Dengan memahami dan menerapkan pengujian menggunakan pytest, mocking, dan pengujian
asinkron, Anda dapat memastikan bahwa aplikasi FastAPI Anda berfungsi dengan benar dan
menangani berbagai kondisi dengan baik. Pengujian yang baik membantu dalam menjaga
kualitas kode dan mencegah regresi saat menambahkan fitur baru.
Deployment adalah proses menempatkan aplikasi yang telah Anda buat ke server agar dapat
diakses oleh pengguna. FastAPI mendukung berbagai metode deployment yang memungkinkan
Anda untuk menjalankan aplikasi di berbagai lingkungan.
Uvicorn adalah server ASGI yang cepat dan ringan untuk menjalankan aplikasi FastAPI. Uvicorn
dapat digunakan untuk menjalankan aplikasi secara lokal atau di server produksi.
Menjalankan Aplikasi Secara Lokal:
1. Instal Uvicorn:
pip install uvicorn
2. Menjalankan Aplikasi:
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
3. Penjelasan:
• main:app menunjukkan file main.py dan objek app di dalamnya.
• --reload memungkinkan server untuk otomatis memuat ulang ketika ada perubahan
pada kode (hanya untuk pengembangan).