源代码位于:response.py
 
REST framework 提供一个 Response 类来支持 HTTP内容协商,该类允许返回可以呈现为多种类型的内容,具体取决于客户端的请求。
 
这个 Response 类是 Django中 SimpleTemplateResponse 类的一个子类。 Response 对象使用Python原生的数据类型进行初始化。 然后REST framework
使用标准的HTTP内容协商来确定如何呈现最终的响应内容。
 
我们并不一定非要使用DRF的 Response 类进行响应,也可以返回常规的 HttpResponse 或者 StreamingHttpResponse 对象,但是使用 Response 类可以提供一种多种格式的更漂亮的界面。
 
除非由于某种原因你要对 REST framework 做大量的自定义,否则你应该始终使用 APIView 类或者 @api_view 函数这些DRF提供的视图。这样做可以确保视图在返回之前能够执行 内容协商并且为响应选择适当的渲染器。
 
创建 responses
Response()
签名: Response(data, status=None, template_name=None, headers=None,content_type=None)
与常规的 HttpResponse 对象不同,我们不使用渲染过的内容来实例化一个 Response 对象,而是传递未渲染的数据,这些数据可以是任何Python基本数据类型。
 
Response 类使用的渲染器无法自行处理像 Django模型实例这样的复杂数据类型,因此你需要在创建 Response 对象之前将数据序列化为基本数据类型,比如json。你可以使用 REST framework的 Serializer 类来执行此类数据的序列化,或者使用你自定义的序列化器。
 
参数说明:
data : 要响应的已经序列化了的数据
status : 响应的状态码。默认是200。
template_name : 当选择 HTMLRenderer 渲染器时,指定要使用的模板的名称。
headers : 一个字典,包含响应的HTTP头部信息。
content_type : 响应的内容类型。通常由渲染器自行设置,由协商内容确定,但是在某
些情况下,你需要明确指定内容类型。
 
属性
.data
未渲染的,已经序列化的要响应的数据
.status_code
HTTP 响应的数字状态码。
.template_name
注:这段话我们要深刻理解一下!由于前后端分离了,前端页面的代码不是后端人员写的,前端不知道
django模型(甚至不知道后端是什么语言、什么框架、什么服务、什么数据库),不知道数据库的表结
构,没有Python中model的代码签名,无法自己反序列化一个Django的模型的对象,就像Python的
内置json模块无法序列化一个自定义的Python类一样。
然而,由于API形式的前后端分离,通过HTTP传输的内容格式通常都是json或者xml这些类型。为了将
Python,也就是Django中的模型中的具体数据内容可以json化,我们需要自己写serializer,也就
是序列化器,进行模型model对象的序列化和反序列化。如果不这么做,那前端看着后端发来的数据会
懵逼的,后端拿着前端post过来的数据也不知道该怎么存到数据库里去。
这完全不同于Django本身的全栈式开发模式,因为在前后端都是一个人编写的情况下,编写者掌握全
局,无论前端页面的渲染还是后端数据库的CRUD都由此人掌控,原理上随便怎么定义数据传输接口都可以。
 
template_name 只有在使用 HTMLRenderer 或者其他自定义模板作为响应的渲染器时才具有该属性。
 
标准的HttpResponse 属性
DRF的 Response 类扩展了 Django原生的 SimpleTemplateResponse ,所有原生的属性和方法都是提供的。比如你可以使用标准的方法设置响应的header信息:
.render()
和其他的 TemplateResponse 一样,调用该方法将序列化的数据渲染为最终的响应内容。
当 .render() 被调用时, 响应的内容将被设置成在 accepted_renderer 实例上调
用 .render(data, accepted_media_type, renderer_context) 方法返回的结果。
我通常并不需要自己调用 .render() ,因为它是由Django的标准响应过程来处理的。
 
 
我们只要记住下面几个知识点就可以了:
  • 扩展了Django原生的SimpleTemplateResponse
  • 可以使用标准的方法设置响应的头部信息
  • 会根据内容协商的结果自动渲染成指定的类型
  • 执行render()将序列化的数据渲染为最终响应的内容
  • 始终使用DRF提供的视图系统,并调用DRF提供的Response
 

19.drf response及源码分析的更多相关文章

  1. Django(48)drf请求模块源码分析

    前言 APIView中的dispatch是整个请求生命过程的核心方法,包含了请求模块,权限验证,异常模块和响应模块,我们先来介绍请求模块 请求模块:request对象 源码入口 APIView类中di ...

  2. Django(49)drf解析模块源码分析

    前言 上一篇分析了请求模块的源码,如下: def initialize_request(self, request, *args, **kwargs): """ Retu ...

  3. Django(50)drf异常模块源码分析

    异常模块源码入口 APIView类中dispatch方法中的:response = self.handle_exception(exc) 源码分析 我们点击handle_exception跳转,查看该 ...

  4. Django(51)drf渲染模块源码分析

    前言 渲染模块的原理和解析模块是一样,drf默认的渲染有2种方式,一种是json格式,另一种是模板方式. 渲染模块源码入口 入口:APIView类中dispatch方法中的:self.response ...

  5. Djang drf:APIView源码分析

    Django REST framework 简介   在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的.        开发REST AP ...

  6. 18.drf request及源码分析

    REST framework的 Request 类扩展了Django标准的 HttpRequest ,添加了对REST framework请求解析和身份验证的支持. 源代码片段: class Requ ...

  7. Django框架之DRF 认证组件源码分析、权限组件源码分析、频率组件源码分析

    认证组件 权限组件 频率组件

  8. Django-rest-framework源码分析----认证

    一.前言 1.1.安装 两种方式: github pip直接安装 pip install django-rest-framework 1.2.需要先了解的一些知识 理解下面两个知识点非常重要,djan ...

  9. Django rest framework源码分析(1)----认证

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

随机推荐

  1. 微服务性能分析|Pyroscope 在 Rainbond 上的实践分享

    随着微服务体系在生产环境落地,也会伴随着一些问题出现,比如流量过大造成某个微服务应用程序的性能瓶颈.CPU利用率高.或内存泄漏等问题.要找到问题的根本原因,我们通常都会通过日志.进程再结合代码去判断根 ...

  2. Word 的页眉、页脚、页码分别是什么?怎么设置?

    页眉:在 Word 文档中,每个页面的顶部区域为页眉.常用于显示文档的附加信息,可以插入时间.图形.公司微标.文档标题.文件名或作者姓名等. 页脚:页脚与页眉的作用相同,都可以作为显示文档的附加信息, ...

  3. Navicat的使用与python中使用MySQL的基本方法

    Navicat的使用与python中使用MySQL的基本方法 Navicat的下载及安装 下载地址 http://www.navicat.com.cn/download/navicat-premium ...

  4. python金牌班第七周周末总结

    python金牌班第七周周末总结 面向对象前戏 1.我们在学习面相对像之前有一个推导过程如何将我们之前写的东西,从一串代码转向给对象服务. 2.实例 我们首先模拟了两个物种进行战斗的场景,然后我们发现 ...

  5. react实战系列 —— React 中的表单和路由的原理

    其他章节请看: react实战 系列 React 中的表单和路由的原理 React 中的表单是否简单好用,受控组件和非受控是指什么? React 中的路由原理是什么,如何更好的理解 React 应用的 ...

  6. RabbitMQ 入门系列:6、保障消息:不丢失:发送方、Rabbit存储端、接收方。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  7. 【java】学习路径20-Date、Calender日期与时间

    简单的说,Date和Calender基本上是差不多的. 在最开始的时候只有Date,没有Calender. 在jdk不断更新的时候,发现了Date有一点缺陷,于是推出了Calender. // Dat ...

  8. 简易的DragDropCarousel 拖拽轮播控件

    上一篇文章有写到 自动轮播的控件  简易的AutoPlayCarousel 轮播控件 - 黄高林 - 博客园 (cnblogs.com) 本章是基于自动轮播的一种衍生,通过拖拽鼠标进切换 直接上代码 ...

  9. KingbaseES V8R6 锁等待检测

    背景 对于多数数据库,dba技能之一就是查找锁.锁的存在有效合理的在多并发场景下保证业务有序进行.下面我们看一下KingbaseESV8R6中查找阻塞的方法. 1.找到"被阻塞者" ...

  10. KingbaseES 并行查询

    背景:随着硬件技术的提升,磁盘的IO能力及CPU的运算能力都得到了极大的增强,如何充分利用硬件资源为运算加速,是数据库设计过程中必须考虑的问题.数据库是IO和CPU密集型的软件,大规模的数据访问需要大 ...