RESt API dengan Django Rest Framework

Setahun yang lalu saya sempat menulis tentang Bermain API dengan Django-Tastypie dimana membahas sedikit bagaimana membuat RESt API di Django dengan Django-Tastypie.

Nah kali ini saya akan coba membahas sedikit bagaimana membuat API di Django dengan aplikasi yang berbeda yaitu Django Rest Framework.

Maksud postingan ini bukan untuk membuktikan aplikasi mana yang lebih baik, dari pengalaman saya memakai keduanya, keduanya memiliki kelebihan dan kekurangan tersendiri dan tentu saja itu tergantung anda mau memakai yang mana sesuai keperluan.

Untuk memperjelas bagaimana menggunakan Django Rest Framework ini, saya akan menggunakan contoh yang sama dengan yang saya pakai pada postingan Tastypie di atas. Dimana misalkan kita memiliki sebuah aplikasi micro blogging sejenis Twitter, dan kita ingin supaya feed/timeline terbaru dari aplikasi tersebut bisa tersedia secara publik melalui API.

Let’s coding

Pertama karena ini hanya pembuatan API kita tidak akan bahas bagaimana struktur feed/status aplikasi microblogging kita. Namun kira kira seperti ini model nya:

# Aplikasi Feeds
# file: models.py

class Feed(models.Model):
user = models.ForeignKey(User)
status = models.CharField(max_length=140)
created = models.DateTimeField(auto_now_add=True)

Selanjutnya kita install Django Rest Framework nya:

> pip install djangorestframework

Sekarang kita tambahkan rest_framework ke INSTALLED_APPS settings.py project kita.

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.admin',
    'feeds',
    'rest_framework', #Django Rest Framework

Nah semua sudah terinstall, saatnya membuat sumber data yang akan dikeluarkan oleh API kita.

Dalam API yang paling sederhana, di Django Rest Framework kita biasanya akan dihadapkan pada dua buah konsep yaitu: Serializer dan Viewsets.

Serializer : ini berfungsi untuk mengatur data-data apa saja (menambah/mengurangi) yang akan kita keluarkan melalui API, misalkan di model kita punya field user, status dan created. Kita bisa membuat output API ini hanya mengeluarkan user dan status saja jadi tanpa data created.

Atau di model kita punya tiga fields, melalui serializer kita bisa membuat supaya API memiliki output tambahan berupa user_avatar dengan menambahkan field baru lewat serializer.

Viewsets  : ini hampir mirip seperti konsep view yang biasa kita gunakan di Django terutama Class Based views, karena ini adalah sebuah view maka pada class ini juga kita mendeklarasikan query yang kita gunakan untuk mendapatkan data dari database dimana data ini yang nantinya di serialize dengan serializer yang sudah kita buat sebelumnya.

Oke, sekarang mari kita praktekkan konsep diatas.

Dalam project nyata biasanya saya membuat aplikasi terpisah bernama Api, dimana dalam aplikasi inilah saya khususkan untuk meng-handle semua bagian dari pembuatan API. Namun untuk penyederhaan, disini saya satukan dalam aplikasi yang sudah ada.

Membuat Serializer. Kita buat sebuah file bernama serializers.py di direktori aplikasi yang sedang kita kerjakan.

# File: serializers.py
# di dalam aplikasi feeds

from rest_framework import serializers
from feeds.models import Feed

class FeedSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Feed
        fields = ('url', 'user', 'status', 'created')

Pada kode diatas, saya membuat sebuah class FeedSerializer, dimana merupakan subclass dari HyperlinkedModelSerializer. Di Django Rest Framework terdapat beberapa jenis serializer misalnya ModelSerializer dan HyperlinkedModelSerializer.

Dengan menggunakan HyperlinkedModelSerializer, saya dapat mengeluarkan output tambahan yaitu url dimana merupakan lokasi titik API setiap object.

Membuat Viewsets.

Setelah serializer kita selesai sekarang saatnya kita buat view yang akan menghandle request terhadap API kita.

Buka file views.py pada aplikasi yang kita kerjakan:

# views.py
# di dalam aplikasi feeds

from feeds.serializers import FeedSerializer
from feeds.models import Feed

class FeedViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Feed.objects.all()
    serializer_class = FeedSerializer

Disini untuk membuat views, saya secara langsung menggunakan ReadOnlyModelViewSet karena saya ingin API ini sifatnya read-only.

Jadi pada class Viewset diatas, saya juga mendefinisikan queryset yang akan dipakai dan serializernya.

Sekali lagi terdapat beberapa jenis View dari Django Rest Framework yang bisa digunakan, silahkan langsung meluncur ke dokumentasinya untuk informasi lebih lengkap.

Menghubungkan dengan dunia luar.

Supaya API nya bisa diakses, pastinya kita memerlukan URL. Django Rest Framework menggenerate URL secara otomatis untuk kita, hanya perlu sedikit konfigurasi.

Untuk file urls.py yang mana yang akan anda gunakan itu terserah saja sebenarnya, bisa di file urls project atau pada level aplikasi.

Cuma karena kode API nya kita buat di level aplikasi, maka konfigurasi urls API ini juga saya buat di level aplikasi.

Pada file urls.py, kita buat seperti dibawah:

# urls.py
# di dalam aplikasi feeds

from django.conf.urls import patterns, url, include

from rest_framework import routers
from feeds import views

router = routers.DefaultRouter()
router.register(r'feeds', views.FeedViewSet)

urlpatterns = patterns('',
    #..... url lainnya disini...
    url(r'^api/', include(router.urls)),
)

Diatas saya membuat sebuah router, dimana fungsinya adalah untuk menggenerate URL secara otomatis untuk setiap Viewset.

Maka dengan format seperti itu, API feeds kita bisa akses melalui URL:

# List
http://mydomain.com/api/feeds/

# Detail
http://mydomain.com/api/feeds/1/

Cukup mudah 🙂 Sebenarnya topik Django Rest Framework ini sangat luas, yang saya bahas sedikit disini hanya baru permukaannya saja. Selebihnya silahkan langsung baca-baca di dokumentasinya ya.

Semoga bisa menjadi referensi buat anda yang ingin membuat API dengan Django.

One Reply to “RESt API dengan Django Rest Framework”

Leave a Reply

Your email address will not be published. Required fields are marked *