zoukankan      html  css  js  c++  java
  • rest_framework-02-权限-内置权限源码流程

    rest_framework-02-权限-内置权限源码流程

     

    权限

    问题:不同视图不同权限可以访问

    1.models.py

    from django.db import models
    
    class UserInfo(models.Model):
        user_type_choices = (
            (1,'普通用户'),
            (2,'VIP'),
            (3,'SVIP'),
        )
        user_type = models.IntegerField(choices=user_type_choices)
        # username = models.CharField(max_length=32)
        username = models.CharField(max_length=32,unique=True)
        password = models.CharField(max_length=64)
    
    class UserToken(models.Model):
        user = models.OneToOneField(to='UserInfo')
        token = models.CharField(max_length=64)
    models.py

    2.用户类型:

    3.views.py:

    假设订单相关业务(只有SVIP用户有权限)  
     

    假设用户信息相关业务(只有普通用户、VIP有权限)

     

    4.运行结果:

    基本使用

    以上的权限代码封装到一个类中,以后各个视图的get请求直接调用即可。不用每个类都写一遍权限。

    自定义权限类: 需要找到has_permission方法

    0.看源码:

    1.

     

    2.

    3.复制源码has_permission方法

    4.继续定义权限类:has_permission方法返回True表示有权访问。

     

    5.定义好了权限类,局部使用。

    局部权限

     

    6.运行结果:

    7.再定义一个权限,出SVIP以外,其他用户都能访问。

    8.将全权都放到另一个单独的文件中。

    然后视图文件需要则引入。

     

     views.py应用即可

     代码:

            
            基本使用:
                            
                class MyPermission(object):
    
                    def has_permission(self,request,view):
                        if request.user.user_type != 3:
                            return False
                        return True
                                                
                
                class OrderView(APIView):
                    """
                    订单相关业务(只有SVIP用户有权限)
                    """
                    permission_classes = [MyPermission,]
                    
                    def get(self,request,*args,**kwargs):
                        # request.user
                        # request.auth
                        self.dispatch
                        ret = {'code':1000,'msg':None,'data':None}
                        try:
                            ret['data'] = ORDER_DICT
                        except Exception as e:
                            pass
                        return JsonResponse(ret)
    权限代码
    permission.py
    
    from rest_framework.permissions import BasePermission
    
    # 权限
    class SvipPermission(BasePermission):
        message = "必须是SVIP才能访问"
        def has_permission(self,request,view):
            if request.user.user_type != 3:  # SVIP
                return False  # 无权访问
            return True  # 有权访问
    
    class MyPermission1(BasePermission):
        def has_permission(self, request, view):
            if request.user.user_type == 3:  # 普通用户、VIP
                return False  # 无权访问
            return True  # 有权访问
    
    
    views.py
    
    from api.utils.permission import MyPermission1
    from api.utils.throttle import VisitThrottle
    
    
    class OrderView(APIView):
        """
        订单相关业务(只有SVIP用户有权限)
        """
        # 权限
        # permission_classes = [SvipPermission,]
        def get(self, request, *args, **kwargs):
            # request.user
            # request.auth
            self.dispatch
            # if request.user.user_type != 3:
            #     return HttpResponse('无权访问')
    
            ret = {'code':1000,'msg':None,'data':None}
            try:
                ret['data'] = ORDER_DICT
            except Exception as e:
                pass
            return JsonResponse(ret)
    
    
    class UserInfoView(APIView):
        """
        用户信息相关业务(只有普通用户、VIP有权限)
        """
        # 权限  写了就不用全局的svip权限了。
        permission_classes = [MyPermission1, ]
        def get(self, request, *args, **kwargs):
            # if request.user.user_type == 3:
            #     return HttpResponse('无权访问')
            return HttpResponse('用户信息')
    View Code

    以上的单视图应用。全局使用怎么办呢?

    全局权限

    1.权限源码流程:

     

    2.

     

    3.

     

    4.

     

    5.

     

    6.

     

     
    7.局部配置

     

    8.permission.py

     

    9.全局配置  settings.py

    "DEFAULT_PERMISSION_CLASSES":['api.utils.permission.SvipPermission'], # 权限

     

    10.继续看源码:

     

    11.每一个权限都有该方法 has_permission

     

    12.如果返回Fasle,则执行报错,抛出异常。

     permission_denied

     

    13.抛出异常

     

    14.默认英文报错

     

    运行结果:

     

    15.如何改成中文报错信息呢?

     

     运行结果:

    内置权限

    1.内置权限源码流程

     

     2.为了让我们的权限更正规,必须继承该内置权限。

    代码:

    from rest_framework.permissions import BasePermission
    
    # 权限
    class SvipPermission(BasePermission):
        message = "必须是SVIP才能访问"
        def has_permission(self,request,view):
            if request.user.user_type != 3:  # SVIP
                return False  # 无权访问
            return True  # 有权访问
    
    class MyPermission1(BasePermission):
        def has_permission(self, request, view):
            if request.user.user_type == 3:  # 普通用户、VIP
                return False  # 无权访问
            return True  # 有权访问
    BasePermission 内置权限
                
            梳理:
                1. 使用
                    - 类,必须继承:BasePermission,必须实现:has_permission方法
                        from rest_framework.permissions import BasePermission
    
                        class SVIPPermission(BasePermission):
                            message = "必须是SVIP才能访问"
                            def has_permission(self,request,view):
                                if request.user.user_type != 3:
                                    return False
                                return True
                    - 返回值:    
                        - True, 有权访问
                        - False,无权访问
                    - 局部 
                        class UserInfoView(APIView):
                            """
                            订单相关业务(普通用户、VIP)
                            """
                            permission_classes = [MyPermission1, ]
    
                            def get(self,request,*args,**kwargs):
                                return HttpResponse('用户信息')
    
                    - 全局 
                        REST_FRAMEWORK = {
                            "DEFAULT_PERMISSION_CLASSES":['api.utils.permission.SVIPPermission']
                        }
                    
  • 相关阅读:
    HTML笔记
    html文本格式化
    标题大小与字体大小的关系
    html学习笔记
    冒泡排序
    直接插入算法
    绘制针状图
    绘制矢量图
    饼图pie 或者pie3
    三维直方图
  • 原文地址:https://www.cnblogs.com/yimiflh/p/9281190.html
Copyright © 2011-2022 走看看