drf

DRF框架

  • 提供了可视化的API调试界面,开发者可以在线测试接口
  • 提供了各种身份验证策略
  • 提供了orm和orm数据的序列化支持
  • 支持视图函数
  • 大量的文档和视图
  1. 安装到Django工程中,能在Django中提供Restful接口
  2. 可以在一个web页面上浏览自己提供了哪些API,并可以通过这个页面测试API
  3. 不用自己写一套接口鉴权代码
  4. 不用自己写大量的CRUD接口,简单配置即可
  5. 不用自己写大量的条件查询接口,简单配置即可
  6. 不用自己写后台分页逻辑,简单配置即可
  7. 不用自己写接口限流逻辑,简单配置即可
  8. 不用自己写各种简单的参数校验逻辑,简单配置即可
  9. 不用自己注册各种路由,简单配置即可
  10. 权限逻辑不用写到业务逻辑中
  11. DRF不受csrf认证限制

APIView请求生命周期

  1. APIView类继承了View类,重写了as_view和dispatch方法
  2. 重写的as_view方法,主体还是View的as_view,只是在返回视图的view函数地址时,局部禁用csrf认证;
  3. 重写的dispatch方法:
    • 在执行请求逻辑前,请求模块(二次封装request)、解析模块(三种数据包格式的数据解析);
    • 在执行请求逻辑中,异常模块(执行出现任何异常交给异常模块处理);
    • 在执行请求逻辑后,响应模块(二次封装response)、渲染模块(响应的数据能JSON和页面两种渲染);

APIView的 as_view (局部禁用csrf) => 走父级的 as_view 调用dispatch分发请求 => APIView自己重写了dispatch,使用自己完成分发 => 分发前完成request二次封装、数据分析 => 三大认证 => 请求的实际响应(自己的视图类的处理分发) => 出现了异常,就会交给异常模块处理异常 => 响应模块完成响应、渲染模块可以json或浏览器两种方式渲染

请求模块

  1. 将wsgi的request对象转化成drf的Request类的对象;
  2. 封装后的request对象完全兼容wsgi的request对象,并将原来的request保存在新request._reqyeset中_
拼接参数:request_.request 被 request完全兼容

数据包参数:request.query_params | request.data

解析模块

只处理数据包参数form-data、urlencoded、json

  1. 全局配置所有视图类的解析方式,解析配置可以配置三种(重点)
  2. 局部配置当前视图类的解析方式,解析配置可以配置三种
  3. 配置的查找顺序,局部(视图类的类属性)=> 全局(settings文件的drf配置)=> 默认(drf的默认配置)

局部配置

parser_classes = [JSONParser, FormParser,MultiPartParser]

全局配置

'DEFAULT_PARSER_CLASSES':[
    'rest_framework.parsers.JSONParser',
    'rest_framework.parsers.FormParser',
    'rest_framework.parsers.MultiPartParser'
]

响应模块

  • data:响应数据
  • status:响应的网络状态码
  • template_name:drf完成前后台不分离返回页面,但是不能返回data
  • headers:响应头,一般不规定,使用默认
  • exception:一般异常响应,会将其设置成True,默认False(不设置也可以)
  • content_type:默认就是application/json,不需要处理
Respose(data=常量|列表|字典,status=网络状态码)

渲染模块

Postman请求结果时json,浏览器请求结果是页面

局部配置

renderer_classes = [JSONRenderer, BrowsableAPIRenderer]

全局配置

'DEFAULT_RENDERER__CLASSES':[
    'rest_framework.renderers.JSONRenderer',
    'rest_framework.renderers.BrowsableAPIRenderer', # 上线后尽量关
]

异常模块

settings中配置:

'EXCEPTION_HANDLER':'api.exception.exception_handler'

重写exception_handler

# 一定要在settings中将异常模块配置自己的异常处理函数
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.response import Response

# 先交给drf处理客户端异常,如果结果response为None代表服务器异常,自己处理
# 最终一定要在日志文件中记录异常现象
def exception_handler(exc, context):
    response = drf_exception_handler(exc, context)
    detail = '%s - %s - %s' % (context.get('view'), context.get('request').method, exc)
    if not response:  # 服务端错误
        response =  Response({'detail': detail})
    else:
        response.data = {'detail': detail}

    # 核心:要将response.data.get('detail')信息记录到日志文件
    # logger.waring(response.data.get('detail'))

    return response

posted on 2019-12-26 18:50  shenblogs  阅读(155)  评论(0)    收藏  举报

导航