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)