东莞建设网站推广公司地址,详情页设计的原则,做网站工作室找客户难,哈尔滨最新发布公告drf 对象级权限
Django REST Framework#xff08;DRF#xff09;提供了对象级别权限#xff08;Object-level permissions#xff09;来控制特定对象的访问权限。
简单来说#xff1a;通过视图类中的self.get_object(pk)得到一个obj对象(视图对象)#xff0c;在与requ…drf 对象级权限
Django REST FrameworkDRF提供了对象级别权限Object-level permissions来控制特定对象的访问权限。
简单来说通过视图类中的self.get_object(pk)得到一个obj对象(视图对象)在与request.user对象(请求对象)进行比较来判断该用户是否有权限。
def retrieve(self, request, pk):obj self.get_object(pk) #获取视图对象self.check_object_permissions(request, obj) #调用权限的has_object_permission方法来判断是否有权限用途因为要使用到self.get_object(pk)方法当然也可以重写一个该方法但该方法仅限于:获取单个对象(retrieve)删除单个对象(destroy)更新单个对象(update)
自动实现对象级权限
model.py
class User(model.Model):username models.CharField(用户名, max_length32)password models.CharField(密码, max_length32)email models.EmailField(邮箱, max_length32, blankTrue)phone models.CharField(手机号, max_length11, blankTrue)created models.DateTimeField(创建时间, auto_now_addTrue)updated models.DateTimeField(更新时间, auto_nowTrue)class getArticlePermissions(BasePermission):def has_object_permission(self, request, view, obj):try:return obj.user request.userexcept:return obj request.userclass UserView(GenericAPIView):queryset User.objects.all() #这里一定要用户模型serializer_class categoryModelSerializerpermission_classes [getArticlePermissions,]def get(self,request,pk):pass#说明因为GenericAPIView中有queryset方法而get_object(pk)方法有能得到一个对象就可以自动的调用self.check_object_permissions(request, obj)进而实现对象级权限但这种有很强的局限性
1. 视图要包含queryset属性
2. queryset 对象模型
3. 仅限于获取pk属性的方法一般是单个对象 (put,delete,get)
4. pk的值一定只能跟queryset有关pk是对象的id
自定义对象级权限
当调用.get_object()时由REST框架的通用视图运行对象级权限检测。如果你正在编写自己的视图并希望强制执行对象级权限检测或者你想在通用视图中重写get_object方法那么你需要在检索对象的时候显式调用视图上的.check_object_permissions(request, obj)方法。
class getArticlePermissions(BasePermission):def has_object_permission(self, request, view, obj):try:return obj.user request.userexcept:return obj request.userclass articleView(GenericViewSet, mixins.ListModelMixin, mixins.UpdateModelMixin, mixins.CreateModelMixin,mixins.DestroyModelMixin, mixins.RetrieveModelMixin):queryset Category.objects.all()serializer_class categoryModelSerializerpermission_classes [IsAuthenticated, getArticlePermissions]def retrieve(self, request, pkNone, *args, **kwargs):user request.user #获取请求对象print(user)if user: #判断请求对象是否有值try:obj Category.objects.filter(useruser, pkpk).first() #获取视图对象except:return Response({message: 失败}) self.check_object_permissions(request, obj) #调用权限的has_object_permission进行对象级权限校验serializer categoryModelSerializer(instanceobj) #序列化return Response(serializer.data)return Response({status_code: 500, message: 违法登录})注意
如果你的用户对象是自定义对象的话并且又创建了超级用户这样的话就有两个模型类
并且你配置了如下设置 DEFAULT_AUTHENTICATION_CLASSES: (...rest_framework.authentication.SessionAuthentication,rest_framework.authentication.BasicAuthentication...),则你在未登录的情况下request.user会是你的超级用户而不是匿名对象而造成的一切的因素是你配置了rest_framework.authentication.SessionAuthentication,只需要将它注释即可