Tutorial RESTful API dengan Flask Python Part 4— Create, Update, Delete
Membuat RESTful API dengan Micro Framework Python, Flask Part 4—Create, Update, Delete
Halo semua, kembali lagi bersama Kiddy yang lagi asik bahas Flask Python. Pada kesempatan kali ini saya mau lanjutin CRUD kita. Pada tutorial sebelumnya, kita hanya membahas cara membuat Read. Sekarang kita akan lanjutkan hingga jadi CUD.
Oke langsung lanjut ya, sekarang kita ubah dulu model user kita yang berada di model/user.py. Tambahkan kode berikut pada paling atas file.
from werkzeug.security import generate_password_hash, check_password_hash
Setelah itu kita akan menambahkan dua method, yaitu untuk melakukan hashing pada password, dan melakukan check pada password yang di hash.
class Users(db.Model):
id = db.Column(db.BigInteger, primary_key=True, autoincrement=True)
name = db.Column(db.String(230), nullable=False)
email = db.Column(db.String(120), index=True, unique=True, nullable=False)
password = db.Column(db.String(128), nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow)
def __repr__(self):
return '<User {}>'.format(self.name)
def setPassword(self, password):
self.password = generate_password_hash(password)
def checkPassword(self, password):
return check_password_hash(self.password, password)
Terlihat dua method tambahan yaitu setPassword dan checkPassword.
Sekarang buka UserController.py dan tambahkan method sebagai berikut:
def store():
try:
name = request.json['name']
email = request.json['email']
password = request.json['password']
users = Users(name=name, email=email)
users.setPassword(password)
db.session.add(users)
db.session.commit()
return response.ok('', 'Successfully create data!')
except Exception as e:
print(e)
Ohiya, jangan lupa import library ini agar bisa menggunakan fungsi request.
from flask import request
Jadi pada request store kita akan menggunakan tipe data form json atau biasanya application/json. Nah apabila agan-agan ingin menggunakan form request tinggal ganti saja ke request.form.get(‘name’) untuk mendapatkan body request, sisanya bisa baca disini https://stackoverflow.com/questions/10434599/get-the-data-received-in-a-flask-request
Oke sekarang pasti ada yang bertanya-tanya apaan tuh db.session.add() dan apa itu db.session.commit()? Ya kan? Ngaku klean!
Nah saya kutip dari web resminya langsung yaitu Flask SQL Alchemy.
Yang kalo diartiin gini:
Sesi disini tuh bukannya sesi si Flask, tapi sesi si Flask-SQLAlchemy. Ini tuh lebih ke pengembangan database transaksi tingkat lanjut.
Nah kenapa kamu perlu buat objek terlebih dahulu dulu? Karena sebelum kamu nambahin objek kedalam sesi, SQLAlchemy sebenernya ngga berniat untuk nambahin itu ke transaksi alias Database. Hal ini baik karena kamu masih bisa aja ngerubah isi konten dari Objek tersebut. Sebagai contoh, coba deh pikirin ngebuat sebuah post tapi agan sebagai programmer cuma mau ngoper objek ini ke view atau class lain daripada langsung dimasukin ke database.
Nah fungsi add() ini akan nambahin si objek tersebut ke database. Ini bakalan jalanin query INSERT di database tapi ngga langsung dikerjain. Karena ngga langsung dikerjain, ya alias mirip-mirip async maka kita ngga akan dapet si ID User secepatnya, oleh karena itu biar kita nyuruh si Flask buat cepetan ngerjain dan nambahin datanya kita perlu commit perintah tersebut pake fungsi commit().
Oke sekarang setelah cocot panjang lebar jelasinnya kita buat dulu routesnya, masuk ke routes.py dan ubah sedikit pada bagian /users menjadi seperti ini.
@app.route('/users', methods=['POST', 'GET'])
def users():
if request.method == 'GET':
return UserController.index()
else:
return UserController.store()
Salah satu kelemahan Flask adalah tidak dapat langsung menyeting apakah sebuah routes menggunakan metode POST, GET. Namun kelebihannya terdapat pada parameter kedua yaitu kita bisa melakukan setting method seperti apa saja yang diizinkan. Didalamnya kita perlu perjelas apabila method get harus ke method apa, dan apabila post diarahkan ke method apa.
.
Oke sekarang kita coba aja dulu ya, yok coba yok dengan cara flask run seperti biasa dan coba akses url /users dengan method POST. Ohiya, harus dengan JSON Field ya, tidak bisa dengan Form Body Request alias Multipart/form-data.
Berikut merupakan hasil dari pengguna baru yang berhasil ditambahkan dengan password yang telah di hash.
Oke sekarang kita lanjut ke update. Silahkan buka kembali UserController.py dan tambahkan method dibawah ini:
def update(id):
try:
name = request.json['name']
email = request.json['email']
password = request.json['password']
user = Users.query.filter_by(id=id).first()
user.email = email
user.name = name
user.setPassword(password)
db.session.commit()
return response.ok('', 'Successfully update data!')
except Exception as e:
print(e)
Hampir mirip dengan konsep eloquent-nya Laravel, disini kita tinggal mencari by id dan tinggal memasang atribut yang akan diupdate, yang biasa pake Laravel pasti bakalan langsung “WAAAAAH MIRIP BANGET” Bedanya adalah kita tidak perlu melakukan hal seperti dibawah ini:
user.password = password
Mengapa? Karena kita telah memanggil method setPassword yang otomatis akan menandakan user.password dengan password yang akan kita hash.
def setPassword(self, password):
self.password = generate_password_hash(password)
LIhat? self.password = value menandakan dia lansgung melakukan set variabel yang telah ada dengan password baru kita.
Sebelum kita ubah routesnya kita tambahin dulu nih method untuk deletenya, yuk tambahin ini di UserController.py
def delete(id):
try:
user = Users.query.filter_by(id=id).first()
if not user:
return response.badRequest([], 'Empty....')
db.session.delete(user)
db.session.commit()
return response.ok('', 'Successfully delete data!')
except Exception as e:
print(e)
Method untuk delete hanya tinggal mengubahnya menjadi db.session.delete saja dan object user akan dimasukkan kedalam sana.
Nah sekarang buka kembali routes.py dan kita perlu modifikasi sedikit bagian routes /users/<id> dengan method seperti ini:
@app.route('/users/<id>', methods=['PUT', 'GET', 'DELETE'])
def usersDetail(id):
if request.method == 'GET':
return UserController.show(id)
elif request.method == 'PUT':
return UserController.update(id)
elif request.method == 'DELETE':
return UserController.delete(id)
PUT untuk update, dan DELETE untuk delete, sedangkan GET untuk show yang kita lakukan pada tutorial sebelumnya.
Sekarang markiba alias mari kota coba.
Saya coba update si ID 28 alias kiddy.keren@mail.com
Nah berubah kan jadi kiddy.kerenaja@mail.com dan tentunya passwordnya juga berubah. Sekarang kita hapus deh id 28.
Jelas sekali sudah hilang di database.
Sekarang apa jadinya kalo saya coba delete lagi? Kan id 28 udah dihapus?
Nah tenang, sudah kita cegah agar tidak error xixixi.
Oke untuk CUD segini dulu ya, mungkin sebagian masih bertanya gimana caranya untuk login. Akan saya lanjutkan pada tutorial berikutnya ya!