• Django(5)视图



    此文章参考菜鸟教程:Django 视图 | 菜鸟教程 (runoob.com)

    Django版本:

    >>> django.VERSION  
    (4, 1, 0, 'final', 0)
    
    • 1
    • 2

    PS:基于前几章的进度进行修改

    一、视图概述

    • 一个视图函数简称为视图,它是Python的一个函数,主要功能是接受Web请求并且返回Web响应,响应的请求可以是一个HTML页面、一个404错误页面、一个重定向页面、一个XML文档或者是一张图片

    • 无论视图本身包含什么逻辑,都需要返回响应,代码写在哪里都可以,只要是在Python目录下即可,一般来说都会放在项目的views.py文件中,前几章的testdb.py就是视图文件

    • 每个视图函数都负责返回一个HttpResponse对象,对象中包含生成的响应,而视图层中有两个重要的对象:

      请求对象HttpRequest

      响应对象HttpResponse

    二、请求对象HttpRequest

    • 请求对象HttpRequest简称Request对象,下面看几个常用的Request属性

    (1)GET

    • 数据类型是QueryDict,一个类似与字典的对象,包含了HTTP GET的所有参数
    • 有相同的键,旧把所有的值放到对应的列表里,取值格式为对象.方法,下面是实例:
    - 创建一个views.py文件,写入
    get():返回字符串,如果改建有多个值,那么会取出该建的最后一个值
    
    # -*- coding: utf-8 -*-
    from django.http import HttpResponse
    
    def test(request):
        name = request.GET.get("name")
        return HttpResponse('you name is : {}'.format(name))
    
    
    
    - 修改urls.py文件
    #-*- coding: utf-8 -*-
    from django.urls import path
    
    from . import views  #导入模块
    
    urlpatterns = [
        path('test/',views.test),   #指定方法
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 启动django
    python manage.py runserver 0.0.0.0:8000
    
    • 1
    • 访问127.0.0.1:8000/test,可以发现,因为没有传参,所以get()没有获取到值

    在这里插入图片描述

    • 现在进行传参,访问127.0.0.1:8000/test/?name=zhangsan,使用?添加传入参数
      在这里插入图片描述

    • 使用postman使用GET方式进行调用

    在这里插入图片描述

    (2)POST

    • 数据类型同样是QueryDict,包含了HTTP POST的所有参数,POST常用于form表单,form表单里的标签name属性对应参数的键,而value属性对应参数的值

    • 取值格式为对象.方法,下面是实例:

    - 修改views.py文件
    # -*- coding: utf-8 -*-
    from django.http import HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    
    @csrf_exempt
    def test(request):
        name = request.POST.get("name")
        return HttpResponse('you name is : {}'.format(name))
    
    - 注释:
    当采用客户端象 django 的服务器提交 post 请求时,会得到403,权限异常。这是因为 django 针对提交的请求有校验,所以需要在视图函数之前添加装饰器
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 使用postman使用POST方式进行调用

    在这里插入图片描述

    (3)body

    • 数据类型是二进制字节流,是原生请求体里的参数内容,在HTTP中主要作用于POST==(GET没有请求体)==
    • body在HTTP中不常用,而在处理非HTTP形式的报文时非常有用,例如:二进制图片、XML、Json等,下面来看实例:
    - 修改views.py文件
    # -*- coding: utf-8 -*-
    from django.http import HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    
    @csrf_exempt
    def test(request):
        name = request.body
        print(name)
        return HttpResponse('Test')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 访问IP:8000/test/,直接访问是GET方式

    在这里插入图片描述

    • 直接访问,查看终端输出
      在这里插入图片描述

    • 使用postman访问,传入name参数,查看终端输出

    在这里插入图片描述

    在这里插入图片描述

    • 可以看到输出了传入的name参数

    (4)path

    • 获取URL中的路径部分,数据类型是字符串,实例:
    - 修改views.py文件
    # -*- coding: utf-8 -*-
    from django.http import HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    
    @csrf_exempt
    def test(request):
        name = request.path
        print(name)
        return HttpResponse('Test')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 直接访问,查看终端,可以看到输出了资源路径

    在这里插入图片描述

    在这里插入图片描述

    • 使用postman访问,使用POST方式,查看终端

    在这里插入图片描述

    在这里插入图片描述

    (5)method

    • 获取当前的请求方式,数据类型是字符串,输出结果是大写的,实例:
    - 修改views.py文件
    # -*- coding: utf-8 -*-
    from django.http import HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    
    @csrf_exempt
    def test(request):
        name = request.method
        print(name)
        return HttpResponse('Test')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 同样使用两种方式访问测试,观察终端输出

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    三、响应对象HttpResponse

    • 响应对象主要有三种形式:
    1. HttpResponse()
    2. render()
    3. redirect()
    • 下面分别介绍三种形式

    (1)HttpResponse()

    • 返回文本,参数为字符串,字符串中添加文本内容,如果参数中含有HTML标签,也可以进行渲染,之前使用的基本都是此方式,实例:
    def runoob(request):
        return HttpResponse("菜鸟教程")
    
    • 1
    • 2

    在这里插入图片描述

    # -*- coding: utf-8 -*-
    from django.http import HttpResponse
    
    def test(request):
        return HttpResponse("Baidu")
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    (2)render()

    • 返回文本,需要指定参数,其中:

    render()方法参数:

    render(request, template_name, context=None, content_type=None, status=None, using=None)
    
    • 1
    • request:必要参数,浏览器向服务器发送的请求对象,包含用户信息、请求内容、请求方式等
    • template_name:必要参数,设置模板文件名,用于生成网页内容
    • context:对模板上下文即模板变量赋值,以字典格式表示,默认情况下是一个空字典
    • content_type:响应内容的数据格式,一般情况下使用默认值即可
    • status:HTTP状态码,默认是200
    • using:设置模板引擎,用于解析模板文件、生成网页内容等
    • 实例:
    # -*- coding: utf-8 -*-
    from django.http import HttpResponse
    from django.shortcuts import render
    
    def test(request):
        name = "Test"
        return render(request,"test.html",{"name":name})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 访问

    在这里插入图片描述

    (3)redirect()

    • 重定向,跳转新页面,参数为字符串,字符串中填写页面路径,一般适用于form表单提交后,跳转到新页面
    • 实例:
    - 修改urls.py路由文件
    #-*- coding: utf-8 -*-
    from django.urls import path
    
    from . import views
    
    urlpatterns = [
        path('test/',views.test),
        path('index/',views.index),  #添加新路径
    ]
    
    - 修改views.py
    # -*- coding: utf-8 -*-
    from django.http import HttpResponse
    from django.shortcuts import redirect
    
    def test(request):
        return redirect("/index/")  #跳转到index
    
    def index(request):   
        return HttpResponse("hello world!!")
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 访问,查看终端输出,可以看到跳转重定向

    在这里插入图片描述

    在这里插入图片描述

    注意:render和redirect是在HttpResponse的基础上进行了封装,具体为:

    render:底层返回的是HttpResponse对象

    redirect:底层继承的是HttpResponse对象
    终端输出,可以看到跳转重定向

  • 相关阅读:
    C++程序右移32位不执行
    k8s常用命令2
    leetcode 1207. Unique Number of Occurrences(出现次数的唯一性)
    Python trino执行hive insert overwrite不生效的问题
    云原生时代,让软件架构设计行云流水的奥秘
    TDengine 入门教程④——权限管理 | 用户增删改查,授权与撤销授权
    [附源码]java毕业设计婴幼儿玩具共享租售平台
    在Windows 10中开启FTP服务
    前后端分离 + 跨域 + 跨域的解决办法
    Scrapy知识系列:使用CrawlerProcess从外部运行多个spider时,运行脚本需要与scrapy.cfg在同级目录
  • 原文地址:https://blog.csdn.net/rzy1248873545/article/details/126729943