zoukankan      html  css  js  c++  java
  • 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类生成的对象就行。格式需要自己设定。

  • 相关阅读:
    吴恩达机器学习课程笔记章节二单变量线性回归
    cs224n第六讲依存分析
    吴恩达机器学习课程笔记章节一绪论
    cs224n第二讲词向量表示:word2vec
    cs224n第一讲深度自然语言处理
    DIY的.net正则表达式工具
    不写一行代码,利用常用工具和软件批量下载URL资源
    WEB页面采集器编写经验之一:静态页面采集器
    大规模IP地址黑名单高性能查询实现
    安卓开发入门与面试题01(潭州安卓开发入门教程)
  • 原文地址:https://www.cnblogs.com/liqianxin/p/13279623.html
Copyright © 2011-2022 走看看