Django Rest Framework CRUD API
- Django Installation
pip install Django==3.2.7- Django Rest Framework Installation
pip install djangorestframework- Start Django Project
django-admin startproject CRUDAPIcd CRUDAPIpython manage.py startapp todoList- Registet TodoList app
INSTALLED_APPS = [
'todoList.apps.TodolistConfig',
]- Register Django Rest Framework
INSTALLED_APPS = [
'rest_framework',
]- Models
python manage.py migrate- Start out application
python manage.py runserver- Create superuser
python manage.py createsuperuser- Run application again
python manage.py runserver- Include URL for our app
urlpatterns = [
path('admin/', admin.site.urls),
path("", include("todoList.urls"))
]- Update the url file
from django.urls import path
from .views import index
urlpatterns = [
path("", index, name = "index")
]- User registration Serializer
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', 'password', 'email')
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
password = validated_data.pop('password')
user = User(**validated_data)
user.set_password(password)
user.save()
return userin views.py add the following
from .serializers import UserSerializer
from rest_framework import generics
from django.contrib.auth.models import User
from rest_framework.permissions import AllowAny
class UserCreate(generics.CreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = (AllowAny, )- Simple JWT login
pip install djangorestframework-simplejwtREST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
)
}INSTALLED_APPS = [
'rest_framework_simplejwt',
]from datetime import timedelta
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=10),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS': False,
'BLACKLIST_AFTER_ROTATION': False,
'UPDATE_LAST_LOGIN': False,
'ALGORITHM': 'HS256',
'SIGNING_KEY': SECRET_KEY,
'VERIFYING_KEY': None,
'AUDIENCE': None,
'ISSUER': None,
'JWK_URL': None,
'LEEWAY': 0,
'AUTH_HEADER_TYPES': ('Bearer',),
'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
'USER_ID_FIELD': 'id',
'USER_ID_CLAIM': 'user_id',
'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'token_type',
'JTI_CLAIM': 'jti',
'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES' : ('rest_framework.permissions.IsAuthenticated',)
,
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework_simplejwt.authentication.JWTAuthentication',
)
}- Model Creation
class Todo(models.Model):
name = models.CharField(max_length=100, null=False)
description = models.TextField(max_length=400, null=False)
completed = models.BooleanField(default=False)
date = models.DateTimeField(default=datetime.utcnow)
def __str__(self) -> str:
return self.name- Model Serialization
class TodoSerializer(serializers.ModelSerializer):
class Meta:
model = Todo
fields = "__all__"- Final
url.pyfile from CRUDAPI app
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('', include("todoList.urls")),
path('admin/', admin.site.urls),
path('api-auth/', include("rest_framework.urls")),
]- Final
url.pyfrom todoList app
from django.urls import path
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)
from .views import UserCreate, TodosListCreateView, TodosRetrieveUpdateDestroyAPIView
urlpatterns = [
path("registration/", UserCreate.as_view()),
path('', TodosListCreateView.as_view()),
path('todos/<int:pk>/', TodosRetrieveUpdateDestroyAPIView.as_view()),
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]- Final file from
views.pyfrom todoList
from .serializers import UserSerializer
from rest_framework import generics
from django.contrib.auth.models import User
from rest_framework.permissions import AllowAny, IsAuthenticatedOrReadOnly
from .models import Todo
from .serializers import TodoSerializer
class UserCreate(generics.CreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = (AllowAny,)
class TodosListCreateView(generics.ListCreateAPIView):
queryset = Todo.objects.all()
serializer_class = TodoSerializer
permission_classes = (IsAuthenticatedOrReadOnly, )
class TodosRetrieveUpdateDestroyAPIView(generics.RetrieveUpdateDestroyAPIView):
queryset = Todo.objects.all()
serializer_class = TodoSerializer
permission_classes = (IsAuthenticatedOrReadOnly, )