源代码位于: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. Apache DolphinScheduler 3.0.0 正式版发布!

    ​  点亮 ️ Star · 照亮开源之路 GitHub:https://github.com/apache/dolphinscheduler   ​ 版本发布 2022/8/10 2022 年 8 ...

  2. Java精进-手写持久层框架

    前言 本文适合有一定java基础的同学,通过自定义持久层框架,可以更加清楚常用的mybatis等开源框架的原理. JDBC操作回顾及问题分析 学习java的同学一定避免不了接触过jdbc,让我们来回顾 ...

  3. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(14)-Fiddler断点(breakpoints)实战,篡改或伪造数据

    1.简介 上一篇主要就讲解和分享Fiddler断点的理论和操作,今天宏哥就用具体例子,将上一篇中的理论知识实践一下.而且在实际测试过程中,有时候需要修改请求或响应数据,或者直接模拟服务器响应,此时可以 ...

  4. 痞子衡嵌入式:MCUXpresso IDE下设置代码编译优化等级的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下设置代码编译优化等级的几种方法. 最近公司芯片设计团队正在开发一款全新的基于 Cortex-M33 内核的 ...

  5. Linux应急响应学习

    Linux应急响应-系统日志排查-溯源 溯源 找到攻击者.系统日志分析攻击者的ip  攻击者可能留下了一些代码 样本 网上的信息很大程度上是不可信的. 方法: 蜜罐  高交互的蜜罐 溯源: ip 日志 ...

  6. 【JDBC】学习路径8-连接池

    为什么是连接池? 第一.受我们硬件资源的限制,我们的一些资源使用时有限制的比如我们的数据库 连接数和线程数.为了摆脱这些限制,我们就使用了池化技术来将这些资源限制在一定范围内. 第二.我们创建和销毁这 ...

  7. Docker日常工作常用命令

    容器生命周期管理 Docker创建新容器并运行[run] 语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...] OPTIONS说明: -a stdin: 指 ...

  8. Pytorch: repeat, repeat_interleave, tile的用法

    https://zhuanlan.zhihu.com/p/474153365 torch.repeat 使张量沿着某个维度进行复制, 并且不仅可以复制张量,也可以拓展张量的维度: import tor ...

  9. ORM增删改查并发性能测试2

    前言 上一篇<ORM增删改查并发性能测试>出现了点小失误,有的输出SQL日志的代码没有禁用,数据库连接字符串可能有问题.统一环境,统一代码后,重新写一篇. 这次重点是并发性能测试,真不是为 ...

  10. MySQL InnoDB缓存

    1. 背景 对于各种用户数据.索引数据等各种数据都是需要持久化存储到磁盘,然后以"页"为单位进行读写. 相对于直接读写缓存,磁盘IO的成本相当高昂. 对于读取的页面数据,并不是使用 ...