• 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中定义,
                            用来在没有权限的时候返回信息。
  • 相关阅读:
    python模块之linecache
    如何在cmd命令下运行python脚本
    Git remote: ERROR: missing Change-Id in commit message
    Git命令git update-index --assume-unchanged,忽略不想提交的文件(忽略跟踪)
    Git命令cherry-pick,选择把一部分代码提交到另一个分支
    Redis可以用来做什么?(摘自http://www.lianpenglin.cc廉鹏林博客)
    Yii笔记:打印sql、Form表单、时间插件、Mysql的 FIND_IN_SET函数使用、是否是post/ajax请求
    Yii1使用Gii生成模块实现CURD
    通过经纬度获取所属城市信息-php
    树莓派进阶之路 (010)
  • 原文地址:https://www.cnblogs.com/ArmoredTitan/p/8807761.html
Copyright © 2020-2023  润新知