Tutorial RESTful API dengan Flask Python Part 3— Read
Membuat RESTful API dengan Micro Framework Python, Flask Part 3 — Read
Halo semua, masih dengan Kiddy yang (masih) semangat ngoding, mumpung moodnya lagi dapet nih jadi bertubi-tubi langsung ditulis tutorialnya hahaha. As a developer, kita sama-sama tau lah kalo mood kita sedang buruk jangankan ngoding, nulis hello world aja ogah, tapi karena tuntutan kerjaan ya kita jadi terpaksa ngerjain deh, professional itu penting cuy hehehe.
Oke setelah kita ngebahas cara instalasi dan konek ke database pada tutorial Flask sebelumnya, sekarang kita akan langsung masuk ke intinya, yaitu Read. CUD (Create, Update, Delete) menyusul yaaa.
Apakah tutorial ini akan berhenti sampai sini aja? Eit’s santuy, masih ada kok tutorial Flask lainnya yang akan saya tulis, tapi satu persatu ya gengs.
Sekarang kita akan ngebuat struktur MVCnya, cuma V-nya alias View ngga kepake karena kita kan RESTful API hehehe.
Oke sekarang kita ubah sedikit dulu struktur folder app kita, kemaren kan kita ngebuat file models.py yang berisi dua class, sekarang kita pisah berdasarkan kegunaan mereka sing-masing.
Silahkan buat folder controller dan model, lalu didalam folder model jangan lupa buat juga __init__.py karena file ini wajib ada dalam tiap folder, karena ibarat file untuk mendeteksi namespace kalo di Laravel mah.
NB: __init__.py didalam folder controller kosongkan saja isinya (cuma buat filenya aja), hanya __init__.py di root folder app yang ada isinya.
Oke sekarang ubah isi user.py di model menjadi seperti ini:
from app import db
from datetime import datetime
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)
dan untuk todo.py menjadi seperti ini:
from app import db
from datetime import datetime
from app.model.user import Users
class Todo(db.Model):
id = db.Column(db.BigInteger, primary_key=True, autoincrement=True)
todo = db.Column(db.String(140), nullable=False)
description = db.Column(db.Text, nullable=True)
created_at = db.Column(db.DateTime, index=True, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, index=True, default=datetime.utcnow)
user_id = db.Column(db.BigInteger, db.ForeignKey(Users.id))
def __repr__(self):
return '<Todo {}>'.format(self.todo)
Sekarang kita masuk ke controller, buat file UserController.py dan seperti biasa jangan lupa ya untuk membuat __init__.py didalam folder controller.
Sekarang pada UserController.py, masukkan code berikut:
from app.model.user import Users
from app import response, app
def index():
try:
users = Users.query.all()
data = transform(users)
return response.ok(data, "")
except Exception as e:
print(e)
def transform(users):
array = []
for i in users:
array.append({
'id': i.id,
'name': i.name,
'email': i.email
})
return array
Eits, tunggu jangan dijalanin dulu dong. Kita masih harus buat response.py dulu, buat response.py didalam folder app. Seperti biasa, kita akan membuat satu file standarisasi dari response json kita sehingga kita juga tidak perlu menulis hal yang sama pada tiap controller.
Buat isi file response.py seperti gambar dibawah ini.
from flask import jsonify, make_response
def ok(values, message):
res = {
'values': values,
'message': message
}
return make_response(jsonify(res)), 200
def badRequest(values, message):
res = {
'values': values,
'message': message
}
return make_response(jsonify(res)), 400
Sekarang kita benerin file routes.py kita yang kemarin, buat jadi seperti ini:
from app import app
from app.controller import UserController
@app.route('/users')
def users():
return UserController.index()
Nah udah selesai nih, tapi masih belum bisa dijalanin karena file __init__.py kita didalam app perlu diperbaiki, kenapa? Tentu aja karena ada struktur yang berubah yaitu pada bagian models, yuk kita ubah jadi gini:
from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
from app.model import todo, user
from app import routes
Sekarang kita coba jalanin. Coba flask run seperti biasa dan coba akses melalui Postman/Insomnia milik kalian.
Hmm datanya belom ada nih, kita seeding dulu yuk. Install Flask seeder dibawah ini.
pip install Flask-Seeder
Kalo udah ubah dulu file __init__.py didalam app jadi seperti ini:
from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_seeder import FlaskSeeder
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
seeder = FlaskSeeder()
seeder.init_app(app, db)
from app.model import todo, user
from app import routes
Lalu buat folder seeds pada root folder.
Jangan lupa juga buat user.py didalam seeds lalu masukkan code dibawah:
from app.model.user import Users
import random, string
from flask_seeder import Seeder, Faker, generator
# SQLAlchemy database model
class User(Users):
def __init__(self, name=None, email=None, password=None):
self.name = name
self.email = email
self.password = password
def __str__(self):
return "Name=%s, Email=%s, Password=%s" % (self.name, self.email, self.password)
# All seeders inherit from Seeder
class UserSeeder(Seeder):
# run() will be called by Flask-Seeder
def run(self):
# Create a new Faker and tell it how to create User objects
name = generator.Name()
faker = Faker(
cls=User,
init={
"name": name,
"email": ''.join(random.choice(string.ascii_letters) for i in range(10)) + "@mail.com",
"password": "secret"
}
)
# Create 1 user
for user in faker.create(1):
print("Adding user: %s" % user)
self.db.session.add(user)
Untuk saat ini saya belum menemukan cara membuat seeder secara bersamaan (lebih dari satu), jadi untuk sementara kita harus membuatnya satu-persatu, huft menyebalkan. Selain itu library faker ini bukan resmi dari Python Flask, melainkan buatan seseorang, jadi tentu saja tidak maksimal. Tapi ngga apa, yang penting kita bisa belajar dulu.
Jalankan command dibawah untuk membuat satu user, jalankan 2–3 kali agar kita mendapatkan lebih dari satu user.
flask seed run
Sekarang di database kita sudah memiliki dua data.
Sekarang jalankan kembali dengan flask run dan coba akses lagi routesnya.
Perfecto!
Sekarang kita akan mencoba membaca satu id saja.
Pertama kita tambahkan dulu method show pada UserController.py
def show(id):
try:
users = Users.query.filter_by(id=id).first()
if not users:
return response.badRequest([], 'Empty....')
data = singleTransform(users)
return response.ok(data, "")
except Exception as e:
print(e)
Jangan lupa untuk menambahkan method singleTransformer, kalau tadi kita membuat mendapatkan multiple object yang harus dimasukkan kedalam array, sekarang kita hanya membutuhkan single object yang langsung direturn hasilnya didalam array/tuples.
def singleTransform(users):
data = {
'id': users.id,
'name': users.name,
'email': users.email
}
return data
Ohiya, daripada method transform milikmu menulis kembali data yang kita butuhkan lebih baik diganti menjadi seperti ini:
def transform(users):
array = []
for i in users:
array.append(singleTransform(i))
return array
Menulis id, name, email dalam satu fungsi lebih baik daripada harus menulisnya dua kali!
Sekarang kita pindah ke routes.py. Tambahkan method ini:
@app.route('/users/<id>')
def usersDetail(id):
print(id)
return UserController.show(id)
Lesgooo kita coba, jalanin flask run dan kita cek sesuai data kita.
Mantep kan?
Sekarang kita coba kalo ngga ketemu idnya.
Mantep juga tjuy.
Oke untuk sekarang cukup sampai sini dulu ya, nanti saya lanjut CUDnya. Saya mau rebahan dulu, karena dari awal buat laporan PKL belom sempet rebahan wkwkwkwk.
Sampai berjumpa lagi dan happy coding!