1. 程式人生 > >rest_framework-02-權限-內置權限源碼流程

rest_framework-02-權限-內置權限源碼流程

應用 field nbsp 普通 定義 .py 默認 分享圖片 tail

權限

問題:不同視圖不同權限可以訪問

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-權限-內置權限源碼流程