Module Beginner 5 Desember 2019

Tutorial RESTful API dengan Flask Python Part 3— Read

Membuat RESTful API dengan Micro Framework Python, Flask Part 3 — Read

Tutorial RESTful API dengan Flask Python Part 3— Read

Membuat RESTful API dengan Micro Framework Python, Flask Part 3 — Read

Image 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.

Image 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 dbfrom datetime import datetimeclass 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 dbfrom datetime import datetimefrom app.model.user import Usersclass 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.

Image

Sekarang pada UserController.py, masukkan code berikut:

from app.model.user import Usersfrom app import response, appdef 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 arrayEits, 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_responsedef ok(values, message): res = { ‘values’: values, ‘message’: message } return make_response(jsonify(res)), 200def 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 appfrom 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 Flaskfrom config import Configfrom flask_sqlalchemy import SQLAlchemyfrom flask_migrate import Migrateapp = Flask(name)app.config.from_object(Config)db = SQLAlchemy(app)migrate = Migrate(app, db)from app.model import todo, userfrom app import routes

Sekarang kita coba jalanin. Coba flask run seperti biasa dan coba akses melalui Postman/Insomnia milik kalian.

Image

Hmm datanya belom ada nih, kita seeding dulu yuk. Install Flask seeder dibawah ini.

pip install Flask-SeederKalo udah ubah dulu file init.py didalam app jadi seperti ini:

from flask import Flaskfrom config import Configfrom flask_sqlalchemy import SQLAlchemyfrom flask_migrate import Migratefrom flask_seeder import FlaskSeederapp = 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, userfrom app import routesLalu buat folder seeds pada root folder.

Image Jangan lupa juga buat user.py didalam seeds lalu masukkan code dibawah:

from app.model.user import Usersimport random, stringfrom flask_seeder import Seeder, Faker, generator# SQLAlchemy database modelclass 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 Seederclass 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 runSekarang di database kita sudah memiliki dua data.

Image Sekarang jalankan kembali dengan flask run dan coba akses lagi routesnya.

Image 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 dataOhiya, 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 arrayMenulis 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/‘)def usersDetail(id): print(id) return UserController.show(id)

Lesgooo kita coba, jalanin flask run dan kita cek sesuai data kita.

Image Mantep kan?

Sekarang kita coba kalo ngga ketemu idnya.

Image 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!


Artikel ini merupakan konten legacy dari blog Medium (Tahun 2019). Beberapa konsep atau sintaks mungkin sudah mengalami perubahan pada versi terbaru.