在 Django REST Framework (DRF) 中,权限(permissions)机制用于控制哪些用户能够访问哪些视图或视图集中的特定操作。结合 ViewSet
使用权限,可以更灵活地管理 API 的访问控制。
配置全局权限
可以在项目的设置文件 settings.py
中配置全局权限。
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ],}
这样,所有的视图和视图集都将默认使用 IsAuthenticated
权限类,即只有经过身份验证的用户才能访问。
在视图集中配置权限
你在视图集中配置特定的权限类,覆盖全局设置。通过设置 permission_classes
属性来指定该视图集使用的权限类。
from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated, IsAdminUser
from .models import BookModel from .serializers
import BookModelSerializer
class BookModelViewSet(viewsets.ModelViewSet): queryset = BookModel.objects.all() serializer_class = BookModelSerializer permission_classes = [IsAuthenticated]
配置不同动作的权限
可能需要为视图集中的不同动作配置不同的权限。这时可以重写 get_permissions()
方法。
from rest_framework
import viewsets
from rest_framework.permissions
import IsAuthenticated, IsAdminUser
from .models import BookModel
from .serializers import BookModelSerializer
class BookModelViewSet(viewsets.ModelViewSet): queryset = BookModel.objects.all() serializer_class = BookModelSerializer
def get_permissions(self): if self.action == 'list': permission_classes = [IsAuthenticated] elif self.action == 'create': permission_classes = [IsAdminUser] else: permission_classes = [IsAuthenticated] return [permission() for permission in permission_classes]
自定义权限类
可能需要更复杂的权限控制逻辑。可以通过继承 BasePermission
类来自定义权限类。
from rest_framework.permissions
import BasePermission
class IsOwnerOrReadOnly(BasePermission): """ 自定义权限类,只有对象的所有者才能编辑,否则只读 """ def has_object_permission(self, request, view, obj): # 读取权限允许任何请求,所以总是允许 GET、HEAD 或 OPTIONS 请求 if request.method in SAFE_METHODS: return True # 写入权限只允许对象的所有者 return obj.owner == request.user
然后在视图集中使用自定义权限类:
from rest_framework
import viewsets
from .models import BookModel
from .serializers import BookModelSerializer
from .permissions import IsOwnerOrReadOnly
class BookModelViewSet(viewsets.ModelViewSet): queryset = BookModel.objects.all() serializer_class = BookModelSerializer permission_classes = [IsOwnerOrReadOnly]
示例代码
from rest_framework import viewsets
from rest_framework.permissions
import IsAuthenticated, IsAdminUser
from .models import BookModel
from .serializers import BookModelSerializer
from .permissions import IsOwnerOrReadOnly
class BookModelViewSet(viewsets.ModelViewSet): queryset = BookModel.objects.all() serializer_class = BookModelSerializer def get_permissions(self): if self.action == 'list': permission_classes = [IsAuthenticated] elif self.action == 'create': permission_classes = [IsAdminUser] else: permission_classes = [IsOwnerOrReadOnly] return [permission() for permission in permission_classes]