码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-07-08 21:17:48      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:false   utils   try   码流   style   uniq   vip   django   char   

 

 

权限

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

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

 

 

 

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

标签:false   utils   try   码流   style   uniq   vip   django   char   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!