2020.7.12 DRF视图类功能

发布于 2020-07-12  43 次阅读


Table of Contents

  • AnonRateThrottle 限制匿名用户,使用IP区分
    • DEFAULT_THROTTLE_RATES['anon'] 来设置频次
  • UserRateThrottle 限制认证用户,使用userid区分
    • DEFAULT_THROTTLE_RATES['user'] 来设置频次
  • ScopedRateThrottle 限制view视图类,使用throttle_scope 属性区分
    • throttle_scope 在继承drf框架的view中定义名称
    • DEFAULT_THROTTLE_RATES 使用名称进行限流
      • anon,user
      • 自定义throttle_scope 名称
  • DEFAULT_THROTTLE_RATES 周期
    • second, minute, hour 或day来指明周期。
    • 周期需要定义在全局配置文件中,或者重写
      • THROTTLE_RATES = api_settings.DEFAULT_THROTTLE_RATES
      • setattr(ScopedRateThrottle, "THROTTLE_RATES", rate)
        • rate是一个字典 定义了访问规则
  • 针对用户限流
    • REST_FRAMEWORK = {
          'DEFAULT_THROTTLE_CLASSES': (
              'rest_framework.throttling.AnonRateThrottle',
              'rest_framework.throttling.UserRateThrottle'
          ),
          'DEFAULT_THROTTLE_RATES': {
              'anon': '100/day',
              'user': '1000/day'
          }
      }

  • 针对视图限流
    • REST_FRAMEWORK = {
          'DEFAULT_THROTTLE_CLASSES': (
              'rest_framework.throttling.ScopedRateThrottle',
          ),
          'DEFAULT_THROTTLE_RATES': {
              'contacts': '1000/day', #视图中自定义throttle_scope名称
              'uploads': '20/day'
          }
      }

  • DRF 过滤 Filtering

    • 需要安装和注册
      • pip install django-filter
      • APPS中添加 django_filters
    • 指定过滤方法
      • DEFAULT_FILTER_BACKENDS:中指定
      • ('django_filters.rest_framework.DjangoFilterBackend',)
    • 在类中指定过滤字段
      • filter_fields = (,) models字段
    • 在路径中 携带字符串
      • /books?btitle=图书
  • DRF 排序 OrderingFilter

    • 设置 filter_backends=( 指定排序方法)
      • 指定为OrderingFilter
    • ordering_fields = (排序字段,排序字段)
      • 指定字段 (id,name,…)
    • 使用排序
      • url?ordering=-id (-是降序)
  • DRF 分页器 Pagination

    • 全局(不常用)
      • DEFAULT_PAGINATION_CLASS
      • PAGE_SIZE
      • REST_FRAMEWORK = {
            'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
            'PAGE_SIZE': 100  # 每页数目
        }

    • 局部方式
      • 定义一个Pagination类(继承PageNumberPagination)
        • page_size 属性 每页数目
        • page_size_query_param 字符串参数,就是查询关键字
        • max_page_size 最多多少条数据
      • 指定类创建的Pagination类
        • pagination_class = 类
      • class LargeResultsSetPagination(PageNumberPagination):
            page_size = 1000
            page_size_query_param = 'page_size'
            max_page_size = 10000
        class BookDetailView(RetrieveAPIView):
            queryset = BookInfo.objects.all()
            serializer_class = BookInfoSerializer
            pagination_class = LargeResultsSetPagination
            # pagination_class = None

    • 可选分页器(调用方式不同)
      • PageNumberPagination
        • 可以在子类中定义的属性:
          • page_size 每页数目
          • page_query_param 第几页,默认为"page"
          • page_size_query_param 每页条数关键字 默认None‘
          • max_page_size 一页设置最多是多少条
      • LimitOffsetPagination
        • 可以在子类中定义的属性:
          • default_limit 默认限制,默认值与PAGE_SIZE设置一直
          • limit_query_param limit参数名,默认'limit'
          • offset_query_param offset参数名,默认'offset'
          • max_limit 最大limit限制,默认None
  • DRF 异常处理

    • 1.配置文件中指定异常类(是包名,不是元组)
    • 2.新建处理类异常类,放入utils
      • # 通用异常处理
        
        from rest_framework.views import exception_handler
        
        def custom_exception_handler(exc, context):
            # 先调用REST framework默认的异常处理方法获得标准错误响应对象
            response = exception_handler(exc, context)
        
            # 在此处补充自定义的异常处理
            if response is not None:
                response.data['status_code'] = response.status_code
        
            return response

    • REST framework定义的异常

      • APIException 所有异常的父类
      • ParseError 解析错误
      • AuthenticationFailed 认证失败
      • NotAuthenticated 尚未认证
      • PermissionDenied 权限决绝
      • NotFound 未找到
      • MethodNotAllowed 请求方式不支持
      • NotAcceptable 要获取的数据格式不支持
      • Throttled 超过限流次数
      • ValidationError 校验失败
  • 自动生成接口文档(鸡肋)

    • 一般项目都是先有文档,才能开发(对个人开发者很友好)
    • 文档描述说明的位置
    • pip install coreapi
  • 4.扩展延伸知识

    • jinja2全局变量

      • 1.定义一个py文件
      • 2.定义函数environment(**options)
      • 3.函数中定义一个env = Environment(**options)
      • 4.给env添加属性 globals.update({}) 添加的属性就是全局对象
      • 5.返回env对象
      • 6.在settings文件中 指定Backend为jinja2引擎
      • 7.在OPTIONS中添加environment值为自定义py文件包名
    • 拓展类子类

    • xpath匹配head节点

      • 直接匹配/html/head 、
      • 里面的元素都没有文本,所以都是匹配属性

    5.知识内容个人梳理

    6.今天都复习了之前的什么内容