博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
rest_framework-02-权限-内置权限源码流程
阅读量:4965 次
发布时间:2019-06-12

本文共 5084 字,大约阅读时间需要 16 分钟。

 

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

 

权限

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

1.models.py

from django.db import modelsclass 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.pyfrom 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.pyfrom api.utils.permission import MyPermission1from api.utils.throttle import VisitThrottleclass 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']                    }

 

 

 

转载于:https://www.cnblogs.com/yimiflh/p/9281190.html

你可能感兴趣的文章
世界上最方便的SharePoint移动客户端--Rshare
查看>>
MongoDB要点
查看>>
字段与属性的总结与比较
查看>>
[转]Linear Depth Buffer(线性深度缓冲区)
查看>>
05最小生成树_Prim
查看>>
centos iptables
查看>>
Mysql数据库日志
查看>>
Python基础-数据类型
查看>>
unity3d 移动与旋转 2
查看>>
MyEclipse安装Freemarker插件
查看>>
php 文件下载
查看>>
寻找二叉查找树中比指定值小的所有节点中最大的那个节点
查看>>
如何设置输入框达到只读效果
查看>>
html5模拟平抛运动
查看>>
java面向对象下:Java数据库编程
查看>>
RT3070 USB WIFI 在连接socket编程过程中问题总结
查看>>
Traffic Management Gym - 101875G
查看>>
cassandra 3.x官方文档(2)---架构解析
查看>>
java -version 问题 : C:\ProgramData\Oracle\Java\javapath;
查看>>
软件架构---SOA体系
查看>>