源代码位于: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. rcu stall 导致的hung 记录

    synchronize_sched 也会在wait_rcu_gp 的长时间等待导致进入hung ,假设rcu没有及时执行的话, 另外,如果rcu积累到一定程度,内存自然就不足了,可能会oom. rcu ...

  2. 一文了解.Net的CLR、GC内存管理

    一文了解.Net的CLR.GC内存管理 微软官方文档对内存管理和CLR的概述 什么是托管代码? 托管代码就是执行过程交由运行时管理的代码. 在这种情况下,相关的运行时称为公共语言运行时 (CLR),不 ...

  3. Java开发学习(二十七)----SpringMVC之Rest风格解析及快速开发

    一.REST简介 REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格 当我们想表示一个网络资源的时候,可以使用两种方式: 传统风格资源描 ...

  4. vs完整编译Opencv+contrib

    准备条件 Opencv源码(以4.3.0为例) OpenContrib源码(以4.3.0)为例 最新版的CMake GUI CMake 生成项目 设置source code 和生成的build文件夹 ...

  5. OpenJudge1.5.17 菲波那契数列

    17:菲波那契数列 总时间限制: 1000ms 内存限制: 65536kB 描述 菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和. 给出一个正整数k,要求 ...

  6. dotnet 设计规范 · 数组定义

    ✓ 建议在公开的 API 使用集合而不是数组.集合可以提供更多的信息. X 不建议设置数组类型的字段为只读.虽然用户不能修改字段,但是可以修改字段里面的元素.如果需要一个只读的集合,建议定义为只读集合 ...

  7. 如何不编写 YAML 管理 Kubernetes 应用?

    Kubernetes 将自身边界内的事物都抽象为资源.其中的主要部分,是以 Deployment.StatefulSet 为代表的 workload 工作负载控制器,其他各类资源都围绕这些主要的资源工 ...

  8. 使用verdaccio+docker搭建npm私有仓库以及使用

    公司内部前端组件或库的共享等,搭建一个npm私有库就很方便,现在中大型公司也基本都有自己的npm私有库,这篇文章,和大家一起共同搭建一个npm私有库,共同学习 前置条件 一台电脑 可以联网 一.安装d ...

  9. 设计模式——桥接模式(Bridge模式)

    基本介绍 桥接模式(Bridge模式):将实现与抽象放在两个不同的类层次中,使两层次可以独立改变 是一种结构型设计模式 说白了就是有多个维度的变化,这样的组合关系如果按照传统的方式会导致类爆炸,所以需 ...

  10. 1 Java内存区域管理

    目录 1 关于自动内存管理 2 运行时数据区域 2.1 程序计数器 2.2 虚拟机栈 2.2.1 局部变量表 2.2.2 操作数栈 2.3 本地方法栈 2.4 堆 2.5 方法区 2.5.1 运行时常 ...