zoukankan      html  css  js  c++  java
  • Django REST framework使用及源码分析之权限

    权限组件的使用方式:
    原理和使用方式与认证相似。
    views.py
    class OrderView(APIView):
        '''
        订单相关业务,返回订单字典。
        添加验证功能,验证是否已登录。
        '''
        authentication_classes = [Authtication,]
        permission_classes = [MyPermission1, ]
        '''该刚就是添加Authtication认证,可以添加多个,如果是一个空列表,则不认证,也就是可以跳过认证'''
        def get(self,request,*args,**kwargs):
            ret = {'code':1000,'msg':None}
            try:
                ret['data'] = ORDER_DICT
            except Exception as e:
                pass
            return  JsonResponse(ret)
    
    上面是个简单的视图函数,继承了APIView,
    permission_classes这个列表写了那个权限类就判断哪个权限。

    app/utils/permission.py

    from rest_framework.permissions import BasePermission
    class MyPermission(BasePermission):
        # message = "必须是SVIP才能访问"
        '''权限验证,有权限为True'''
        def has_permission(self,request,view):
            if request.user.user_type != 3:
                return False
            return True
    
    class MyPermission1(BasePermission):
    
        def has_permission(self,request,view):
            if request.user.user_type == 3:
                return False
            return True
    
    将权限类写到单独的配置文件,继承BasePermission基类,
    重写has_permission方法,返回True为有权限,False为没权限。

    settings.py 全局配置

    REST_FRAMEWORK = {
        # 全局使用的认证类
        "DEFAULT_AUTHENTICATION_CLASSES":['app.utils.auth.Authtication', ],
        "UNAUTHENTICATED_USER":None, # 匿名,request.user = None
        "UNAUTHENTICATED_TOKEN":None,# 匿名,request.auth = None
        "DEFAULT_PERMISSION_CLASSES":['app.utils.permission.MyPermission1'],
    }
    
    全局的权限控制,如果想单独定义某个视图的权限,只需在视图中单独定义即可,优先读取本地权限。
     
     
    源码:
    dispatch
        -inital
            -self.check_permissions(request)

      

        -get_permission()

        

                循环权限类并实例化对象。
                    -permission.has_permission
                        执行has_permission方法,判断结果为True or False
                        我们一般就重写这个方法来实现权限的控制。
                        -permission_denied    
                            结果为Flase执行permission_denied 抛出异常。
                            permission_denied有个参数是message,可以在has_permission中定义,
                            用来在没有权限的时候返回信息。
  • 相关阅读:
    mysql多表查询
    mysql单表查询
    第四篇: 记录相关操作
    第4章-1.生成3的乘方表 (15分)
    第3章-17.输出10个不重复的英文字母 (50分)
    第3章-22.判断两个字符串是否为变位词 (40分)
    第3章-21.输出大写英文字母 (15分)
    第3章-20.判断回文字符串 (15分)
    第3章-19.逆序的三位数 (10分)
    第3章-18.找最长的字符串 (15分)
  • 原文地址:https://www.cnblogs.com/ArmoredTitan/p/8807761.html
Copyright © 2011-2022 走看看