zoukankan      html  css  js  c++  java
  • 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是访问用户对某个对象有权限

     
  • 相关阅读:
    AirtestIDE这个隐藏的小助手,还没用过你就亏啦!
    不懂抓包也能做APP爬虫?1招教你爬取抖音流行歌名
    巧用bat文件做Airtest脚本的“批量运行”
    AirtestIDE1.2.4、1.2.5新版来袭!新增自动更新、iOS更多版本支持...
    NodeService Ensure that Node.js is installed and can be found in one of the PATH directories
    NET CORE通过NodeService调用js
    Java8 的 Stream API 的确牛X,但性能究竟如何呢?
    Java 生成二维码实战
    Java高并发之设计模式,设计思想
    NullPointerException 的处理新方式,Java14 真的太香了!
  • 原文地址:https://www.cnblogs.com/Alexephor/p/11296372.html
Copyright © 2011-2022 走看看