Django REST framework之权限组件实例以及源码流程分析

抛出实际问题

基于上一个认证例子抛出问题:就是如果有多种用户种类,但是要对不同种类的用户设置权限,每一类的用户查看的内容应该是不一样的。

只需要我们写一个权限类,继承BasePermission基类。

 1 from rest_framework.permissions import BasePermission
 2 
 3 
 4 class Mypermission(BasePermission):
 5     message = '必须是svip'
 6 
 7     def has_permission(self, request, view):
 8         if request.user.user_type == 3:
 9             return True
10         return False

视图和路由匹配跟认证例子同。

全局设置权限:

 1 REST_FRAMEWORK = {
 2     # 认证
 3     'DEFAULT_AUTHENTICATION_CLASSES': ['api.utils.auth.Authticate', ],
 4     # 'DEFAULT_AUTHENTICATION_CLASSES': [],  # AnonymousUser None配置文件中有
 5     # 'UNAUTHENTICATED_USER': lambda: '匿名用户',
 6     # 'UNAUTHENTICATED_USER': None,
 7     # 'UNAUTHENTICATED_TOKEN': None,
 8     # 权限
 9     'DEFAULT_PERMISSION_CLASSES': ['api.utils.permission.Mypermission'],
10     # 节流 访问频率控制
11     "DEFAULT_THROTTLE_CLASSES": ['api.utils.throttle.VisitThrottle', ],
12     "DEFAULT_THROTTLE_RATES": {
13         "baidu": '3/m',
14         "baiduUser": '10/m',
15     }
16 
17 }

局部设置权限:

如果全局不配置,那就在局部类视图加上

1 permission_classes = [Mypermission, ]

权限组件源码流程分析

自己没有--->APIView的dispatch--->封装request---->执行initial----->执行self.check_permissions(request)------>循环所有权限对象self.get_permissions()----->执行权限类的has_permission(request, self)方法。(分两种情况:返回True通过权限,返回False不能通过)如果是返回Flase--->进入if条件体执行内部的self.permission_denied()方法--->通过反射获取当前权限对象的错误信息。message=getattr(permission, 'message', None)

内置权限类

BasePermission 写权限类规范必须继承此类 has_permission has_object_permission

AllowAny  通过所有

IsAuthenticated 只允许通过认证的用户的

IsAdminUser

IsAuthenticatedOrReadOnly

DjangoModelPermissions

DjangoModelPermissionsOrAnonReadOnly

DjangoObjectPermissions

以上几个都是基于Django源生写的权限

总结:自定义权限类时,实现has_permission方法, has_object_permission是访问用户对某个对象有权限

 
原文地址:https://www.cnblogs.com/Alexephor/p/11296372.html