• Django之视图函数总结


    Django之视图函数总结

    HttpRequest与HttpResponse

    http请求中产生两个核心对象:

    HttpRequest对象:用户请求相关的所有信息(对象)

    HttpResponse对象:响应字符串

    HttpRequest对象的属性和方法:

    request.path       # 获取访问文件路径
    
    request.method   #获取请求中使用的HTTP方式(POST/GET)
    
    request.body      #含所有请求体信息 是bytes类型
    
    request.GET        #GET请求的数据(类字典对象)  请求头中的url中?后面拿值
    request.POST     # POST请求的数据(类字典对象) 请求体里拿值
    
    request.COOKIES     #包含所有cookies的标准Python字典对象;keys和values都是字符串。
    
    request.FILES:      包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中
                     name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:
    
                     filename:      上传文件名,用字符串表示
                     content_type:   上传文件的Content Type
                     content:       上传文件的原始内容
    
    
    request.user:       是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前
                     没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
                     可以通过user的is_authenticated()方法来辨别用户是否登陆:
                     if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
                     时该属性才可用
    
    request.session:      唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用
    
    request.GET.get('name')    拿到GET请求里name的值
    
    如果某个键对应有多个值,则不能直接用get取值,需要用getlist,如:
    
    request.POST.getlist("hobby")
    
    
    请求url:http://127.0.0.1:8000/index.html/23?a=1
    
    request.path : 请求路径       
           request.path结果为:/index.html/23
    
    request.get_full_path()
           request.get_full_path()结果为:/index.html/23?a=1

    键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:
    request.POST.getlist("hobby")

      

      

    HttpResponse对象的属性和方法:

    对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象。
    HttpResponse类在django.http.HttpResponse
    
    在HttpResponse对象上扩展的常用方法:
    
    页面渲染:(返回一个页面)
    render()(推荐)
    render_to_response()
    
    页面跳转:()
    redirect("路径")

    locals():可以直接将函数中所有的变量传给模板

      

    render 函数

    render方法主要是将从服务器提取的数据,填充到模板中,然后将渲染后的html静态文件返回给浏览器,这里一定要注意:render渲染的是模板。

    render方法的作用:将指定页面渲染后返回给浏览器。

    数据主要有两部分:

    给定的模板:html文件

    给定的上下文字典:需要填充到html文件的变量

     

    render()的格式:

    render(request, template_name[, context])
    
    参数:
         request: 用于生成响应的请求对象。
    
         template_name:要使用的模板的完整名称,可选的参数
    
         context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
    
         content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。
    
         status:响应的状态码。默认为200。
    

     

    使用示例 

    urls.py

    from django.contrib import admin
    from django.urls import path
    from blog import  views
    
    
    
    urlpatterns = [
    path('show_time/',views.show_time),
    ]
    View Code

    view.py

    from django.shortcuts import render,HttpResponse
    import time
    
    def show_time(req):
        t=time.ctime()
        return render(req,"index.html",{"time":t})
    View Code

    html文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>Now {{ time }}</h1>
    </body>
    </html>
    View Code

    巧用locals()

    我们可以把变量填充给html文件,如果变量很多,我们在键值对后面添加就会很麻烦。

    所以我们把所有变量都封装到locals下,包括request下的属性!!!

    注意:在html文件中,使用的变量名必须和view.py文件下的对应视图函数里面的变量名相同才能使用。

    现在修改view.py文件下,

    retuen render(req,"index.html",{"time":t})
    

      

    return render(req,"index.html",locals())
    

      

    redirect 函数

    参数可以是:
    
    一个模型:将调用模型的get_absolute_url() 函数
    一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
    一个绝对的或相对的URL,将原封不动的作为重定向的位置。
    默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。
    

      

    传递一个对象
    将调用get_absolute_url() 方法来获取重定向的URL:
    from django.shortcuts import redirect
    def my_view(request):
        ...
        object = MyModel.objects.get(...)
        return redirect(object)


    传递一个视图的名称 可以带有位置参数和关键字参数;将使用reverse() 方法反向解析URL:  def my_view(request): ... return redirect('some-view-name', foo='bar')


    传递要重定向的一个硬编码的URL def my_view(request): ... return redirect('/some/url/')

    也可以是一个完整的URL: def my_view(request): ... return redirect('http://example.com/')

    默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向: def my_view(request): ... object = MyModel.objects.get(...) return redirect(object, permanent=True) 

      

    跳转应用

    register.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <form action="http://127.0.0.1:8080/register.html/" method="get" >
    <p>文本框:<input type="text" name="username" placeholder="姓名"></p>
    <p>密码框:<input type="password" name="passwd" placeholder=" 密码"></p>
    <p>单选框:男<input type="radio" name="gender" value="men">女<input type="radio" name="gender" value="women"></p>
    <p>复选框:音乐<input type="checkbox" name="hobby" value="music">电影<input type="checkbox" name="hobby" value="movice"></p>
    <p>下拉输入项:
    <select name="生日">
        <option value="1991">1991</option>
        <option value="1992">1992</option>
        <option value="1993">1993</option>
    </select>
    </p>
    <p>提交按钮:<input type="submit"></p>
    <p>重置按钮:<input type="reset"></p>
    
    </form>
    </body>
    </html>
    View Code

    login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form>
        <p>用户名:<input type="text"></p>
        <p>密码:<input type="password"></p>
        <p><input type="submit" value="登陆"></p>
    </form>
    </body>
    </html>
    View Code

    urls.py

    from django.contrib import admin
    from django.urls import path
    from blog import  views
    
    
    
    urlpatterns = [
        path("register.html/",views.register),
        path("login/",views.login),
    ]
    View Code

    view.py

    from django.shortcuts import render,HttpResponse,redirect
    
    def register(req):
        user=req.GET.get('username')
        if user=="admin":
            return redirect("/login/")
        return render(req,"register.html")
    
    def login(req):
        return render(req,"login.html")
    View Code

    现在访问http://127.0.0.1:8080/register.html

    提交成功后进行判读

    如果用户为admin

    则跳转到http://127.0.0.1:8080/login/

    如果用户名不为admin

    则重新返回这个页面

     

    第一,render返回一个登陆成功后的页面,刷新该页面将回复到跳转前页面。而redirect则不会.
    
    第二,如果页面需要模板语言渲染,需要的将数据库的数据加载到html,那么render方法则不会显示这一部分,render返回一个登陆成功页面,不会经过url路由分发系统,
    也就是说,不会执行跳转后url的视图函数。这样,返回的页面渲染不成功;而redirect是跳转到指定页面,当登陆成功后,会在url路由系统进行匹配,如果有存在的映射
    函数,就会执行对应的映射函数。

      

  • 相关阅读:
    MySQL教程详解之存储引擎介绍及默认引擎设置
    最简单MySQL教程详解(基础篇)之多表联合查询
    Postfix常用命令和邮件队列管理(queue)
    备份数据库
    Docker基本命令
    ASCII码表
    mysql基本了解
    顺序对列,环形队列,反向链式栈
    进制的标识符
    多个线程的时间同步
  • 原文地址:https://www.cnblogs.com/-wenli/p/10401746.html
Copyright © 2020-2023  润新知