zoukankan      html  css  js  c++  java
  • 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:

     
     

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

     

  • 相关阅读:
    learning scala view collection
    scala
    learning scala dependency injection
    learning scala implicit class
    learning scala type alise
    learning scala PartialFunction
    learning scala Function Recursive Tail Call
    learning scala Function Composition andThen
    System.Threading.Interlocked.CompareChange使用
    System.Threading.Monitor的使用
  • 原文地址:https://www.cnblogs.com/zhaoyunlong/p/9224886.html
Copyright © 2011-2022 走看看