drf中的APIView请求生命周期

APIView的as_view(局部禁用csrf) =>

调用父类view中的as_view返回view()方法 =>

自己的类调用自己的dispatch方法发送请求(drf的displatch中重写了错误分支,可以判断三大认证之前的错误,保证服务端请求安全,也可以判断逻辑中的错误) =>

分发前完成request的二次封装,进行数据解析, =>

三大认证 =>

请求的实际响应(根据自己视图类的处理分发) =>

其中出现异常,就会交给异常模块处理异常 =>

响应模块完成响应 =>

渲染模块将数据渲染称json或者浏览器的方式渲染.

请求模块

from rest_framework.request import Request
class BookAPIView(APIView):
def get(self, request, *args, **kwargs):
return Response({
'msg': 'apiview get ok'
})
  • 将wsgi的request对象转换为drf的Request对象

  • 封装后的Requset对象完全兼容wsgi的request对象,并且将原request保存在新request._request中

    self._request = request

  • 重写格式化请求数据存放位置

    • 拼接参数:request.query_params

      def query_params(self):
      """
      More semantically correct name for request.GET.
      """
      return self._request.GET
    • 数据包参数:request.data

    • 参数分类更加规范,

源码分析

入口:APIView的dispatch方法的request=self.initialize_request(request, *args, **kwargs)

获取解析类:parsers=self.get_parsers()

进行局部全局默认配置查找顺序进行查找:return [parser() for parser in self.parser_classes]

#drf中的Requset中的request的gteattr
def __getattr__(self, attr):
"""
If an attribute does not exist on this instance, then we also attempt
to proxy it to the underlying HttpRequest object.
"""
try:
return getattr(self._request, attr)
except AttributeError:
return self.__getattribute__(attr)

解析模块

检索顺序:局部配置 => 局部配置 => 框架默认配置

局部配置

在自己app包中的view视图文件中,添加

from rest_framework.parsers import JSONParser,FormParser,MultiPartParser
class Cars(View):
#局部配置解析类,使用于当前视图类
paraser_class = [JSONParser,FormParser,MultiPartParser]
全局配置

settings中配置,如果有不用的,注释就好

'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser', #application/json
'rest_framework.parsers.FormParser', #urlencoded
'rest_framework.parsers.MultiPartParser' #form-data
],

响应模块

from rest_framework.response import Response
def get(self, request, *args, **kwargs):
# a
response = Response(
data={
'msg': 'apiview get ok'
},
status=status.HTTP_404_NOT_FOUND,
)
print(response.data)
return response
源码
class Response(SimpleTemplateResponse):
"""
An HttpResponse that allows its data to be rendered into
arbitrary media types.
"""
def __init__(self, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):

渲染模块

局部配置

在自己app包中的view视图文件中,添加

from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class Cars(View):
#局部配置渲染类,使用于当前视图类
render_class = [JSONRenderer,BrowsableAPIRenderer]
全局配置

settings中配置,如果有不用的,注释就好

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

异常模块

drf的异常处理只能处理客户端异常,自己重写一个文件用于捕获客户端以及服务端异常并显示或者保存到日志文件中.

#首先在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
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: #客户端错误,调用drf的异常处理方法
response.data = {'detail': detail}
# 核心:要将response.data.get('detail')信息记录到日志文件
# logger.waring(response.data.get('detail'))
return response

drf模块及源码的更多相关文章

  1. maven多模块依赖源码调试

    Maven多模块项目中,通常存在摸个模块同时依赖其他多个基础模块的情况.在eclipse中使用run-jetty-run插件调试时,常常会出现找不到被依赖模块对应源码的错误提示.举个例子,模块A同时依 ...

  2. DRF cbv源码分析 restful规范10条 drf:APIView的源码 Request的源码 postman的安装和使用

    CBV 执行流程 路由配置:url(r'^test/',views.Test.as_view()),  --> 根据路由匹配,一旦成功,会执行后面函数(request) --> 本质就是执 ...

  3. 「从零单排canal 04」 启动模块deployer源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  4. ubuntu系统中查看python模块的源码

    案例:查看multiprocessing模块源码 1. 进入交互模式,导入模块,以multiprocessing模块为例 2. 查看multiprocessing.__file__属性,找到该模块的源 ...

  5. Django drf:cbv源码、resful规范及接口、drf使用、response源码、序列化

    一.cbv源码分析 二.resful规范 三.django中写resful的借口 四.drf写resful的借口 五.APIVIew源码分析 六.drf之序列化 一.cbv源码分析 -CBV和FBV ...

  6. DRF之APIView源码简析

    一. 安装djangorestframework 安装的方式有以下三种,注意,模块就叫djangorestframework. 方式一:pip3 install djangorestframework ...

  7. Django 缓存模块 page_cache 源码阅读

    Django cache中比较常用的有 cache_page 这么个 decorators, 下面就根据请求流程,结合源码来说说它是怎么工作的? 版本是django1.8,不同版本可能函数等会变化,逻 ...

  8. django的RestFramework模块的源码分析

    一.APIView源码分析 查看源码的前提要知道,找函数方法必须先在自己的类中找,没有再往父类找,一层一层网上找,不能直接按ctrl点击 在我们自己定义的类中没有as_view方法的函数,所以肯定是继 ...

  9. webpack4核心模块tapable源码解析

    _ 阅读目录 一:理解Sync类型的钩子 1. SyncHook.js 2. SyncBailHook.js 3. SyncWaterfallHook.js 4. SyncLoopHook.js 二: ...

随机推荐

  1. 如何玩转跨库Join?跨数据库实例查询应用实践

    背景 随着业务复杂程度的提高.数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求.原本在同一数据库实例里就能实现的SQL查询,现在需要跨多 ...

  2. Django常用组件之分页器

    目录 循环插入数据测试 实现分页器 视图层使用 模板层使用 循环插入数据测试 # ORM 帮我们提供了循环插入数据更快捷的方法: book_list = [] for i in range(1000) ...

  3. BCB怎么调用DLL中的函数

    推荐你看<BCB编写DLL终极手册>这篇文章如下片段:二. 静态调用 DLL使用 $BCB path\Bin\implib.exe 生成 Lib 文件,加入到工程文件中将该文件拷贝到当前目 ...

  4. LUOGUP3498 [POI2010]KOR-Beads (哈希)

    传送门 解题思路 这是一道上周的考试题...当时考的时候看了一眼,"呀,这不是调和级数,nlogn么!!!" ,然后一写就写了个n^2的....结果边界还弄错40分滚蛋了..正解就 ...

  5. Docker这个新软件究竟是用来干嘛的???

    http://dockone.io/article/378 尝试新软件 对开发者而言,每天会催生出的各式各样的新技术都需要尝试,然而开发者却不太可能为他们一一搭建好环境并进行测试.时间非常宝贵,正是得 ...

  6. VS2010-MFC(MFC消息映射机制概述)

    转自:http://www.jizhuomi.com/software/147.html 前面已经说过,Windows应用程序是消息驱动的.在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息 ...

  7. 基于SpringBoot的开源微信开发平台,Jeewx-Boot 1.0 版本发布

    项目介绍 JeewxBoot 是一款基于SpringBoot的免费微信开发平台.支持微信公众号.小程序官网.微信抽奖活动. Jeewx-Boot实现了微信公众号管理.小程序CMS.微信抽奖活动等基础功 ...

  8. 小米手机的miui10 连接电脑。本地播放器推荐。

    问题: 电脑连接了手机却不能看到手机里面的文件. 方法一 方法二 连接和电脑一样的wifi 进入文件管理 来自:百度经验. 本地播放器推荐 爱奇艺万能播放器(还不错,目前在用).qq影音 爱奇艺万能播 ...

  9. 条件渲染v-if

    <!DOCTYPE html> <html lang="zh"> <head> <title></title> < ...

  10. ckeditor图片上传二三事

    最近实验室要用ckeditor,踩了几个小坑记录下. 1.出现iframe跨域问题 response.setHeader("X-Frame-Options", "SAME ...