Django - DRF - BasePermission 權限組件

目錄

一、BasePermission - 用於攔截請求,在視圖函數錢執行相應權限認證方法

1-1 drAuth.py - 權限類實現

1-2 視圖函數 - 需要權限驗證的類 - permission_classes

1-3 序列類 - 作爲數據返回的序列化 - ModelSerializer

1-4 models內  choices優化

 二、權限認證配置 - permission_classes

2-1 局部配置

2-2 全局配置 及 局部禁用

三、源碼分析


一、BasePermission - 用於攔截請求,在視圖函數錢執行相應權限認證方法

總結:

  • 權限類
    • 繼承 BasePermission
      • from rest_framework.permissions import BasePermission
    • ​​​​​​​​​​​​​​設置無選線返回信息 message = '您沒有權限查看' - 變量名必須爲message ​​​​​​​
    • 重寫 has_permission 方法
    • 驗證成功與否,返回True or False
  • 視圖類
    • 配置 permission_classes = [drfAuth.UserPermission, ] 作爲局部認證
  • ​​​​​​​choices優化
    • ​​​​​​​使用 get_字段名_display() -- 獲取choices內對應字符串

1-1 drAuth.py - 權限類實現

from rest_framework.permissions import BasePermission


class UserPermission(BasePermission):
    # 無權限的顯示信息
    message = '您沒有權限查看'

    # 必須重寫 has_permission
    def has_permission(self, request, view):
        user_type = request.user.user_type
        user_type_name = request.user.get_user_type_display()
        print(request.user.name)
        print(user_type_name)
        if user_type == 2:
            return True
        else:
            return False

1-2 視圖函數 - 需要權限驗證的類 - permission_classes

class Users(APIView):
    permission_classes = [drfAuth.UserPermission, ]

    def get(self, request, *args, **kwargs):
        response = {'status': 100, 'msg': '查詢成功'}
        ret = models.UserInfo.objects.all()
        ser = MySerializer.UserSerializer(ret, many=True)
        response['data'] = ser.data
        return JsonResponse(response, safe=False)

1-3 序列類 - 作爲數據返回的序列化 - ModelSerializer

from rest_framework import serializers
from app01 import models

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.UserInfo
        fields = '__all__'

    user_type = serializers.CharField(source='get_user_type_display')

    # user_type = serializers.SerializerMethodField()
    #
    # def get_user_type(self, obj):
    #     return obj.get_user_type_display()

1-4 models內  choices優化

from django.db import models

class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    user_choice = ((0, '普通用戶'), (1, '會員'), (2, '超級用戶'),)
    user_type = models.IntegerField(choices=user_choice, default=0)
    pwd = models.CharField(max_length=32)

 二、權限認證配置 - permission_classes

2-1 局部配置

'''
需認證類內配置
   !! 注意:可以在列表中存入多個認證類,不存在順序不同的區別!!
'''
permission_classes = [drfAuth.UserPermission, ]

2-2 全局配置 及 局部禁用

'''
settings配置文件
    所有視圖內的類都會經過REST_FRAMEWORK內的認證類內認證
'''
REST_FRAMEWORK={
   'DEFAULT_PERMISSION_CLASSES':['app01.MyAuth.UserPermission',]
}
 
'''
某一個視圖類內禁用認證 
    - 認證規則首先使用當前類內的 permission_classes 規則
    - 置空表示不執行任何認證
'''
permission_classes = []

三、源碼分析

'''
APIView - check_permissions

'''

def get_permissions(self):
     return [permission() for permission in self.permission_classes]


def check_permissions(self, request):
"""
Check if the request should be permitted.
Raises an appropriate exception if the request is not permitted.
"""
# 循環 permission_classes 列表內類
for permission in self.get_permissions():
    # 若列表類結果返回爲Flase - 返回 message 錯誤信息
	if not permission.has_permission(request, self):
		self.permission_denied(
			request, message=getattr(permission, 'message', None)
		)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章