Django的视图层简介
Django的视图层
视图函数
所谓视图函数,其实就是我们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',{'datetime':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,搜索引擎会抓取新的内容而保存旧的网址。
Django的视图层简介的更多相关文章
- 【Django】 视图层说明
[Django视图层] 视图层的主要工作是衔接HTTP请求,Python程序和HTML模板,使他们能够有机互相合作从模型层lou到数据并且反馈.说到视图层的工作就有以下几个方面要说 ■ URL映射 对 ...
- Django的模板层简介
Django的模板层 如果我们想要利用视图函数返回一个页面,一种比较简单的方式是利用HttpResponse()方法返回一个含有html内容的字符串: def current_datetime(req ...
- Django-1版本的路由层、Django的视图层和模板层
一.Django-1版本的路由层(URLconf) URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:我们就是以这种方式告诉Dja ...
- Django之视图层与模板层
目录 视图层 小白必会三板斧 HttpResponse render redirect JsonResponse 前后端分离 FBV CBV 给CBV加装饰器 模板层 模板语法 模板传值 过滤器 语法 ...
- django之视图层和部分模板层
视图层 小白必会三板斧(三个返回的都是HttpResponse对象,通过看源码,可以知道是内部实现) 1.HttpResponse # 返回字符串 2.render # 返回一个html页面 还可以给 ...
- django 之视图层及模板层 04
目录 视图层 render方法是Template和Contex两个对象的组合使用 JsonResponse对象 CBV及源码分析 CBV 加装饰器的方式 模板层 模板语法传值 模板语法 变量 过滤器( ...
- Django之视图层的简介与使用
Django的View(视图) 一个视图函数(可以是类),简称视图,是一个简单的Python 函数(可以是类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个 ...
- Django之视图层介绍
1. 伪静态设置: 路由层: url('^index/$', views.index), url('^article/(?P<id>(\d+)).html/$', views.articl ...
- Django的视图层和模板层
目录 一.视图层 1. 小白必会三板斧 2. JsonResponse 3. FBV与CBV 3.1 FVB 3.2 CBV 4. CBV的源码 5. 给CBV加装饰器 二.模板层 1. 模板语法 2 ...
随机推荐
- day18-19 Storm
课程介绍 课程名称:Storm是什么 课程目标: 通过该课程的学习能够了解离线计算与流式计算的区别.掌握Storm框架的基础知识.了解流式计算的一般架构图. 课程大纲: 1. 离线计算是什么? 2. ...
- 亚马逊 协同过滤算法 Collaborative filtering
这节课时郭强的三维课.他讲的是MAYA和max .自己对这个也不怎么的感兴趣.而且这个课感觉属于数字媒体.自己对游戏,动画,这些东西一点都不兴趣,比如大一的时候刚开学的时候,张瑞的数字媒体的导论课.还 ...
- mysql-The-server-quit-without-updating-PID-file
mysql 编译后执行 /etc/init.d/mysqld start 启动失败 提示:"The server quit without updating PID file" 排 ...
- gcc的编译属性和选项
1.指定内存默认对其参数: __attribute__((packed)):按一字节对其__attribute__((aligned(n))):从此之后默认按n字节对其 例如: struct stu ...
- MySQL导出用户权限
在MySQL 5.5/5.6版本中,使用SHOW GRANTS命令可以导出用户的创建脚本和授权脚本. hostname='127.0.0.1' port= username='root' passwo ...
- lerna import && add 使用&&常见问题解决
使用lerna 的import 我们可以方便的将一个普通的npm 包倒入到lerna 管理的monorepo 中 环境准备 lerna init 注意必须是一个git 项目,同时需要commit ,不 ...
- encrypt and decrypt data
https://www.cyberciti.biz/tips/linux-how-to-encrypt-and-decrypt-files-with-a-password.html Encryptin ...
- 使用OpenCV进行人脸识别
不断维护的地址:http://plzcoding.com/face-recognition-with-opencv/ 怎样使用OpenCV进行人脸识别 本文大部分来自OpenCV官网上的Face Re ...
- Git安装及密钥的生成(转)
1.下载Git软件:http://msysgit.github.io/ 2.安装git软件(很简单).安装成功后,在[开始]->[程序]->[git],下就会看见Git Bash和Git ...
- jmeter—PerfMon Metrics Collector(附java.io.IOException: Agent is unreachable via TCP错误解决办法)
jmeter—PerfMon Metrics Collector(附java.io.IOException: Agent is unreachable via TCP错误解决办法 转自https:// ...