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页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。
对于有关重定向状态码301302的区别说明如下:
1.共同点:301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)
2.不同点:301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。

Django的视图层简介的更多相关文章

  1. 【Django】 视图层说明

    [Django视图层] 视图层的主要工作是衔接HTTP请求,Python程序和HTML模板,使他们能够有机互相合作从模型层lou到数据并且反馈.说到视图层的工作就有以下几个方面要说 ■ URL映射 对 ...

  2. Django的模板层简介

    Django的模板层 如果我们想要利用视图函数返回一个页面,一种比较简单的方式是利用HttpResponse()方法返回一个含有html内容的字符串: def current_datetime(req ...

  3. Django-1版本的路由层、Django的视图层和模板层

    一.Django-1版本的路由层(URLconf) URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:我们就是以这种方式告诉Dja ...

  4. Django之视图层与模板层

    目录 视图层 小白必会三板斧 HttpResponse render redirect JsonResponse 前后端分离 FBV CBV 给CBV加装饰器 模板层 模板语法 模板传值 过滤器 语法 ...

  5. django之视图层和部分模板层

    视图层 小白必会三板斧(三个返回的都是HttpResponse对象,通过看源码,可以知道是内部实现) 1.HttpResponse # 返回字符串 2.render # 返回一个html页面 还可以给 ...

  6. django 之视图层及模板层 04

    目录 视图层 render方法是Template和Contex两个对象的组合使用 JsonResponse对象 CBV及源码分析 CBV 加装饰器的方式 模板层 模板语法传值 模板语法 变量 过滤器( ...

  7. Django之视图层的简介与使用

    Django的View(视图) 一个视图函数(可以是类),简称视图,是一个简单的Python 函数(可以是类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个 ...

  8. Django之视图层介绍

    1. 伪静态设置: 路由层: url('^index/$', views.index), url('^article/(?P<id>(\d+)).html/$', views.articl ...

  9. Django的视图层和模板层

    目录 一.视图层 1. 小白必会三板斧 2. JsonResponse 3. FBV与CBV 3.1 FVB 3.2 CBV 4. CBV的源码 5. 给CBV加装饰器 二.模板层 1. 模板语法 2 ...

随机推荐

  1. 【BZOJ1497】【NOI2006】最大获利

    最小割好劲啊 原题: 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项 ...

  2. 【数据库】jdbc详解

    try { if(resultSet!=null){ resultSet.close(); } }catch (SQLException e){ e.printStackTrace(); }final ...

  3. test20190409 线段

    题意 线段(segment) [题目描述] 给定n条线段,第i条线段的左端点为\(l_i\),右端点为\(r_i\).第i条线段覆盖了点x当且仅当\(l_i ≤x ≤ r_i\). 给定Q个询问,第i ...

  4. 尚硅谷【SpringBoot】入门

    https://www.bilibili.com/video/av20965295/?p=2 缺点: 基于springframe的封装    对framework api需要熟悉 2微服务 2014 ...

  5. OpenGL编程-OpenGL框架-win32项目

    在win32项目中开发的程序 小知识: 控制台应用程序运行就是dos的界面 项目一般采用了可视化开发 开发出来的东西就像QQ之类的 是有窗口界面的 程序运行结果是这样的 源代码:对第45行进行覆盖 # ...

  6. dive 方便的观察容器各层信息的工具

      dive 是一个方便的观察容器各层信息的工具,同时也集成了容器构建命令,方便我们在构建容器 镜像的同时查询镜像各层的变动信息 安装 mac 系统,可以按照自己的系统选择安装方式 wget http ...

  7. A* 寻路学习

    启发式搜索:启发式搜索就是在状态空间中的搜索.对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标.这样可以省略大量无谓的搜索路径,提高了效率.在启发式搜索中,对位置的估价是十分重 ...

  8. BeanShell用法(摘抄至网络)

    说明:本文部分资料摘抄至 来源: http://www.cnblogs.com/puresoul/p/4915350.html 来源: http://www.cnblogs.com/puresoul/ ...

  9. py-day2-1 python 列表类 list的调用反法

    # append() 追加 [在原来值最后追加] test = [1,2,3,[88,99],'abc'] test.append(') print(test) [1, 2, 3, [88, 99], ...

  10. centos下cmake编译安装mysql5.7.24

    一.centos6.5推荐最小安装.自定义添加如图两个包 二.安装cmake3.0(mysql5.7要求cmake2.9以上.cmake3.1要求gcc g++4.8以上.所以选自3.0) 1.分别执 ...