• Django 的视图层


    什么是视图:

    之前我们也了解了urls路由 那么路由的主要作用是决定你下一步走哪个视图函数 ,视图就是用来存放一个个的函数的python文件,主要存储的函数就是你Django主要的流程的控制 都存放在一起就称这个文件为视图views

    视图层之视图函数(views):

    一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你的Python目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为views.py的文件中。

    一个简单的视图函数

    -----views.py

    from django.shortcuts import render,HttpResponse
    from django.urls import reverse
    import time
    # Create your views here.
    def timer(request):  #request这个参数必须有 因为你的url路由分配的时候会默认将请求信息传递进来request就是接受所有的请求信息的
        ctime = time.time()#时间戳
        s = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(ctime))
        # return HttpResponse()  #HttpResponse 的里面放置的必须是字符串
        return render(request,'time.html',{'t':s})

    注意:视图会返回一个HttpResponse对象,其中包含生成的响应。每个视图函数都负责返回一个HttpResponse对象。

     

    让我们逐行阅读上面的代码:

    • 首先,我们从 django.shortcuts模块导入了HttpResponse类,以及Python的datetime库。

    • 接着,我们定义了timer函数。它就是视图函数。每个视图函数都使用HttpRequest对象作为第一个参数,并且通常称之为request

      注意,视图函数的名称并不重要;不需要用一个统一的命名方式来命名,以便让Django识别它。我们将其命名为timer,是因为这个名称能够精确地反映出它的功能。

    • 这个视图会返回一个HttpResponse对象,其中包含生成的响应。每个视图函数都负责返回一个HttpResponse对象。

    HttpRequest对象

    属性:

    '''
    path:       请求页面的全路径,不包括域名
    
    method:     请求中使用的HTTP方法的字符串表示。全大写表示。例如
    
                   if  req.method=="GET":
    
                             do_something()
    
                   elif req.method=="POST":
    
                             do_something_else()
    
    GET:         包含所有HTTP GET参数的类字典对象
    
    POST:       包含所有HTTP POST参数的类字典对象
    
    COOKIES:     包含所有cookies的标准Python字典对象;keys和values都是字符串。
    
    FILES:      包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中
                 name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:
    
                 filename:      上传文件名,用字符串表示
                 content_type:   上传文件的Content Type
                 content:       上传文件的原始内容
    
    
    user:       是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前
                 没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
                 可以通过user的is_authenticated()方法来辨别用户是否登陆:
                 if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
                 时该属性才可用
    
    session:    唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。
    
    '''

    HttpResponse对象:

    响应对象主要有三种形式:

    • HttpResponse()
    • render()
    • redirect()

    HttpResponse()括号内直接跟一个具体的字符串作为响应体,比较直接很简单,所以这里主要介绍后面两种形式。

    render()

    1
    2
    3
    render(request, template_name[, context])
     
    结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
    参数:
         request: 用于生成响应的请求对象。
    
         template_name:要使用的模板的完整名称,可选的参数
    
         context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。

    render方法就是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。
    render 是直接找到这个页面 不用再次经过urls
     
     
       print(request.method)  # 请求方式
        print(request.path)    # 这次请求路径
        print(request.GET)     # GET请求的请求数据   QueryDict  {}
        print(request.POST)    # POST请求的请求数据  QueryDict  {}
        print(request.get_full_path()) # 包含GET请求参数的请求路径
        print(request.is_ajax()) # 返回布尔值
     
     

    redirect()

    是重定向

    def login(request):
        print('111')
        if request.method == 'POST':
              user = request.POST.get('user')
              pwd = request.POST.get('pwd')
              if user == '老王' and pwd == '123':
                  return redirect('/index/')  #如果条件满足直接定向到index这函数内执行views内的index
        return render(request,'login.html')

    render 和 redirect 的区别:

    render 是直接找到这个页面 不用再次经过urls
    而 redirect 需要再次经历一次urls render 是一次响应 redirect 是再相浏览器访问然后再次经历一次urls 所以这个区别还是很区别的
     

    render函数和redirect函数的区别

    render:只会返回页面内容,但是未发送第二次请求

    redirect:发挥了第二次请求,url更新

    具体实例说明

    render:

    redirect:

     
     

     重定向就是在这个网站找不到信息了 定向到另一个网站去找信息

     

  • 相关阅读:
    HDU 5444 Elven Postman (2015 ACM/ICPC Asia Regional Changchun Online)
    POJ 1577 Falling Leaves 二叉搜索树
    HDU 3791 二叉搜索树
    Problem: Godfather 树的重心
    Problem: [Poi0202]Travelling Salesman 最近公共祖先
    Problem: 最优连通子集
    Problem: 扫雪系列II
    Problem: 扫雪系列I
    Problem: [Ural1039]没有上司的晚会
    Problem: 八中教室的灯
  • 原文地址:https://www.cnblogs.com/zhaoyunlong/p/9224886.html
Copyright © 2020-2023  润新知