drf-权限、频率、过滤、排序

权限、频率、过滤、排序

1 权限

1.1 源码分析

# 权限和认证的套路是相同的,但是需要先进行认证,所以权限需要注册在认证之后。
# 查找位置:APIView --> dispatch--> initial中的三条函数执行第二条
self.check_permissions(request)
   def check_permissions(self, request):
        遍历权限对象列表得到权限对象,进行权限认证
        for permisiion in self.fet_permissions():
            # 权限类要有一个has_permisiion权限方法进行权限认证
            # has_permisiion参数:权限对象self,请求对象request,视图类对象
            # 返回值是布尔类型
            if not permission.has_permission(request, self):
                self.permission_denied(
                    request, message=getattr(permission, 'message', None)
                )

1.2 权限的使用

使用过程也比较简单,首先需要写一个继承Basepermission,重写has_permisiion方法,如果权限通过就返回True,否则就是False,

由于has_permission参数有三个,调用本身,request,以及视图类对象,且是位于认证之后的,因此可以使用request.user拿到登录对象。

from rest_framework.permissions import BasePermisson

class UserPermission(BasePermission):
    def has_permission(self, request, view):
        user = request.user  # 拿到用户对象
        if user.user_type == 1:
            return True
        return False

1.3 权限的使用范围

# 局部使用:禁用的话,列表是为空
    permission_classes = [app_auth.UserPermission]  # 在视图类中书写

# 全局使用:在settings文件中进行配置,需要写道auth认证的配置之后。因为要使用request.user。
REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.app_auth.MyAuthentication",],
    'DEFAULT_PERMISSION_CLASSES': [
        'app01.app_auth.UserPermission',
    ],
}

1.4 内置权限(了解)

# 内置权限使用IsAdminUser方法,查找是否是对网站后台有权限的用户
# 创建用户
# 写测试视图类:针对视图类的权限设定,只需要将局部进行配置,在请求该视图函数的时候就会触发运行。

2 频率

2.1 内置的频率限制

一般情况下,频率限制都不会自己进行写,只需要使用别人写好的,然后我们进行一下配置就好。

# 全局使用  
# 这个限制的是非登录用户
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle',
    ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '3/m',
    }
}

# 局部使用
from rest_framework.throttling import AnonRateThrottle
class TestView5(APIView):
    authentication_classes=[]
    permission_classes = []
    throttle_classes = [AnonRateThrottle]
    def get(self,request,*args,**kwargs):
        return Response('我是未登录用户,TestView5')

2.2 限制实例

# 需求:未登录用户1分钟访问5次,登录用户一分钟访问10次
全局:在setting中
  'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ),
    'DEFAULT_THROTTLE_RATES': {
        'user': '10/m',  # 每分钟十次,
        'anon': '5/m',  # 未登录用户每分钟5次
    }
        
 局部配置:
	在视图类中配一个就行

3 过滤

跟频率限制相同,但是需要先下载一个django_filter三方库。

# 使用流程
    1 安装:pip install django-filter
    2 注册,在app中注册:'django_filters'
    3 全局配或者局部配
         'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
    4 视图类中可以进行配置是按照哪个字段进行过滤的。
    class BookView(ListAPIView):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
        filter_fields = ('name',)  #配置可以按照哪个字段来过滤
    # 可以在路由匹配中通过?条件的形式进行过滤

4 排序

按照字段进行一个排序

# 使用也分局部和全局

# 局部使用:视图类中添加
  ordering_fields = ('id', 'price')
    
# 使用
http://127.0.0.1:8000/books/?ordering=-price
http://127.0.0.1:8000/books/?ordering=price
http://127.0.0.1:8000/books/?ordering=-id


5 异常处理(重要)

如果不符合我们的要求的话,会抛出异常,此时可以进行一个自定义异常处理,使显示更加规范。经过查看源码可知,处理异常的方法是exception_handler,会返回一个异常提示。

from rest_framework.views import exception_handler

def my_exception_handler(exc, context):
    # 根据查看代码,发现如果不符合认证、权限、频率的话就会抛出异常,然后捕获异常执行exception_handler,返回一个默认的response格式,我们可以针对下列的response进行一个处理并返回。
    response=exception_handler(exc, context)  

想要生效,需要进行一下全局配置settings.py

'EXCEPTION_HANDLER': 'app01.app_auth.my_exception_handler',

6 封装Response对象(重要)

封装Response对象可以使前后端沟通更加方便,返回数据更加的规范。在返回的时候只需要调用封装的Response类生成的对象就行。格式需要自己设定。

原文地址:https://www.cnblogs.com/liqianxin/p/13279623.html