04-视图层——响应对象(3个)
事先的准备
app01中views.py文件:
from django.shortcuts import render,HttpResponse,HttpResponseRedirect,redirect
1、响应对象(HttpResponse对象)主要有三种形式
可以return以下三种内容:
HttpResponse()
render()
redirect()
HttpResponse()括号内直接跟一个字符串作为响应体,比较简单直接,所以这里主要介绍后面两种形式
render()
render方法就是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体
语法
render(request, template_name[, context])
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
例如前面例子的(app01的views.py文件)(app01中url.py文件的路由控制略去):
def index(request):
import datetime
n = datetime.datetime.now()
now = n.strftime('%Y-%m-%d:%X')
return render(request,'index.html',{'datetime':now})
注意
#浏览器并不认识模板语法,render方法找到index.html文件之后,它先检查里面有没有模板语法,如果有模板语法先将传入的值做替换,将字典的key对应的value值now作为参数传给浏览器,传完参数之后index.html才是一个html文件了,然后render再将html文件那一堆东西传给浏览器,所以浏览最后显示的是now的值。
#render将模板语法替换成对应的值——这个过程十分重要,如果index.html文件中有需要“嵌入”的参数,那render的第三个参数得加,如果只是一个“静态页面”,不需要加render的第三个参数
对应的templates文件中的index.html文件的p标签这样写:<p>{{datetime}}</p>
注意此时嵌套了模板语法的index.html文件,在django中称为“模板文件”
参数
(1)request: 用于生成响应的请求对象。
(2)template_name:要使用的模板的完整名称,可选的参数
(3)context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
redirect()
传递要重定向的一个硬编码的URL
def my_view(request):
...
return redirect('/some/url/')
也可以是一个完整的URL
def my_view(request):
...
return redirect('http://example.com/')
两次请求
301和302的区别
301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。
他们的不同在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。
重定向原因
(1)网站调整(如改变网页目录结构);
(2)网页被移到一个新地址;
(3)网页扩展名改变(如应用需要把.php改成.Html或.shtml)。
这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。