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 - 用于拦截请求,在视图函数钱执行相应权限认证方法

总结:

  • 权限类
    • 权限类必须单独存放在py文件内,若和view同一文件,则执行全局配时会出错
    • 继承 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)
		)

 

你可能感兴趣的:(DRF,Django)