Home » Coding » Membuat REST API Sederhana Menggunakan Python Django

Membuat REST API Sederhana Menggunakan Python Django


12 November 2024·Maulana Ahsan·4 min read


Karena gw baru aja belajar python dan berusaha membuat REST API menggunakan Django, jadi gw menulis artikel ini agar ada dokumentasi apa yang pertama gw bikin...

Karena gw sedang ada waktu luang di kantor, jadi gw isi dengan belajar bahasa pemrograman yang baru, pilihan nya ada dua Golang atau Python, awalnya gw mencoba belajar Golang, tapi ternyata cukup jauh berbeda dibandingkan dengan javascript.

Golang terlalu banyak hal yang strict, jadi gw putuskan untuk belajar python.

Gw ingin membuat REST API, sambil bikin CRUD sambil memahami bagaimana cara kerjanya, gw bertanya ke temen yang lebih paham tentang python, ada 3 opsi framework. Flask, Fast API atau Django.

Akhirnya gw pilih pake django, karena emang dia framework yang cukup populer.

Tapi... Disini gw gak akan menjelaskan tentang kode nya, cuma step by step cara membuatnya dan kode nya saja.

Membuat REST API Sederhana Menggunakan Python Django

Hal pertama yang harus disiapin tentu saja install python, dan juga pip (Package Installer for python).

Cara install nya mungkin bisa gw bahas di lain kesempatan.

Persiapan

  • Buat folder project nya, misalnya kali ini gw bikin rest-api-todo.
  • Lalu jalankan perintah ini via terminal untuk membuat virtual evirontment. python -m venv venv
  • Untuk pengguna Windows jalankan ini venv\Scripts\activate dan untuk pengguna macOS/Linux jalankan ini source venv/bin/activate perintah ini digunakan untuk mengaktifkan virtual evirontment.
  • Setelah venv aktif, install pip install django djangorestframework mysqlclient djangorestframework-simplejwt.
  • Buat file requirements.txt untuk menyimpan dependencies yang dibutuhkan.
  • Jalankan pip freeze > requirements.txt untuk memasukkan data dependencies nya.
  • Suatu saat jika dibutuhkan, bisa jalankan ini pip install -r requirements.txt.

Buat Project Django

  • Lanjuuuut, jalankan django-admin startproject todo_project.
  • Masuk ke folder cd todo_project.
  • Jalankan python manage.py startapp todo.

Setting Database

  • Edit settings.py untuk menggunakan database MySQL:
      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',
              'NAME': 'todo_db',
              'USER': 'root',
              'PASSWORD': '',
              'HOST': 'localhost',
              'PORT': '3306',
          }
      }
    
  • Buat database todo_db di MySQL jika belum ada:
      CREATE DATABASE todo_db;
    

Buat Model untuk User dan Todo

  • Edit file models.py di dalam aplikasi todo untuk mendefinisikan model User dan Todo.
  • Models (todo/models.py).
      from django.db import models
      from django.contrib.auth.models import AbstractUser
    
      # Custom User model
      class User(AbstractUser):
          pass  # Anda bisa menambahkan atribut lain sesuai kebutuhan, seperti profil, dll.
    
      # Todo model
      class Todo(models.Model):
          title = models.CharField(max_length=255)
          description = models.TextField()
          created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="todos")
          created_at = models.DateTimeField(auto_now_add=True)
          
          def __str__(self):
              return self.title

  • Jalankan python manage.py makemigrations todo untuk generate migrations.
  • Lalu jalankan python manage.py migrate untuk migrate ke database.

Setup Authentication dan Token

  • Edit settings.py untuk menambahkan pengaturan untuk JWT Token dan custom user model:
      INSTALLED_APPS = [
          # Apps lainnya
          'rest_framework',
          'rest_framework.authtoken',
          'todo',
      ]
    
  • Tambahkan pengaturan JWT di bawah REST_FRAMEWORK:
      REST_FRAMEWORK = {
          'DEFAULT_AUTHENTICATION_CLASSES': [
              'rest_framework_simplejwt.authentication.JWTAuthentication',
          ],

}

  • Tentukan model user yang digunakan:
      AUTH_USER_MODEL = 'todo.User'
    
  • Buat serialisasi model User dan Todo:
  • Buat file baru todo/serializers.py:
      from rest_framework import serializers
      from .models import User, Todo
      from django.contrib.auth.hashers import make_password
    
      class UserSerializer(serializers.ModelSerializer):
          class Meta:
              model = User
              fields = ['id', 'username', 'password']
    
          def create(self, validated_data):
              password = validated_data.pop('password')
              user = User.objects.create(**validated_data)
              user.password = make_password(password)
              user.save()
              return user
    
      class TodoSerializer(serializers.ModelSerializer):
          class Meta:
              model = Todo
              fields = ['id', 'title', 'description', 'is_completed', 'created_by', 'created_at']
              read_only_fields = ['created_by', 'created_at']

}

  • Buat file baru todo/views.py:
      from rest_framework import status, permissions, generics
      from rest_framework.response import Response
      from rest_framework_simplejwt.tokens import RefreshToken
      from .models import Todo, User
      from .serializers import UserSerializer, TodoSerializer
      from rest_framework.permissions import IsAuthenticated
    
      # Register User
      class RegisterView(generics.CreateAPIView):
          serializer_class = UserSerializer
    
      # Login and generate token
      class LoginView(generics.GenericAPIView):
          serializer_class = UserSerializer
    
          def post(self, request, *args, **kwargs):
              username = request.data.get('username')
              password = request.data.get('password')
              user = User.objects.filter(username=username).first()
    
              if user and user.check_password(password):
                  refresh = RefreshToken.for_user(user)
                  return Response({
                      'refresh': str(refresh),
                      'access': str(refresh.access_token)
                  })
              return Response({'error': 'Invalid credentials'}, status=status.HTTP_400_BAD_REQUEST)
    
      # Todo Views
      class TodoListView(generics.ListCreateAPIView):
          serializer_class = TodoSerializer
          permission_classes = [IsAuthenticated]
    
          def get_queryset(self):
              return Todo.objects.filter(created_by=self.request.user)
    
          def perform_create(self, serializer):
              serializer.save(created_by=self.request.user)
    
      class TodoDetailView(generics.RetrieveUpdateDestroyAPIView):
          queryset = Todo.objects.all()
          serializer_class = TodoSerializer
          permission_classes = [IsAuthenticated]
    
          def get_queryset(self):
              return Todo.objects.filter(created_by=self.request.user)

  • Buat file baru todo/urls.py:
      from django.urls import path
      from . import views
    
      urlpatterns = [
          path('register/', views.RegisterView.as_view(), name='register'),
          path('login/', views.LoginView.as_view(), name='login'),
          path('todos/', views.TodoListView.as_view(), name='todo-list'),
          path('todos/<'int:pk>/', views.TodoDetailView.as_view(), name='todo-detail'), #hapus ' di pk
      ]

  • Di dalam todo_project/urls.py, tambahkan:
      from django.contrib import admin
      from django.urls import path, include
    
      urlpatterns = [
          path('admin/', admin.site.urls),
          path('api/', include('todo.urls')),
      ]

  • Jalankan server di terminal dengan perintah python manage.py runserver.

Penutup

Udah gitu aja, rest api nya sudah bisa jalan menggunakan ini.

Test API menggunakan Postman atau alat lain:

  • Register di /api/register/
  • Login di /api/login/ (untuk mendapatkan token)
  • GET /api/todos/ untuk melihat todos milik user yang login
  • POST /api/todos/ untuk membuat todo baru
  • PUT/PATCH/DELETE /api/todos/<'id>/ untuk mengedit atau menghapus todo tertentu

Banyak hal yang bisa disederhanakan mungkin, baru sadar pas di akhir. Tapi yaudah lah.

Kategori:Coding
Maulana Ahsan Profile

Maulana Ahsan

Seorang pekerja kantoran yang menyukai anime, manga dan budaya Jepang.
Pemilik akun social media @kejepangan.


Suka dengan tulisan di Blog Tulisan Ahsan? Lu bisa memberikan dukungan dengan berdonasi atau bagikan konten ini di sosial media. Terima kasih atas dukungan kamu!