REST-Framework: 权限组件

目录

一 权限简介

二 局部使用

三 全局使用

四 源码分析


一 权限简介

只用超级用户才能访问指定的数据,普通用户不能访问,有了这种类似的需求就要有权限组件对其限制, 权限组件就这样产生了

权限组件的使用和认证组件的使用很类似, 不管是全局使用,还是局部使用都可以参考认证组件的使用, 在需要注意的地方和不同之处我会特别指出

二 局部使用

from rest_framework.permissions import BasePermission

class UserPermission(BasePermission):

# 这里的message是权限不足时的打印信息

message = '不是超级用户,查看不了'

def has_permission(self, request, view):

# user_type = request.user.get_user_type_display()

# if user_type == '超级用户':

user_type = request.user.user_type

print(user_type)

if user_type == 1:

return True

else:

return False

class Course(APIView):

authentication_classes = [TokenAuth, ]

permission_classes = [UserPermission,]



def get(self, request):

return HttpResponse('get')



def post(self, request):

return HttpResponse('post')

 

局部使用只需要在视图类里加入:

permission_classes = [UserPermission,]

三 全局使用

REST_FRAMEWORK={

"DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",]

}

 自定义权限功能(重点)

1 登录成功以后,超级用户可以干某些事,普通用户不能干---》超级用户可以查看某些接口,普通用户不能查看


2 使用写一个类继承BasePermission,重写has_permission
    class SuperPermission(BasePermission):
        def has_permission(self, request, view):
            # Return `True` if permission is granted, `False` otherwise.
            # 超级用户可以访问,除了超级用户以外,都不能访问
            if request.user.user_type == '1':
                return True
            else:
                return False
            
3 局部使用和全局使用
    -在想局部使用的视图类上
    permission_classes = [MyAuthen.SuperPermission]
    -全局使用
      REST_FRAMEWORK = {
        "DEFAULT_PERMISSION_CLASSES": ["app01.MyAuthen.SuperPermission", ]
        }
     -局部禁用
    permission_classes = []
View Code

 

四 源码分析

def check_permissions(self, request):

for permission in self.get_permissions():

if not permission.has_permission(request, self):

self.permission_denied(

request, message=getattr(permission, 'message', None)

)

 

self.get_permissions()

def get_permissions(self):

return [permission() for permission in self.permission_classes]

权限类使用顺序:先用视图类中的权限类,再用settings里配置的权限类,最后用默认的权限类

权限源码分析

8 源码分析
    -APIView的dispatch---》APIView的initial---》APIView的check_permissions(request)
        for permission in self.get_permissions(): # 权限类对象放到列表中
        if not permission.has_permission(request, self):
            self.permission_denied(
                 request,
                 message=getattr(permission, 'message', None),
                 code=getattr(permission, 'code', None)
                )
9 错误信息的中文显示
    在权限类中加一个 message=字符串
View Code

模型层choice字段的使用(重点)

1 模型表:Student表,写接口应该选择继承哪个视图类
2 推荐使用自动生成路由的方式(继承ViewSetMixin及它的字类)
3 但是目前来说,你先实现功能即可(至于选择哪个,慢慢体会)

4 choice的使用
    -在模型类中使用
    sex = models.SmallIntegerField(choices=((1, ''), (2, ''), (3, '未知')), default=1)
    -在视图类中,在序列化类中
        -get_字段名_dispaly()的方法,该方法获得choice字段对应的数据
View Code

 

posted @ 2020-11-12 23:49  Οo白麒麟оΟ  阅读(118)  评论(0编辑  收藏  举报