Mencoba Django Ninja

Mencoba Django Ninja

Jika kita berbicara "REST API" di Django maka hal paling populer digunakan adalah Django Rest Framework (DRF), DRF ini sepertinya sudah jadi standar penggunaan "REST API" di Django, bagaimana tidak penggunaan DRF ini sangat dekat sekali dengan penggunaan Django standar, jika di Django standar umumnya beberapa orang menggunakan metod seperti ini Views - Forms, ya dari Views tidak langsung ke Model tapi diarahkan dahulu ke Forms, di DRF fungsi Forms digantikan oleh Serializer.

Django Ninja

Setelah sekian lama menggunakan DRF beberapa hari lalu saya menemukan Django Ninja dan saya langsung tertarik, belum banyak fitur dari Django Ninja yang saya coba tapi dalam 1 jam mencoba saya kira untuk pet project saya secara bulat dan yakin untuk memilih Django Ninja dibanding DRF.

Setup

Bisa dibilang penggunaan DRF itu sudah sangat cocok dengan Django, cukup tambahkan di INSTALLED_APPS maka kita bisa menulis langsung DRF Views daftarkan di urls dan selesai. Django Ninja butuh step tambahan yang saat mengaturnya mengingatkan saya kepada setup blueprint ketika di flask dulu.
Begini saya setup Django Ninja

# file: api.py
from ninja import Router, Schema
from datetime import datetime

router = Router()


# Schema Api
class Error(Schema):
    message: str


class TodoIn(Schema):
    title: str


class TodoOut(Schema):
    title: str
    status: str
    created_time: datetime

Lalu di Views

from base.api import router, TodoIn, TodoOut, Error
from base.models import Todos

@router.post("/create-todo")
def create_todo(request, data: TodoIn):
    if len(data.title) <= 5:
        return 400, {"message": "Title minimal 5 character"}
    if len(data.title) >= 100:
        return 400, {"message": "Title maximal 100 character"}

    # Proses insert
    Todos.objects.create(title=data.title)
    return {"message": "success"}


@router.get("/get-task/{id}", response={200: TodoOut, 400: Error, 404: Error})
def get_detail_task(request, id: int):
    if id == 0:
        return 400, {"message": "input valid id"}

    try:
        return Todos.objects.get(id=id)
    except:  # noqa: E722
        return 404, {"message": "Not found"}

Fast API Dalam Ekosistem Django

Selain Django, web framework python kesukaan saya adalah FastApi, berkolaborasi dengan Pydantic yang melakukan type hint disaat runtime (seingat saya berjalan di runtime), iya saya mengerti dan tahu bagi beberapa orang type hint di python terasa useless tapi setelah mencoba bahasa lain yang lebih strict, mengetahui tipe data sebelum dan sesudah cukup membantu, setidaknya saat proses development.


Lalu apa kaitannya django ninja dengan fast api? Kesan saya dalam 1 jam mencoba bisa dibilang  bahwa django ninja berhasil membawa kemudahan menulis di fast api ke dalam ekosistem django yang sudah sangat powerfull dengan beragam fitur bawaanya.
Jadi saya bisa menulis senyaman di FastApi tapi gak perlu mikir fitur-fitur dasar yang sudah disediakan oleh django.

Pada awalnya saya adalah penyuka Class Based Views (CBV) terutama yang Generic Views (GV), soalnya dengan pendekatan GV saya bisa menulis kode sesedikit mungkin tapi bisa menghasilkan fitur yang sudah jadi, tapi semakin saya mencoba saya sekarang lebih menyukai pendekatan Function Based View (FBV), walaupun dengan FBV menulis lebih banyak kode tapi setidaknya saya lebih tenang karena mengurangi kejutan.

Saya sedang menulis tentang FBV vs CBV, setelah tulisannya rampung akan saya tautkan di sini.

Contoh saat menggunakan DRF saya cenderung menggunakan pendekatan seperti ini:

  • Serializer Menggunakan ModelSerializer
  • Views menggunakan Generic Views

Bandingkan dengan contoh kode django ninja di atas di mana saya perlu:

  • Definisikan schema input untuk menjadi "payload"
  • Definisikan schema output untuk menjadi "response"
  • Definisikan schema error untuk menjadi "response error"
  • Validasi di level  views dan input manual ke Model
Sejujurnya saya sekarang lebih suka menggunakan raw query dibanding ORM karena ORM suka banyak kejutan juga.

Tapi walaupun saya menulis banyak kode saya tahu setiap baris diperuntukan untuk apa, jika terjadi sesuatu yang salah saya bisa tahu dan tidak perlu buka banyak abstraksi.

DRF menyediakan juga decorator untuk penggunaan FBV, tapi saya menjadi bias karena pengalaman sekitar jarang banget menggunakan FBV di DRF, kebanyakan menggunakan GV dari DRF

Kesimpulan

Saya tahu 1 jam waktu yang terlalu singkat untuk membandingkan dengan DRF yang sudah saya pakai bertahun-tahun, ibaratnya saya masih dalam mode baru kenal sehingga kelebihannya banyak terlihat, sedangkan dengan dengan DRF udah jadi kawan dekat sehingga sedikit banyak tahu kekurangannya, tapi kembali ke pengalaman menggunakan django ninja bagi saya ini seperti menulis sesederhana di FastApi dengan utilitas django.

Referensi:

Show Comments