1、Django服务器接收到客户端发送过来的请求后,会将提交上来的数据封装成httpRequest对象传给视图函数。那么视图处理完相关逻辑后,也需要返回一个响应给浏览器。而这个响应必须返回HttpResponseBase或者他的子类的对象,而HttpResponse就是HttpResponseBase中用得最多的子类对象 ⑴在django.http模块中定义了HttpResponse对象的API ⑵HttpRequest对象由Django自动创建,HttpResponse对象由程序员创建 ⑶在每一个视图函数中必须返回一个HttpResponseBase对象,当然也可以是HttpResponseBase的子类的对象(如HttpResponse对象、JsonResponse对象等)
2、因为HttpResponse对象和JsonResponse对象在Django中使用得比较常见,所以主要介绍这两种
3、HttpResponse对象下面有很多属性和方法,这些属性和方法可以用来对我们的视图函数返回的HttpResponse对象进行一些设置
1、作用:给浏览器返回数据(这里指返回一个HttpResponse对象)
2、HttpRequest对象是由Django创建的,HttpResponse对象是由程序员创建
3、用法: ⑴不用模板,直接返回数据。语句示例:return HttpResponse("Sunck is a good man") ⑵调用模板,使用render方法
4、render(request, templateName[, context]) ⑴作用:结合数据和模板,返回一个完整的HTML页面 ⑵参数: ①request:请求体对象 ②templateName:模板路径 ③context:传递给需要渲染在模板上的数据
content_type说明 ⑴用于设置返回数据的MIME类型,默认为text/html ⑵浏览器会根据这个属性,来显示数据,如果是text/html,那么就会解析这个字符串如果text/plain,那么就会显示一个纯文本 ⑶常用的content-type如下:
属性名说明text/html 默认的,html文件text/plain纯文本text/csscss文件text/javascriptjs文件multipart/form-data文件提交application/jsonjson传输application/xml xml文件
作用:用于设置返回的内容(响应内容为字符串时:不用模板,直接返回数据)
例1: ⑴编辑视图
⑵访问
注:这里先使用HttpResponse()方法来实例化一个HttpResponse对象,然后使用HttpResponse对象属性和方法来将一些内容增加到HttpResponse对象上。这里主要是介绍HttpResponse对象的属性和方法,至于如何使用render()方法来创建一个HttpResponse对象后面介绍
例1_1:其实例1中的写法就是相当于最开始介绍的 ⑴编辑视图
⑵查看HttpResponse源码
注: 1、可以看到其实HttpResponse对象的第一个参数就是content。例1中的写法其实就是将content分开来写了(所以例1中的写法意义不大)
2、当然HttpResponse的对象也可以用来返回一个HTML模板,只是说返回模板时不怎么用HttpResponse对象来返回,直接用render()方法简便的多(前面的"模板系统"那章有介绍)
1、作用:用于设置返回状态码
2、一般情况下,服务器成功响应时状态码为200,服务器错误时响应状态码是400等等
例2: ⑴查看源码
⑵编辑视图
⑶访问
作用:用于标记返回的content是一个什么样的类型。如果没有设置content_type属性的话,就默认返回的是一个text/html类型 ⑴也就是告诉浏览器返回的是一个html文本,那么浏览器就会把这个字符串用html的方式来进行解析和渲染
例3: ⑴编辑视图
⑵访问
例3_1: ⑴编辑视图
⑵访问
注: 1、在设置content_type属性时需要在实例化HttpResponse类时作为参数传入:HttpResponse(content_type="text/plain")
2、字符串文本中存在中文时最好设置下其编码,不然解析到浏览器中后会显示乱码:HttpResponse(content_type="text/plain;charset=utf-8")
1、方法:response['X-Access-Token'] = 'xxxx'
2、可以把HttpResponse对象当作一个字典一样,在其中增加和删除头部字段
3、注意!与字典不同的是,若要删除的头部字段不存在,del不会抛出KeyError异常
例4: ⑴编辑视图
⑵访问
注: 1、在视图函数中设置请求头:最常见的场景就是在做服务器接口(API)的时候,需要前端传入Token。这里的Token就可以在headers中设置 ⑴就是,登录成功以后,在响应的headers中设置一个Token给你,然后以后你每次在请求我这个接口的时候,就在请求头中带上这个Token,那么我就可以根据这个Token来判断你是否已经登录了 ⑵其实跟后面要介绍的Cookie差不多:只是说如果是Token的话,浏览器在请求的时候不会自动将Token添加到请求头中进行请求而是需要代码来实现这一步,而cookie的话浏览器可以自动添加到请求头中 ⑶在视图函数中设置响应头时:响应头的键值对都是我们自定义的 2、比如在前端中使用JS代码将Token添加到请求头中并请求后,那么在视图函数(服务器)中就可以使用HttpRequest对象下的META属性来获得传过来的Token值了:request.META.get("header key") ⑴header key必须大写,前缀必须是"HTTP",后面如果连接符是横线“-”,要改成下划线“_” ⑵例如你的header的key为api_auth,那在Django中应该使用request.META.get("HTTP_API_AUTH")来获取请求头的数据
作用:可以将response看做一个类文件对象,使用write()方法不断地往里面添加内容
例5: ⑴编辑视图
⑵访问
注: 1、当然write方法还有其他用处,比如在处理CSV文件时,这个后面介绍
2、set_cookie和delete_cookie方法都是用于处理cookie的,这个后面会单独介绍cookie
1、HttpResponse('xxx'):HttpResponse对象,返回字符串
2、render(request, '模板的路径', {}):返回一个页面
3、redirect('路径') 重定向:对这个路径再发出一次请求 注: 1、上面三个函数都可以用来创建一个HttpResponse对象,只是使用方法不一致
2、render和redirect的本质都是HttpResponse对象 ⑴render返回的是一个页面 ⑵redirect的本质就是HttpResponse对象加上一个状态码( 301 , 302 )和响应头
例5_1:
⑴编辑视图
def poll_index(request): content = {"msg": "test"} # 使用render()方法来创建一个HttpResponse对象(response变量):传入模板、上下文数据 response = render(request, "poll_demo.html", context=content) # 打印上下文(渲染的模板) print("response对象为:",response) print("响应内容为:",response.content) print("响应状态码为:",response.status_code) return response """ response对象为: <HttpResponse status_code=200, "text/html; charset=utf-8"> 响应内容为: b'<!DOCTYPE html>\n<html lang="en">\n<head>\n <meta charset="UTF-8">\n <title>\xe9\xa6\x96\xe9\xa1\xb5</title>\n</head>\n<body>\n <h3>\xe9\xa6\x96\xe9\xa1\xb5</h3>\n <h3>test</h3>\n</body>\n</html>' 响应状态码为: 200 """⑵编辑模板
注:
1、从上面例子可以看出:可以直接使用response对象的属性来获取对应属性值
2、可以看到:使用render()来创建一个HttpResponse对象时,在返回HttpResponse对象时已经渲染了模板(变量已经填入到了模板中)。所以说render()返回的是一个页面(将变量填入到了模板中,将整个HTML页面传递给前端进行显示)
1、JsonResponse():直接返回前端数据, 而不是页面
2、使用场景 : 项目用前后端分离时, 后端只做逻辑, 前端有专业前端工程师做, 后端返回的都是数据, 前端拿到数据再去渲染
3、JsonResponse本质 : 还是HttpResponse
下面两个例子只是自己想到的场景来写的,所以应该有错误或者不对的地方
例6:视图函数为接口性质
⑴编辑视图
⑵请求数据
⑶查看响应头
例7:返回HTML模板(这种返回模板方式了解即可)
⑴编辑视图
⑵编辑模板
⑶访问
⑷请求
⑸查看响应头
例8:
⑴编辑视图
注:
1、前面章节中我们都是在视图函数最后return时使用render()方法来实例化了一个HttpResponse对象,然后再将这个HttpResponse对象传递给前端
2、这里只是说先实例化了一个HttpResponse对象(例子中的response变量),并且继续使用这个HttpResponse对象的属性或方法来给这个将要返回的HttpResponse对象增加响应头信息。等全部处理完成后再返回这个HttpResponse对象(例子中的response变量)
⑵查看源码
注:从源码中可以看出render_to_response()方法和render()方法都可以用于创建一个HttpResponse对象,同时也能设置HttpResponse对象的属性和方法(content、status_code、content-type等)。更多重要的是能传入一个模板(template_name参数)、上下文数据并将这些数据传递给前端
⑶编辑模板
⑷访问