কাস্টম অনুমতি ক্লাস
কখনও কখনও, অন্তর্নির্মিত অনুমতি ক্লাসগুলি আপনার প্রয়োজনীয়তাগুলি সম্পূর্ণরূপে পূরণ করতে পারে না। এই ধরনের ক্ষেত্রে, আপনি সাবক্লাসিং এবং এবং/অথবা পদ্ধতি BasePermission
প্রয়োগ করে কাস্টম অনুমতি ক্লাস তৈরি করতে পারেন।has_permission
has_object_permission
টিউটোরিয়াল: কাস্টম অনুমতি সহ একটি সাধারণ প্রকল্প তৈরি করা
আসুন “টাস্ক ম্যানেজমেন্ট” নামে একটি সাধারণ প্রকল্প তৈরি করি যেখানে ব্যবহারকারীরা কাজগুলি পরিচালনা করতে পারে। আমরা ব্যবহারকারীর ভূমিকার উপর ভিত্তি করে নির্দিষ্ট শেষ পয়েন্টে অ্যাক্সেস সীমাবদ্ধ করতে কাস্টম অনুমতি প্রয়োগ করব।
ধাপ 1: সেটআপ
একটি নতুন জ্যাঙ্গো প্রকল্প এবং অ্যাপ তৈরি করুন:
django-admin startproject task_manager_project
cd task_manager_project
django-admin startapp tasks
Bashজ্যাঙ্গো REST ফ্রেমওয়ার্ক ইনস্টল করুন:
pip install djangorestframework
Bashধাপ 2: মডেল সংজ্ঞায়িত করুন
কাজের জন্য মডেল সংজ্ঞায়িত করুন tasks/models.py
:
from django.db import models
from django.contrib.auth.models import User
class Task(models.Model):
title = models.CharField(max_length=200)
description = models.TextField()
assigned_to = models.ForeignKey(User, on_delete=models.CASCADE)
completed = models.BooleanField(default=False)
Bashধাপ 3: সিরিয়ালাইজার
Task
মডেলের জন্য সিরিয়ালাইজার তৈরি করুন tasks/serializers.py
:
from rest_framework import serializers
from .models import Task
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = ['id', 'title', 'description', 'assigned_to', 'completed']
Bashধাপ 4: ভিউ
কাজের জন্য API ভিউ তৈরি করুন tasks/views.py
from rest_framework import generics
from rest_framework.permissions import IsAuthenticated
from .models import Task
from .serializers import TaskSerializer
class TaskListCreateAPIView(generics.ListCreateAPIView):
queryset = Task.objects.all()
serializer_class = TaskSerializer
permission_classes = [IsAuthenticated]
class TaskRetrieveUpdateDestroyAPIView(generics.RetrieveUpdateDestroyAPIView):
queryset = Task.objects.all()
serializer_class = TaskSerializer
permission_classes = [IsAuthenticated]
Bashএই উদাহরণে, IsAuthenticated
টাস্ক এন্ডপয়েন্ট অ্যাক্সেস করার জন্য ব্যবহারকারীদের প্রমাণীকরণের প্রয়োজন করার জন্য আমরা অনুমতি শ্রেণী ব্যবহার করছি।
ধাপ 5: কাস্টম অনুমতি
ব্যবহারকারীর ভূমিকার উপর ভিত্তি করে নির্দিষ্ট শেষ পয়েন্টগুলিতে অ্যাক্সেস সীমাবদ্ধ করতে একটি কাস্টম অনুমতি শ্রেণী তৈরি করা যাক। ভিতরে tasks/permissions.py
:
from rest_framework import permissions
class HasDynamicModelPermission(permissions.BasePermission):
"""
Custom permission to only allow users with the appropriate permissions based on the model.
"""
def has_permission(self, request, view):
# Determine the model name dynamically from the viewset.
model_name = view.queryset.model._meta.model_name
# Map HTTP methods to permission types.
if request.method in permissions.SAFE_METHODS:
perm_action = 'view'
elif request.method == 'POST':
perm_action = 'add'
elif request.method in ['PUT', 'PATCH']:
perm_action = 'change'
elif request.method == 'DELETE':
perm_action = 'delete'
else:
return False
# Check if the user has the required permission.
required_permission = f'tasks.{perm_action}_{model_name}'
return request.user.has_perm(required_permission)
def has_object_permission(self, request, view, obj):
# This part is similar to has_permission but checks permissions on an object level.
model_name = obj._meta.model_name
if request.method in permissions.SAFE_METHODS:
perm_action = 'view'
elif request.method in ['PUT', 'PATCH']:
perm_action = 'change'
elif request.method == 'DELETE':
perm_action = 'delete'
else:
return False
required_permission = f'tasks.{perm_action}_{model_name}'
return request.user.has_perm(required_permission, obj)
Bashধাপ 6: কাস্টম অনুমতি প্রয়োগ করুন
নির্দিষ্ট শেষ পয়েন্টে কাস্টম অনুমতি শ্রেণী প্রয়োগ করুন। হালনাগাদ tasks/views.py
:
from .permissions import IsTaskOwnerOrAdmin
class TaskRetrieveUpdateDestroyAPIView(generics.RetrieveUpdateDestroyAPIView):
queryset = Task.objects.all()
serializer_class = TaskSerializer
permission_classes = [IsTaskOwnerOrAdmin]
Bashএখন, শুধুমাত্র টাস্ক মালিক বা প্রশাসক ব্যবহারকারীরা কাজগুলি পুনরুদ্ধার, আপডেট বা মুছে ফেলার অনুমতি পাবেন।
ধাপ 7: ইউআরএল কনফিগারেশন
API ভিউগুলির জন্য URL গুলি সংজ্ঞায়িত করুন৷ ভিতরে tasks/urls.py
:
from django.urls import path
from .views import TaskListCreateAPIView, TaskRetrieveUpdateDestroyAPIView
urlpatterns = [
path('tasks/', TaskListCreateAPIView.as_view(), name='task-list-create'),
path('tasks/<int:pk>/', TaskRetrieveUpdateDestroyAPIView.as_view(), name='task-retrieve-update-destroy'),
]
Bashurls.py
প্রকল্পের প্রধান এই URL গুলি অন্তর্ভুক্ত করুন ।
ধাপ 8: পরীক্ষা করা
সার্ভার শুরু করুন:
python manage.py runserver
Bash