1. Home
  2. Docs
  3. Django Rest Framework
  4. Custom Permission

Custom Permission

কাস্টম অনুমতি ক্লাস

কখনও কখনও, অন্তর্নির্মিত অনুমতি ক্লাসগুলি আপনার প্রয়োজনীয়তাগুলি সম্পূর্ণরূপে পূরণ করতে পারে না। এই ধরনের ক্ষেত্রে, আপনি সাবক্লাসিং এবং এবং/অথবা পদ্ধতি BasePermissionপ্রয়োগ করে কাস্টম অনুমতি ক্লাস তৈরি করতে পারেন।has_permissionhas_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'),
]
Bash

urls.pyপ্রকল্পের প্রধান এই URL গুলি অন্তর্ভুক্ত করুন ।

ধাপ 8: পরীক্ষা করা

সার্ভার শুরু করুন:

python manage.py runserver
Bash

How can we help?