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(‘用户信息‘)

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

全局权限

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‘]
                    }
                

原文地址:https://www.cnblogs.com/yimiflh/p/9281190.html

时间: 2024-11-06 10:59:12

rest_framework-02-权限-内置权限源码流程的相关文章

unity, 查看内置shader源码

1,建一个球体. 2,建一个材质,将材质拖到球体上. 3,在材质的shader下拉列表中选择想查看的内置shader,点材质栏右上设置按钮->Select Shader 进入shader面板. 4,点Compile and show code查看shader代码.(在此之前可点按钮右边箭头在弹出的下拉菜单中设置编译的目标平台). 不理想的是编译出来的代码可能是平台相关的,而且可读性也不大好. 不知道如何查看编译前的原始CG代码.

unity 内置 shader 源码

接下来的几天会写几个shader,这里先给出参考资料, 吃饱后补充shader的详解 unity built-in shader 源码(不同uinty版本): 下载地址:http://unity3d.com/unity/download/archive

scrapy crawlspider内置方法源码

rules: 有经验的同学都知道它是一个列表,存储的元素时Rule类的实例,其中每一个实例都定义了一种采集站点的行为.如果有多个rule都匹配同一个链接,那么位置下标最小的一个rule将会被使用. __init__: 在源码中可以看到,它主要就是执行了_compile_rules方法,这边暂时不讲. parse: 默认回调方法,同上章一样.不过在这里进行了重写,这里直接调用方法_parse_response,并把parse_start_url方法作为处理response的方法. parse_st

Unity中内置Shader源码的获取方式

现在可以直接在Unity下载页面获得 http://unity3d.com/get-unity/download/archive 包括StandardShader,StandardShaderGUI.cs等

java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream)

我们以ByteArrayInputStream,拉开对字节类型的“输入流”的学习序幕.本章,我们会先对ByteArrayInputStream进行介绍,然后深入了解一下它的源码,最后通过示例来掌握它的用法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_02.html ByteArrayInputStream 介绍 ByteArrayInputStream 是字节数组输入流.它继承于InputStream.它包含一个内部缓冲区,该缓冲区包含从流

【转】ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解

原文地址:http://blog.csdn.net/a396901990/article/details/36475213 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局——onLayout():决定View在ViewGroup中的位置 3.绘制——onDraw():如何绘制这个View. 而第3步的onDraw系统已经封装的很好了,基本不用我们来操心,只需要专注到1,2两个步骤就中好了. 而这篇文章就来谈谈第一步

onLayout源码 流程 思路详解(ANDROID自定义视图)

简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGroup中的位置 3.绘制--onDraw():如何绘制这个View. 而第3步的onDraw系统已经封装的很好了,基本不用我们来操心,只需要专注到1,2两个步骤就中好了. 第一步的测量,可以参考我之前的文章:(ANDROID自定义视图--onMeasure流程,MeasureSpec详解) 而这篇文章就来谈谈第二步:"

Django学习【第29篇】:django-admin的源码流程

django-admin的源码流程 一.admin的源码流程 首先可以确定的是:路由关系一定对应一个视图函数 a.当点击运行的时候,会先找到每一个app中的admin.py文件,并执行 b.执行urls.py admin.site是什么? admin.site,urls    返回的是一个元组,里面的第一个元素是一个列表 django-admin的源码流程 我们自己生成的动态的访问url ====================================初级版===============

11.6 Flask 源码流程,上下文管理

源码流程 创建对象 from flask import Flask """ 1 实例化对象 app """ app = Flask(__name__) """ 2 设置路由 将路由关系放在 app.url_map = {} 中 """ @app.route("/index") def index(): return "index" if —__na