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 ...
随机推荐
- 使用JQuery提交表单的两种方式选择
有一个表单,如果使用JQuery提交的话,可以使用下面2中方式,但他们的区别却是根据实际需求需要进行选择的. 第一种:表单按照action路径提交后,页面会刷新. $("#id") ...
- LeetCode – Number of Islands
Given a -d grid map of 's (water), count the number of islands. An island is surrounded by water and ...
- linux配置防火墙
centos6.5 防火墙开放80端口 iptables -I INPUT -p tcp –dport 80 -j ACCEPT //注意,dport前面是两个-,其中-I是指在防火墙INPUT表最前 ...
- Linux内核模块编程之Helloworld(初级)
注意printk那里,KERN_ALERT和打印消息之间是没有逗号的,搞得劳资查了半天才发现一直没有提示信息的原因 #include <linux/init.h> #include < ...
- .Net培训班课程体系
.Net培训 第一部分:.Net基础 .Net基础:数据类型.变量.运算符.分支结构.循环结构.方法.反编译器.递归.递归算法的非递归优化: 面向对象:异常.封装继承多态.单例模式.装饰者设计模式.t ...
- More C++ Idioms
Table of Contents Note: synonyms for each idiom are listed in parentheses. Adapter Template TODO Add ...
- VMware虚拟机里centos7下安装mysql5.6并授权远程连接Navicat
这节来安装Mysql5.6,并远程授权连接本地windows的Navicat,可以根据以下步骤安装.此文章为自己收藏,必要时拿出来直接用的,有需要的友友可以查看查看的.文章图片有借助于网络的. 1.新 ...
- struts中jsp表单控件命名注意
在jsp页面中写了这样的一个表单控件 <td>维修任务码</td><td><input type="text" id="mTas ...
- elasticsearch 基本操作
安装delete_by_query ,cd进/bin,执行./plugin install delete-by-query DELETE http://192.168.1.12:9200/dd ...
- oracle数据库使用小结
select * from r_patient a where a.birthdate= to_date('1953-03-01','yyyy-mm-dd');select * from r_pati ...