1、什么是视图?
视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你的Python目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为views.py的文件中。
视图函数如图所示:
from django.shortcuts import render, HttpResponse, redirect # Create your views here. def index(request): import datetime now = datetime.datetime.now() ctime = now.strftime('%y-%m-%d,%X') return render(request, "index.html", {"ctime": ctime})
如图,index函数就是一个视图函数,他的参数必须有request,必须返回一个HttpResponse对象。视图函数的函数名不需要统一,只需要表达出函数的功能即可。
2、HttpRequest请求对象
常用方法:
request.method:输出请求方式
request.path:输出路径
request.POST:POST请求数据
request.GET:get请求数据
request.META:请求头
request.get_full_path()拿路径也取参数
3、HttpResponse响应对象
响应对象主要形式有三种:
HttpResponse()
render()
redirect()
HttpResponse就是在括号里加上需要响应的字符串即可,这里主要说另外两种。
4、render()
结合一个给定的模版和上下文字典,返回一个渲染后的HttpResponse对象。
有两种功能:
1、读取文件字符串
def index(request): return render(request, 'index.html')
2、嵌入变量
views中的代码如同所示:
def index(request): shangping_list = ['苹果', '香蕉', '西瓜'] name = 'qqq' return render(request, 'index.html', {'sp': shangping_list, 'name': name})
即在后面加上以一个字典
模版如图所示:
<body> 用户:{{ name }} <h2>商品信息</h2> <ul> {% for foo in sp %} <li>{{ foo }}</li> {% endfor %} </ul> </body>
这样就可以在页面上通过字典中的键将数据传上来。以及循环取出序列中元素的方法。
页面如下所示:
用户:qqq
商品信息
苹果
香蕉
西瓜
5、redirect()
redirect方法是重定向方法,就是当一个网站的路由地址发生变化的时候,或者我们需要跳转到哪个路由地址的时候用到的,用法很简单。
def login(request): if request.method == 'GET': return render(request, 'login.html') else: user = request.POST.get('user') pwd = request.POST.get('pwd') if user =='qqq' and pwd == '123': return redirect('/index/') else: return HttpResponse('FAIL!')
如上的login视图函数中,当用户为qqq,密码为123时,跳转到index页面。这就是重定向。
有人问,我们直接render到index.html页面不一样么?如下图
def index(request): shangping_list = ['苹果', '香蕉', '西瓜'] name = 'qqq' return render(request, 'index.html', {'sp': shangping_list, 'name': name}) def login(request): if request.method == 'GET': return render(request, 'login.html') else: user = request.POST.get('user') pwd = request.POST.get('pwd') if user =='qqq' and pwd == '123': return render(request, 'index.html')else: return HttpResponse('FAIL!')
答案是不一样的,比如index视图函数对页面进行渲染的时候,我们直接render(request, 'index.html')是获取不到渲染的,而且跳转后路由不会发生改变,所以当用户刷新当前页面的时候,会回到之前的登录页面,而不是index页面,很显然是不符合需求的。所以需要重定向来满足我们的需求。