所谓视图函数,其实就是咱们Django项目中各个应用中的views.py文件中定义的每一个用来处理URL路由映射到这里的逻辑函数。一个视图函数简称视图,它是个简单的Python 函数,它接受Web请求而且返回Web响应。响应能够是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片,任何东西均可以。可是须要注意的是,不管视图自己包含什么逻辑,都要返回响应。
下面是一个返回当前日期和时间做为HTML文档的视图:
from django.shortcuts import render, HttpResponse, HttpResponseRedirect, redirect import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
在上面的代码中:
1.首先,咱们从django.shortcuts
模块导入了HttpResponse
类,以及Python的datetime
库。
2.接着,咱们定义了current_datetime
函数。它就是视图函数。每一个视图函数都使用HttpRequest
对象做为第一个参数,而且一般称之为request
。可是视图函数的名称并不重要;不须要用一个统一的命名方式来命名,以便让Django识别它。咱们将其命名为current_datetime
,是由于这个名称可以精确地反映出它的功能。
3.这个视图会返回一个HttpResponse
对象,其中包含生成的响应。每一个视图函数都负责返回一个HttpResponse
对象。
在视图层咱们须要掌握两个对象:请求对象(HttpRequest)
与响应对象(HttpResponse)
。
请求对象
请求对象的经常使用属性
django将请求报文中的请求行、首部信息、内容主体封装成 HttpRequest 类中的属性。 除了特殊说明的以外,其余均为只读的。
1.请求方式:request.methon
:通常状况下,在浏览器的地址栏直接访问时是GET,用form的submit提交的方式是POST。
2.请求数据:request.GET与request.POST
:这两个方式哪个有值,彻底取决于请求的方式。这里须要注意的是获得的结果是一个“字典”。对于Get请求方式,若是浏览器的地址栏输入的是:http://127.0.0.1:8000/app01/index/?name=whw&age=22
,那request.GET
获得的结果是{'name':'whw','age':'22'}
。而对于POST请求方式,字典的key值是表单中input的name属性的值,而对应的value是input中用户输入的值。
3.请求路径:request.path
:请求路径的组成是:协议://IP:port/路径?参数(GET请求数据)
。好比说有一个GET请求http://127.0.0.1:8000/app01/index/?name=whw&age=22
,那这个请求答应出来的路径就是/app01/index/
。你们不要被后面的迷惑了,由于index后面是"?",咱们能够把它看做是路径与参数的分隔符,因此咱们打印路径的时候是不会打印"?"后面的参数的!
请求对象的经常使用方法
1.get_full_path()方法
:关于这个方法咱们须要注意一点就能够了,还拿上面的“请求数据”中的例子来说,若是GET请求方式输入:http://127.0.0.1:8000/app01/index/?name=whw&age=22
。path属性得出的只是/app01/index/
而get_full_path()方法
得出的是:/app01/index/?name=whw&age=22
2.is_ajax()方法
——判断请求是否是ajax方法。
响应对象
咱们知道,对于任何一个视图函数必需要返回响应对象,而返回的响应对象主要有三种形式:HttpResponse()
、render()
、redirect()
。另外须要注意的一点是,调用者三个方法前须要先在views.py
文件中引入:from django.shortcuts import render,HttpResponse,HttpResponseRedirect,redirect
HttpResponse()
对于HttpResponse()
,它比较简单,由于咱们在括号内直接加一个字符串做为响应体就能够了。咱们能够拿上面的“返回当前日期和时间做为HTML文档”的例子做为参考。
render()
render()是一个很重要的方法。它的做用是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面做为响应体返回给用户。
render()的语法是:render(request, template_name[, context])
。合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的HttpResponse对象。
render()
的参数介绍:
(1)request
:用于生成响应的请求对象。
(2)template_name
:要使用的模板的完整名称,可选的参数
(3)context
:添加到模板上下文的一个字典。默认是一个空字典。若是字典中的某个值是可调用的,视图将在渲染模板以前调用它。
例如,咱们如今用render()方法实现“返回当前时间”的功能,视图函数能够这样写(路由控制部分省略):
def index(request): import datetime n = datetime.datetime.now() now = n.strftime('%Y-%m-%d:%X') return render(request,'index.html',{'ctime':now})
模板文件index.html
中的内容为:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h4>当前时间:{{ ctime }}</h4> </body> </html>
须要注意的是:浏览器并不认识模板语法,render方法找到index.html文件以后,它先检查里面有没有模板语法,若是有模板语法先将传入的值作“替换”,就是将视图中字典{'datetime':now}
中datetime键对应的value值now做为参数传给浏览器,传完参数以后index.html才是一个html文件了,而后render再将html文件那一堆东西传给浏览器,因此浏览最后显示的是now的值。这个“替换”的过程十分重要,请你们务必理解并掌握!
redirect()——重定向
咱们能够传递要重定向的一个硬编码的URL:
def my_view(request): ... return redirect('/some/url/')
也能够是一个完整的URL:
def my_view(request): ... return redirect('http://example.com/')
对于重定向的使用场景,这里作了一下三点小结:
(1)网站调整(如改变网页目录结构)。
(2)网页被移到一个新地址。
(3)网页扩展名改变(如应用须要把.php改为.Html或.shtml)。这种状况下,若是不作重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户获得一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也须要经过重定向让访问这些域名的用户自动跳转到主站点等。
对于有关重定向状态码301
与302
的区别说明以下:
1.共同点:301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址能够从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另外一个地址B)
2.不一样点:301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向以后的网址;302表示旧地址A的资源还在(仍然能够访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。