• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MC_Hotdog
Yeah, you're right I'm still riding that crappy bike
博客园    首页    新随笔    联系   管理    订阅  订阅

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是访问用户对某个对象有权限

 

 

posted @ 2019-08-03 21:47  MC_Hotdog  阅读(288)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3