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

 

 

 

posted @ 2018-07-08 20:39  yimi+fly  阅读(131)  评论(0编辑  收藏  举报