HttpResponse对象

Django服务器接收到客户端发送过来的请求后,会将提交上来的这些数据封装成一个HttpRequest对象传给视图函数。那么视图函数在处理完相关的逻辑后,也需要返回一个响应给浏览器。而这个响应,我们必须返回HttpResponseBase或其子类的对象。而HttpResponse则是HttpResponseBase用得最多的子类。那么接下来就来介绍一下HttpResponse及其子类,HttpResponse对象的属性和HTTPRequest对象的属性不同,HTTPResponse对象的属性是由服务端发送给浏览器的,所以很多属性都是由我们自己设置的。

常用属性:

  1. content:返回的内容。
  2. status_code:返回的HTTP响应状态码。

响应头:

  1. Content-Encoding:指定报文主体已经采用的编码方式,注意这个编码方式必须在request的Accept-Encoding中存在,否则客户端将无法解析报文主体。
  2. Content-Length:报文主体的长度。
  3. Transfer-Encoding:  用于指定传输报文主体时使用的编码方式,(传输过程中的编码格式,代理服务器之间)
  4. 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文件)

常用方法:

  1. set_cookie:用来设置cookie信息。后面讲到授权的时候会着重讲到。
  2. delete_cookie:用来删除cookie信息。
  3. writeHttpResponse是一个类似于文件的对象,可以用来写入数据到数据体(content)中,新写入的内容会在原先content之后。
  4. 设置响应头,通过设置字典的方式设置响应头,例如我们可以设置一些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详解的更多相关文章

  1. Django路由配置之正则表达式详解

    正则表达式详解 urls.py from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles ...

  2. Django之form表单详解

    构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的模板: <form action="/your-name/" method=" ...

  3. Django(十一)视图详解:基本使用、登录实例、HttpReqeust对象、HttpResponse对象

    一.视图(基于类的视图) [参考]https://docs.djangoproject.com/zh-hans/3.0/topics/class-based-views/intro/ 1)视图的功能 ...

  4. django中的路由控制详解

    一 Django中路由的作用 二 简单的路由配置 三 有名分组 四 路由分发 五 反向解析 六 名称空间 七 django2.0版的path 一 Django中路由的作用 URL配置(URLconf) ...

  5. Django基础,Day4 - views 详解

    在Django中,网页和其他内容是通过视图传递的.每个视图由一个简单的Python函数表示,Django将通过检查请求的URL(准确地说,是域名后面的部分URL)来选择一个视图. 例如,用户在浏览器中 ...

  6. 第一篇:Win10系统搭建Python+Django+Nginx+MySQL 开发环境详解(完美版)

    Win10+Python+Django+Nginx+MySQL 开发环境搭建详解 PaulTsao 说明:本文由作者原创,仅供内部参考学习与交流,转载引用请注明出处,用于商业目的请联系作者本人. Wi ...

  7. Django中url的生成过程详解

    在前面我们知道,Django启动之前会执行admin.py中的autodiscover()方法. def autodiscover(): autodiscover_modules('admin', r ...

  8. django url 中的namespace详解

    [引子] django是一个比较全能的web框架,比如它实现了自己的orm模型来对接不同的数据库.并提供了方便的数据接口:django牛逼的地方 还有许多,如他实现了自己的模板语言,这样我们就能方便的 ...

  9. Django学习之站点缓存详解

      本文和大家分享的主要是django缓存中站点缓存相关内容,一起来看看吧,希望对大家学习django有所帮助. 缓存整个站点,是最简单的缓存方法 在 MIDDLEWARE_CLASSES 中加入 “ ...

随机推荐

  1. 2017.10.6 Java命名规范及使用情况

    Package 的命名 Package 的名字应该都是由一个小写单词组成. Class 的命名 Class 的名字必须由大写字母开头而其他字母都小写的单词组成 Class 变量的命名 变量的名字必须用 ...

  2. 2.Spring Cloud初相识--------Eureka服务注册与消费

    前言: 1.Eureka介绍: Spring Cloud Eureka,使用Netflix Eureka来实现服务注册与发现,它既包含了服务端组件,也包含了客户端组件,并且服务端与客户端均采用Java ...

  3. 史上最简单的SpringCloud教程 | 第三篇: 服务消费者(Feign)

    转载请标明出处: https://www.fangzhipeng.com/springcloud/2017/07/12/sc03-feign/ 本文出自方志朋的博客 最新Finchley版本请访问: ...

  4. Redhat 6.4 linux系统不重启识别热添加的硬盘方法

    1.1    选择虚拟机添加一块硬盘 1.2    查看系统当前磁盘信息 [root@zhongyi-test ~]# ls -l /dev/sd* brw-rw----. 1 root disk 8 ...

  5. 命名空间“Microsoft.Office”中不存在类型或命名空间名称“Interop”(是否缺少程序集引用?

    在一个web项目中需要导出word打印,引用Microsoft.Office.Interop.Word后,在pages里使用正常,在app_code里新建类引用就报错. Report.cs里using ...

  6. request中的那些方法到底是干什么的?

    最近做Java Web项目,在.jsp页面和servlet之间request和response还是有些混淆,查阅了一些资料,总结如下,方便以后使用: 首先,servlet接口是最基本的,提供的五个方法 ...

  7. redis源代码结构解析

    看了黄建宏老师的<Redis设计与实现>,对redis的部分实现有了一个简明的认识: 之前面试的时候被问到了这部分的内容,没有关注,好在还有时间,就把Redis的源码看了一遍. Redis ...

  8. 【PHP项目】form表单的enctype属性

    enctype这个属性管理的是表单的MIME(Multipurpose Internet Mail Extensions)编码,共有三个值可选: 1.application/x-www-form-ur ...

  9. mysql的一些相关的命令(2013-05-05-bd 写的日志迁移

    cmd中连接:mysql -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样)断开:exit (回车) --建立数据库creata database 数据库名;--切换到数据库下工 ...

  10. linux无名管道

    特点 无名管道是半双工的,也就是说,一个管道要么只能读,要么只能写 只能在有共同祖先的进程间使用(父子进程.兄弟进程.子孙进程等) fork或者execve调用创建的子进程,继承了父进程的文件描述符 ...