Django的响应对象

【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》_django 5企业级web应用开发实战(视频教学版)-CSDN博客

《Django 5企业级Web应用开发实战(视频教学版)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com)

Django的请求对象-CSDN博客

在Django框架中,HttpResponse对象是由HttpResponse类来定义的,而HttpResponse类同样定义在django.http模块中。

HttpRequest对象是浏览器发送过来的请求数据的封装,HttpResponse对象则是将要返回给浏览器的数据的封装。HttpRequest对象由Django自动解析HTTP数据包而创建,而HttpResponse对象则由程序员手动创建。

通常由设计人员负责编写的每个视图都要实例化、填充和返回一个HttpResponse对象。

1. HttpResponse类的使用方法

1)返回字符串

使用HttpResponse类最典型的方式用作构造函数,将string、bytes或者memoryview(Python 3.8+版本新增的一种类型)类型的值作为页面的内容传递给HttpResponse类。示例代码如下:

【代码4-70】

>>> from django.http import HttpResponse
>>> response = HttpResponse("Here's the text of the Web page.")
>>> response = HttpResponse("Text only, please.", content_type="text/plain")
>>> response = HttpResponse(b'Bytestrings are also accepted.')
>>> response = HttpResponse(memoryview(b'Memoryview as well.'))

另外,还可以将response看作一个类文件对象,使用wirte()方法不断地往里面增加内容。示例代码如下:

【代码4-71】

>>> response = HttpResponse()
>>> response.write("<p>Here's the text of the Web page.</p>")
>>> response.write("<p>Here's another paragraph.</p>")

2)传递可迭代对象

设计人员可以传递一个可迭代的对象给HttpResponse对象(例如StreamingHttpResponse),HttpResponse类会立即处理这个迭代器,并将其内容保存为字符串,最后废弃这个迭代器。

例如,在读取文件后,会立刻调用close()方法关闭这个文件。

3)设置头部字段

设计时可以把HttpResponse对象当作一个字典,在其中增加和删除头部字段,示例代码如下:

【代码4-72】

>>> response = HttpResponse()
>>> response['Age'] = 120
>>> del response['Age']

注意,如果要删除的头部字段不存在,则del操作不会抛出KeyError异常,这与字典是不一样的;因为HTTP头部字段中不能包含换行符,所以如果提供的头部字段值中包含换行符(CR或者LF),则将会抛出BadHeaderError异常。

4)附件形式

让浏览器以文件附件的形式处理响应,需要声明content_type类型和设置Content-Disposition头信息。

例如,给浏览器返回一个Excel电子表格,示例代码如下:

【代码4-73】

>>> response = HttpResponse(my_data, content_type='application/vnd.ms-excel')
>>> response['Content-Disposition'] = 'attachment; filename="excel.xls"'

2. HttpResponse类属性

(1)content属性:该属性表示响应的内容(bytes类型)。

(2)charset属性:该属性表示编码的字符集。如果没指定,将会从content_type中解析出来。

(3)status_code属性:该属性表示响应的状态码,例如200。

(4)reason_phrase:该属性表示响应的HTTP原因短语,一般使用HTTP标准的默认原因短语。另外,除非明确设置,否则该属性将由status_code的值决定。

(5)streaming:该属性的值总是False。由于该属性的存在,使得中间件能够区别对待流式响应和常规响应。

(6)closed:如果响应已关闭,那么该属性的值为True。

3. HttpResponse类方法

(1)HttpResponse.__init__(content=b'',content_type=None,status=200,reason=None,charset=None)

方法:该方法为HttpResponse类的初始化方法,通过使用content和content-type参数来实例化一个HttpResponse对象。具体参数介绍如下:

  • content参数通常是一个迭代器、bytestring、memoryview或字符串类型。如果是其他类型,则将通过编码转换为bytestring类型;如果是迭代器,那么这个迭代器返回的应该是字符串,并且这些字符串连接起来形成response的内容。
  • content_type参数是可选的,用于填充HTTP的Content-Type头部。如果未指定,默认情况下由DEFAULT_CONTENT_TYPE和DEFAULT_CHARSET设置组成,例如“text/html;charset=utf-8”。
  • status参数表示响应的状态码。
  • reason参数是HTTP响应短语。
  • charset参数是编码方式。

(2)HttpResponse.__setitem__(header, value)方法:该方法用于设置头部的键-值对。其中的两个参数都必须为字符串类型。

(3)HttpResponse.__delitem__(header)方法:该方法用于删除头部的某个键,如果键不存在也不会报错。该方法不区分字母大小写。

(4)HttpResponse.__getitem__(header)方法:该方法用于返回对应键的值。该方法不区分字母大小写。

(5)HttpResponse.get(header, alternate=None)方法:该方法用于返回给定的头部的值,当头部不存在时返回一个alternate参数。

(6)HttpResponse.has_header(header)方法:该方法用于检查头部中是否有给定的名称(不区分字母大小写),结果返回布尔值(True或False)。

(7)HttpResponse.items()方法:该方法的行为类似于Python字典中的dict.items()方法,用于获取HTTP响应中的头部。

(8)HttpResponse.setdefault(header, value)方法:该方法用于设置一个头部,除非该头部已经设置过了。

(9)HttpResponse.set_cookie(key,value='',max_age=None,expires=None,path='/',domain=None, secure=False, httponly=False,samesite=None)方法:该方法用于设置一个Cookie。其中的参数与Python标准库中的Morsel.Cookie对象相同。具体参数介绍如下:

  • max_age参数:用于定义生存周期,以秒为单位。如果设置为None,则在浏览器开启期间该Cookie一直保持,浏览器关闭后该Cookie一同删除。
  • expires参数:用于定义到期时间。
  • domain参数:用于设置跨域的Cookie。例如domain="example.com"将设置一个www.example.com和blogs.example.com等都可读的Cookie。否则,Cookie将只能被设置成其域可读取。
  • secure参数:secure=True表明支持HTTPS安全协议,secure=False表明不支持HTTPS安全协议。
  • httponly=True:阻止客户端的Java Script代码访问Cookie。
  • samesite参数:使用samesite='Strict'或samesite='Lax'通知浏览器在执行跨源请求时不要发送此Cookie。并非所有浏览器都支持samesite参数,因此该参数不是Django框架的CSRF保护的替代品,而是一种深度防御措施。使用samesite='None'(string)(Django v3.1版本新增的内容)显式声明此Cookie与所有相同站点和跨站点请求一起发送。

(10)HttpResponse.set_signed_cookie(key,value,salt='',max_age=None,expires=None,path='/', domain= None, secure=False,httponly=False,samesite=None)方法:该方法与set_cookie()方法类似,但是在设置之前将对Cookie进行加密签名。该方法通常与HttpRequest.get_signed_cookie()一起使用。其中samesite=None参数也是Django v3.1版本新增的内容。

(11)HttpResponse.delete_cookie(key,path='/',domain=None,samesite=None)方法:该方法用于删除Cookie中指定的key。由于Cookie的工作方式,路径(path)和域名(domain)应该使用与set_cookie()方法中相同的值,否则Cookie不会被删掉。

(12)HttpResponse.close()方法:在请求结束后WSGI服务器会调用此方法来关闭连接。

(13)HttpResponse.write(content)方法:该方法会将HttpResponse实例看作类似文件的对象,往里面添加内容。

(14)HttpResponse.flush()方法:该方法用于清空HttpResponse实例的内容。

(15)HttpResponse.tell()方法:该方法将HttpResponse实例看作类似文件的对象,移动位置   指针。

(16)HttpResponse.getvalue()方法:该方法返回HttpResponse.content的值。同时,该方法将HttpResponse实例看作一个类似流的对象。

(17)HttpResponse.readable()方法:该方法返回的值始终为False,判断是否可读。

(18)HttpResponse.seekable()方法:该方法返回的值始终为False,判断指针是否可以移动。

(19)HttpResponse.writable()方法:该方法返回的值始终为True,判断是否可写。

(20)HttpResponse.writelines(lines)方法:该方法将一个包含行的列表写入响应对象中,不添加分行符。

4. HttpResponse子类

Django还包含了一系列的HttpResponse的衍生类(子类),用来处理不同类型的HTTP响应。与HttpResponse类相同,这些子类存在于django.http模块之中。同时,这些子类并不算复杂,代码也很简单,主要区别就是响应码的不同。

HttpResponse衍生类(子类)的具体说明如下:

  • HttpResponseRedirect类:重定向,返回302状态码。目前,已经被redirect()方法替代。
  • HttpResponsePermanentRedirect类:永久重定向,返回301状态码。
  • HttpResponseNotModified类:未修改的页面,返回304状态码。
  • HttpResponseBadRequest类:错误的请求,返回400状态码。
  • HttpResponseNotFound类:页面不存在,返回404状态码。
  • HttpResponseForbidden类:禁止访问,返回403状态码。
  • HttpResponseNotAllowed类:禁止访问,返回405状态码。
  • HttpResponseGone类:响应过期,返回405状态码。
  • HttpResponseServerError类:服务器错误,返回500状态码。

同时,设计人员还可以自定义HttpResponse的子类,示例代码如下:

【代码4-74】

01  from http import HTTPStatus
02  from django.http import HttpResponse
03 
04  class HttpResponseNoContent(HttpResponse):
05      status_code = HTTPStatus.NO_CONTENT

《Django 5企业级Web应用开发实战(视频教学版)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com)

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值