zoukankan      html  css  js  c++  java
  • 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
    每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)
  • 相关阅读:
    计算机网络 chapter 6 应用层
    计算机网络 chapter 4 网络层
    计算机网络 chapter 2 物理层
    计算机网络 chapter3数据链路层
    计算机网络 chapter 1 概述
    文章
    进程池线程池 协程
    MySQL
    同步锁 死锁与递归锁 信号量 线程queue event事件
    GIL全局解释器
  • 原文地址:https://www.cnblogs.com/kylin5201314/p/13967083.html
Copyright © 2011-2022 走看看