Membuat REST API Sederhana Menggunakan Python Django
12 November 2024·Maulana Ahsan·4 min read
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 inisource 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.
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!