源代码位于: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. List的同步类比较

    TL;NRs CopyOnWriteArrayList类在多线程顺序读取上有很大的优势,但在随机读取上反而有较大的劣势,且在写入方面性能极差. Vector类在顺序读取方面性能较差,但在随机读取方面有 ...

  2. java学习第一天.day03

    运行程序数据存储 ASCII Unicode(万国码) A在码表的顺序是65,a在码表的顺序是97,1代表49 变量 定义一个变量声明数据类型是开辟一个空间存储数据,java对数据的定义比较严格,比如 ...

  3. 【NOI P模拟赛】仙人掌(圆方树,树形DP)

    题面 n n n 个点, m m m 条边. 1 ≤ n ≤ 1 0 5 , n − 1 ≤ m ≤ 2 × 1 0 5 1\leq n\leq 10^5,n-1\leq m\leq 2\times1 ...

  4. 状态 :睡眠中,进程ID:13431,yum提示Another app is currently holding the yum lock; waiting for it to exit...

    问题描述: 今天想在虚拟机上重新安装docker然后使用到yum命令报错: 解决办法: [root@localhost ~]# rm -f /var/run/yum.pid 然后重新运行刚才的yum命 ...

  5. 说说 JSON 格式的弊端与解决方法

    JSON 格式是目前最流行的数据交互格式,广泛应用于前后端分离的系统.但也有一些场合不适合使用 JSON 格式. 1 JSON 格式弊端 有这样的一个需求:希望把客户端的日志上传到服务器存储起来.原先 ...

  6. 数据库基础操作 part1

    初识数据库 数据库相关概念 数据库管理软件: 本质就是一个C/S架构的套接字程序 服务端套接字 客户端套接字 操作系统: Linux 操作系统: 随意 计算机(本地文件) 计算机硬件 应用流程: 服务 ...

  7. JavaWeb核心篇(2)——Request和Response

    JavaWeb核心篇(2)--Request和Response 上篇文章中提及到了Servlet,在Servlet中我们主要继承了HTTPServlet类,在HTTPServlet类中我们会接触到两个 ...

  8. 在Windows Server 2019上安装edge浏览器

    在Windows 2016和2019的正式版本中是不带Edge浏览器的.有些工具.网站也不支持IE浏览器了.对于偶尔需要在服务器上访问这些站点的管理员来说有些不方便.不过可以通过安装三方浏览器或者Ed ...

  9. js 数组中的方法

    <!DOCTYPE html><html><head> <title>数组的方法</title> <meta charset=&quo ...

  10. 云原生之旅 - 3)Terraform - Create and Maintain Infrastructure as Code

    前言 工欲善其事,必先利其器.本篇文章我们介绍下 Terraform,为后续创建各种云资源做准备,比如Kubernetes 关键词:IaC, Infrastructure as Code, Terra ...