源代码位于: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. mybatis 10: 动态sql --- part2

    < foreach >标签 作用 用来进行循环遍历,完成循环条件的查询,批量删除,批量增加,批量更新 用法 循环查询 + 批量删除 + 批量增加 + 批量更新 UsersMapper.ja ...

  2. flutter系列之:flutter架构什么的,看完这篇文章就全懂了

    目录 简介 Flutter的架构图 embedder engine Flutter framework Widgets Widgets的可扩展性 Widgets的状态管理 渲染和布局 总结 简介 Fl ...

  3. Kotlin协程解析系列(上):协程调度与挂起

    vivo 互联网客户端团队- Ruan Wen 本文是Kotlin协程解析系列文章的开篇,主要介绍Kotlin协程的创建.协程调度与协程挂起相关的内容 一.协程引入 Kotlin 中引入 Corout ...

  4. Redis常用指令之string、list、set、zset、hash

    Redis之五大类型常用指令 redis的一些小知识 redis服务器端口默认是6379 在编译完成后的bin目录下启动服务端:redis-server 客户端连接操作:redis-cli -h lo ...

  5. 有意思的方向裁切 overflow: clip

    本文将介绍一个新特性,从 Chrome 90 开始,overflow 新增的一个新特性 -- overflow: clip,使用它,轻松的对溢出方向进行控制. overflow: clip 为何 首先 ...

  6. 【小白必看】Redis手把手教你从零开始下载到安装,再到配置允许图形化工具远程连接(一)

    一.Redis安装 本文暂时仅介绍Windows环境下Redis的安装. 由于Windows环境下没有.exe安装文件,这里我们使用"曲线救国"的.msi安装包帮助我们一站式解决安 ...

  7. Sirni题解(最小生成树,埃氏筛)(继 Liang-梁)

    目录 前言 题意 思路 一些建议 前言 本篇是对Liang-梁的Sirni(最小生成树,埃氏筛)的后继博客. 通篇原文:https://blog.csdn.net/qq_37555704/articl ...

  8. 第三十二篇:vue的响应式原理

    好家伙 什么是响应式?比较官方的回答: Vue.js 的核心包括一套"响应式系统". "响应式",是指当数据改变后,Vue 会通知到使用该数据的代码. 例如,视 ...

  9. linux 运维有趣的实用工具

    1.实时监控磁盘 IO-IOTop IOTop 命令是专门显示硬盘 IO 的命令, 界面风格类似 top 命令. [root@localhost ~]# yum -y install iotop` 2 ...

  10. 基于 Gitea 服务端渲染的 Jupyter Notebooks

    本指南将向您展示如何通过配置外部渲染器来使 Gitea 呈现 Jupyter Notebooks.当然,你还可以根据本指南来为你的 Gitea 实例配置其他类型的文档渲染器,甚至是二进制文件!相信Gi ...