Django--视图views

Posted on 2019-09-23 00:10  麻世骞  阅读(113)  评论(0编辑  收藏  举报

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页面,很显然是不符合需求的。所以需要重定向来满足我们的需求。