django之HTTPResponse和JsonResponse详解
HttpResponse对象
Django服务器接收到客户端发送过来的请求后,会将提交上来的这些数据封装成一个HttpRequest
对象传给视图函数。那么视图函数在处理完相关的逻辑后,也需要返回一个响应给浏览器。而这个响应,我们必须返回HttpResponseBase
或其子类的对象。而HttpResponse
则是HttpResponseBase
用得最多的子类。那么接下来就来介绍一下HttpResponse
及其子类,HttpResponse对象的属性和HTTPRequest对象的属性不同,HTTPResponse对象的属性是由服务端发送给浏览器的,所以很多属性都是由我们自己设置的。
常用属性:
- content:返回的内容。
- status_code:返回的HTTP响应状态码。
响应头:
- Content-Encoding:指定报文主体已经采用的编码方式,注意这个编码方式必须在request的Accept-Encoding中存在,否则客户端将无法解析报文主体。
- Content-Length:报文主体的长度。
- Transfer-Encoding: 用于指定传输报文主体时使用的编码方式,(传输过程中的编码格式,代理服务器之间)
- content_type:返回的数据的MIME类型,默认为
text/html
。浏览器会根据这个属性,来显示数据。如果是text/html
,那么浏览器就会把content属性中的内容按照HTML格式解析,如果text/plain
,那么就会显示一个纯文本。常用的Content-Type
如下:- text/html(默认的,html文件)
- text/plain(纯文本)
- text/css(css文件)
- text/csv (csv文件)
- text/javascript(js文件)
- multipart/form-data(文件提交)
- application/json(json传输)
- application/xml(xml文件)
- application/vnd.ms-excel (excel文件)
常用方法:
- set_cookie:用来设置
cookie
信息。后面讲到授权的时候会着重讲到。 - delete_cookie:用来删除
cookie
信息。 - write:
HttpResponse
是一个类似于文件的对象,可以用来写入数据到数据体(content)中,新写入的内容会在原先content之后。 - 设置响应头,通过设置字典的方式设置响应头,例如我们可以设置一些csrftoken相关的验证信息到响应头:
response['X-Access-Token'] = 'xxxx',我们也可以在response生成csv或者Excel文件时,设置相应的响应头来描述生成的文件信息:response['Content-Disposition'] = 'attachment;filename="abc.xls"'
JsonResponse类:
如果不使用JsonResponse,只使用HttpResponse,我们想要返回一个json字符串也是可行的,要点有两个:
1、把content中要返回的内容是由json模块dumps成json字符串
2、设置content_type为'application/json'
示例代码如下:
from django.http import HttpResponse def jsonresponse_view(request):
person = {
'name': 'xdm',
'age': 19
}
person_str = json.dumps(person)
response = HttpResponse(person_str , content_type='application/json; charset=utf-8')
return response
上面原生的方式可以解决返回json字符串的需求,注意使用HTTPResponse时,我们需要把返回的数据先dumps成json字符串。如果我们直接使用JsonResponse方式会更简单,实质上JsonResponse也是继承HttpResponse,其内部处理和上面我们演示的原理相同,也是把content内容先dumps成json字符串,content_type='application/json'这两个规则,此时,在使用时直接返回可以dumps的content数据即可,不需要自己再去做dumps操作。示例代码如下:
from django.http import JsonResponse def jsonresponse_view(request):
person = {
'name': 'xdm',
'age': 19
}
response = JsonResponse(person)
return response
默认情况下JsonResponse
只能对字典进行dumps
,如果想要对非字典的数据进行dumps
,那么需要给JsonResponse
传递一个safe=False
参数。示例代码如下:
from django.http import JsonResponse
def index(request):
persons = ['张三','李四','王五']
return HttpResponse(persons)
以上代码会报错,应该在使用HttpResponse
的时候,传入一个safe=False
参数,示例代码如下:
return HttpResponse(persons,safe=False)
django之HTTPResponse和JsonResponse详解的更多相关文章
- Django路由配置之正则表达式详解
正则表达式详解 urls.py from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles ...
- Django之form表单详解
构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的模板: <form action="/your-name/" method=" ...
- Django(十一)视图详解:基本使用、登录实例、HttpReqeust对象、HttpResponse对象
一.视图(基于类的视图) [参考]https://docs.djangoproject.com/zh-hans/3.0/topics/class-based-views/intro/ 1)视图的功能 ...
- django中的路由控制详解
一 Django中路由的作用 二 简单的路由配置 三 有名分组 四 路由分发 五 反向解析 六 名称空间 七 django2.0版的path 一 Django中路由的作用 URL配置(URLconf) ...
- Django基础,Day4 - views 详解
在Django中,网页和其他内容是通过视图传递的.每个视图由一个简单的Python函数表示,Django将通过检查请求的URL(准确地说,是域名后面的部分URL)来选择一个视图. 例如,用户在浏览器中 ...
- 第一篇:Win10系统搭建Python+Django+Nginx+MySQL 开发环境详解(完美版)
Win10+Python+Django+Nginx+MySQL 开发环境搭建详解 PaulTsao 说明:本文由作者原创,仅供内部参考学习与交流,转载引用请注明出处,用于商业目的请联系作者本人. Wi ...
- Django中url的生成过程详解
在前面我们知道,Django启动之前会执行admin.py中的autodiscover()方法. def autodiscover(): autodiscover_modules('admin', r ...
- django url 中的namespace详解
[引子] django是一个比较全能的web框架,比如它实现了自己的orm模型来对接不同的数据库.并提供了方便的数据接口:django牛逼的地方 还有许多,如他实现了自己的模板语言,这样我们就能方便的 ...
- Django学习之站点缓存详解
本文和大家分享的主要是django缓存中站点缓存相关内容,一起来看看吧,希望对大家学习django有所帮助. 缓存整个站点,是最简单的缓存方法 在 MIDDLEWARE_CLASSES 中加入 “ ...
随机推荐
- theano中tensor的构造方法
import theano.tensor as T x = T.scalar('myvar') myvar = 256 print type(x),x,myvar 运行结果: <class 't ...
- Media所有参数汇总
Media所有参数汇总 我们最常需要用到的媒体查询器的三个特性,大于,等于,小于的写法.媒体查询器的全部功能肯定不止这三个功能,下面是我总结的它的一些参数用法解释: width:浏览器可视宽度. he ...
- 第17章 EXTI—外部中断/事件控制器—零死角玩转STM32-F429系列
第17章 EXTI—外部中断/事件控制器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...
- 如何在RedHat 7.0系统中安装mysql 5.7.22
如何在RedHat 7.0系统中安装mysql 5.7.22 今天给大家介绍一下如何安装mysql5.7,在安装之前,首先要查看的是,你的系统中有没有已经安装过的情况.键入rpm -qa|grep m ...
- MySql开启GTID和多线程复制功能
1.修改参数 master: gtid_mode = ON --开启gtid这个必须打开 enforce-gtid-consistency = ON ...
- javascript遍历方法总结
forEach 循环 JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: for (var index = 0; index < myArray.lengt ...
- ethereum(以太坊)(十一)--字节数组(一)
pragma solidity ^0.4.0; contract byte1{ /* 固定大小字节数组(Fixed-size byte arrays) 固定大小字节数组可以通过bytes1,bytes ...
- PHP无限分类生成树方法,非递归,引用
//这个是核心方法 function generateTree($items){ $tree = array(); foreach($items as $item){ ...
- yii2深入理解之内核解析
一.前言 首先,yii2最为为数不多的PHP主流开源框架,受欢迎程度不亚于laravel和TP.个人认为,研究这些框架底层代码是非常有助于自身代码编程思想的提升和代码简化程度和质量的提升的. 那么,话 ...
- PHP ping
<?php /// start ping.inc.php /// $g_icmp_error = "No Error"; // timeout in ms function ...