2020.7.12 DRF视图类功能

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


1.复习内容

2.灵感代办

3.学习内容

  • DRF 认证,权限配置

    • 1.全局配置(所有视图生效)

      • 全局需要配置在settings文件中,
      • 所有配置内容在REST_FRAMEWORK字典中,
      • 认证 KEY DEFAULT_AUTHENTICATION_CLASSES
        • rest_framework.authentication.BasicAuthentication
        • rest_framework.authentication.SessionAuthentication
        • 可能出现错误
          • 401 Unauthorized未认证
          • 403 Permission Denied 权限被禁止
      • 权限 DEFAULT_PERMISSION_CLASSES
        • rest_framework.permissions.AllowAny 允许所有用户
        • rest_framework.permissions.IsAuthenticated 仅通过认证的用户
        • rest_framework.permissions.IsAdminUser 仅管理员用户
        • rest_framework.permissions.IsAuthenticatedOrReadOnly 认证的用户可以完全操作,否则只能get读取
      • 一个元组:里面存放的是类的包名
    • 2.局部配置(只对当前视图有效)

      • 在继承rest_frameword框架中视图的类中定义属性
      • 认证类:authentication_classes
        • BasicAuthentication
        • SessionAuthentication
      • 权限类:permission_classes
        • AllowAny
        • IsAuthenticated
        • IsAdminUser
        • IsAuthenticatedOrReadOnly
      • 属性都是一个元组,存放的是类
  • DRF框架 限流 Throttling

    • 限流基本概念
      • 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.今天都复习了之前的什么内容


Ares个人进阶之路