当前位置: 首页> 文旅> 旅游 > Django REST Framework(十一)视图集-ViewSet权限验证

Django REST Framework(十一)视图集-ViewSet权限验证

时间:2025/8/23 7:37:57来源:https://blog.csdn.net/yjjpp2301/article/details/140457032 浏览次数:0次

在 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]

关键字:Django REST Framework(十一)视图集-ViewSet权限验证

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: