目錄
一、BasePermission - 用於攔截請求,在視圖函數錢執行相應權限認證方法
1-2 視圖函數 - 需要權限驗證的類 - permission_classes
1-3 序列類 - 作爲數據返回的序列化 - ModelSerializer
一、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) )