首页 > 其他分享 >05. 视图

05. 视图

时间:2023-11-18 17:11:50浏览次数:31  
标签:views app 05 request 视图 import login

一、什么是视图函数

  视图函数,简称视图,是一个 Python 函数,它接收 Web 请求并返回 Web 响应。响应可以是一个 HTML 文件、一个重定向、一个 404 错误、一个 XML 文档、或者一张图片等等,它可以是任何东西。无论视图本身包含什么逻辑,都要返回响应。逻辑处理代码写在哪里都可以,只要它在 Django 项目的文件夹下就可以。一般,我们都将视图函数放在项目或者应用程序目录中的名为 views.py 文件中。

二、创建简易Django项目

  用户通过在浏览器中输入 URL 和单击链接来请求网页,因此需要确定项目需要哪些 URL。我们新建一个 Django 项目,并在项目的主文件夹 Django 中的文件 urls.py 中添加要请求的路径:

from django.contrib import admin
from django.urls import path, re_path, include

urlpatterns = [
    # 路由配置:路径 ---> 视图函数
    path('admin/', admin.site.urls),

    # 路由分发
    re_path(r"^app/", include(("app.urls", "app"))),
]

  在 app 应用中新建一个 urls.py 文件:

from django.urls import re_path

from app import views

urlpatterns = [
    # 路由配置:路径 ---> 视图函数
    # 这里URL使用正则表达式,^表示开头匹配,$表示结尾匹配
    re_path(r"login/", views.login, name="login"),
]

  视图函数接受请求的信息,准备好生成网页所需要的数据,再将这些数据发给浏览器。我们再新建一个应用程序,并在 app 文件夹中的文件 views.py 中添加视图函数:

from django.shortcuts import render

# Create your views here.
def login(request):
    return render(request, "app/login.html")

  模板定义网页的外观。每当网页被请求时,Django 都将填入相关的数据。模板让你能够访问视图提供的任何数据。我们在 templates 文件夹中 app 文件夹,专门用于存放 app 应用的模板。然后,我们在 app 文件夹下新建一个 login.html 文件,内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <!--
        method="get" 发送get请求
        method="post" 发送post请求
        如果action什么都不写,会把form表单所在的URL作为路径访问
        如果不加IP和端口,会用form表单所在的URL的IP和端口
    -->
    {# {% url 'namespace:name' %} 反向解析 #}
    <form method="post" action="{% url 'app:login' %}">
        用户名:<input type="text" name="user"><br>
        密 码:<input type="password" name="pwd"><br>
        <input type="submit">
    </form>
</body>
</html>

  我们在浏览器地址栏中输入 http://localhost:8000/app/login/ 访问页面。

简易的Django项目

  我们还要把 Django 项目下的 settings.py 文件下的 MIDDLEWARE 列表下的 'django.middleware.csrf.CsrfViewMiddleware' 注释掉,否则点击表单提交的时候,浏览器会返回 Forbidden (403) 页面。

csrf

Forbidden

三、请求对象

  修改 app 应用中 views.py 文件:

def login(request):

    print("method: ", request.method)               # 请求方式

    if request.method == "GET":
        print("GET: ", request.GET)                 # 存储所有GET请求信息
        user = request.GET.get("user")              # 获取GET请求中的信息
        pwd = request.GET.get("pwd")
        print("user: ", user)
        print("pwd: ", pwd)
    else:
        print(request.POST)                         # 存储所有POST请求信息
        user = request.POST.get("user")             # 获取POST请求中的信息
        pwd = request.POST.get("pwd")
        print("name: ", pwd)
        print("age: ", pwd)

    """
        get请求的url:rl: 协议://IP:port/路径?参数名=参数值&参数名=参数值
        post请求的url: 协议://IP:port/路径
    """
    print("path: ", request.path)
    print("full path:", request.get_full_path())    # 将路径和GET请求的参数都打印出来

    return render(request, "app/login.html")

四、响应对象

【1】、HttpResponse 对象

  修改 app 应用中 views.py 文件:

from django.shortcuts import HttpResponse

# Create your views here.
def login(request):
    return HttpResponse("<h1>OK</h1>")

【2】、render() 方法

  修改 app 应用中 views.py 文件:

from django.shortcuts import render

# Create your views here.
def login(request):
    import time

    ctime = time.time()

    return render(request, "app/login.html", {"ctime": ctime})

  在创建使用数据的网页时,调用了 render() 函数,,并向它传递 请求对象、要使用的 模板字典上下文

  修改 templates 文件夹下的 app 文件夹中 login.html 文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <!--
        method="get" 发送get请求
        method="post" 发送post请求
        如果action什么都不写,会把form表单所在的URL作为路径访问
        如果不加IP和端口,会用form表单所在的URL的IP和端口
    -->
    {# {% url 'namespace:name' %} 反向解析 #}
    <form method="post" action="{% url 'app:login' %}">
        用户名:<input type="text" name="user"><br>
        密 码:<input type="password" name="pwd"><br>
        <input type="submit">
    </form>
  
    <p>{{ ctime }}</p>
</body>
</html>

  模板接受视图函数发过来的字典上下文对象,以便能够使用视图函数提供的数据。要在模板中打印数据,需要将变量名用双花括号括起来。这些花括号不会出现在网页中,只是告诉 Django,我们使用了一个模板变量。

【3】、redirect() 方法

from django.shortcuts import redirect

# Create your views here.
def login(request):
    import time

    ctime = time.time()

    return redirect("https://www.baidu.com", {"ctime": ctime})

  redirect() 函数要求提供两个参数:要重定向到的视图,以及 要给视图函数提供的参数

五、类视图

  使用类视图,我们可以将视图对应的不同请求方式以类中不同方法来区别。类视图相对于函数视图有更高的复用性。如果其它地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可。

  修改 app 应用下的 urls.py 文件,添加路由,配置路由时,使用类视图的 as_view() 方法添加。

from django.urls import  re_path

from app import views

urlpatterns = [
    # 路由配置:路径 ---> 视图函数
    # 这里URL使用正则表达式,^表示开头匹配,$表示结尾匹配
    # 使用类视图的 as_view() 方法添加路由
    re_path(r"login/", views.LoginView.as_view(), name="login"),
]

  修改 app 应用下的 views.py 文件中添加如下内容。

from django.shortcuts import render, HttpResponse, redirect
from django.views import View

# Create your views here.
class LoginView(View):
    def get(self, request):
        """处理GET请求"""
        import time
        return render(request, "app/login.html", {"ctime": time.time()})

    def post(self, request):
        """处理POST请求"""
        return HttpResponse("OK")

标签:views,app,05,request,视图,import,login
From: https://www.cnblogs.com/kurome/p/17840754.html

相关文章

  • P1605 迷宫
    题目描述给定一个\(N\timesM\)方格的迷宫,迷宫里有\(T\)处障碍,障碍处不可通过。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。输入格式第一行为三......
  • 06_二叉树的右视图
    二叉树的右视图给定一个二叉树的根节点root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例1:输入:[1,2,3,null,5,null,4]输出:[1,3,4]示例2:输入:[1,null,3]输出:[1,3]示例3:输入:[]输出:[]提示:二叉树的节点个数的范......
  • 安装 IIS 访问临时文件夹 C:\WINDOWS\TEMP\3C 读取/写入权限 错误: 0x80070005
    在windows中使用命令行方式安装IIS(Web服务器)WindowsServer2022安装IIS报错访问临时文件夹C:\WINDOWS\TEMP\3C读取/写入权限错误:0x80070005,可以使用命令行方式来安装和配置Web服务(IIS)。以下是使用DeploymentImageServicingandManagement(DISM)工具的步骤:1.打......
  • Websphere - WSVR0605W 错误
    官方连接:https://www.ibm.com/support/pages/wsvr0605w-thread-may-be-hung-message-logsWSVR0605W-"Threadmaybehung"messageinthelogsTroubleshootingProblemAWSVR0605WmessageintheSystemOut.logmightbemisleadingbecausethismessagenorma......
  • Java数组05:数组的使用
    publicclassArrayDemo03{publicstaticvoidmain(String[]args){int[]arrays={1,2,3,4,5};//打印全部的数组元素for(inti=0;i<arrays.length;i++){System.out.println(arrays[i]);}System.out.pr......
  • OpenWRT/iStoreOS 不重头编译内核安装4G LTE网卡 Quectel EM05-CE记录
    我的机器是x86装了iStoreOS,有4G网卡QuectelEM05https://www.quectel.com/cn/product/lte-em05主要参考资料如下https://www.youtube.com/watch?v=DRddwfZ_TBYhttps://openwrt.org/docs/guide-user/network/wan/wwan/ltedonglehttps://zsien.cn/openwrt-ltedongle/按照视......
  • Windows server 2012/2016安装SQL Server 2005和SP4补丁
    sqlserver2005安装包sqlserver2005SP4补丁包(非常难找,留作备用)链接:https://pan.baidu.com/s/1j5OOX-iV8gLrmSNqNLE-kg提取码:jvtr复制这段内容后打开百度网盘手机App,操作更方便哦 背景:在windowsserver2012/2016x64安装sqlserver2005的时候会提示如下错误,无法启......
  • 500mA 线性锂电充电芯片 DP4054/DP4054H完全兼容替代TP4054
    锂电池工作原理锂电池是一种新型的可充电电池,其具有体积小、重量轻、容量大耐用性强等特点,因此被广泛应用于手机、笔记本电脑、移动电源等电了设备上。充电原理是指电池在充电过程中,用电流将锂离子从外部电源输入电池,使其形成一个电荷差,实现充电。锂电池充电原理是采用化学反......
  • Java方法05:可变参数
     publicclassDemo03{publicstaticvoidmain(String[]args){Demo03demo03=newDemo03();demo03.test(1);//输出1}publicvoidtest(int...i){System.out.println(i[0]);}}publicclassDemo03{publics......
  • 服务器部署VS 2005/2008 ReportViewer,完美支持中文
     VS2005下ReportViewer的部署1.安装ReportViewer.exe,或者直接下载MicrosoftReportViewerRedistributable2005SP1(完全安装)安装。2.再去MS网站下载语言包(ReportViewerLP.exe),在服务器上安装就可以了。VS2008下ReportViewer的部署1.下载MicrosoftReportVie......