Django 视图(View)

1. 视图简介

  • 视图负责接收 web 请求并返回 web 响应。
  • 视图就是一个 python 函数,被定义在 views.py 中。
  • 响应可以是一张网页的 HTML 内容、一个重定向、一个 404 错误等等。

响应处理过程如下图:

  1. 用户在浏览器中输入网址:www.demo.com/1/100
  2. Django 获取网址信息,去除域名和端口后剩下 URI:1/100
  3. 按照 urlconf 中正则的配置顺序逐一匹配,一旦匹配成功,则调用对应的视图函数
  4. 调用对应的视图函数,接收 request 对象(及正则中获取的值),处理并返回 response 对象

 

2. URLconf

在项目目录下的 settings.py 中通过 ROOT_URLCONF 指定根级 url 的配置:

ROOT_URLCONF = 'ViewDemo.urls'

项目目录下的 urls.py 中的 urlpatterns 是一个包含 url() 实例的列表。一个 url() 对象包括:

  • 正则表达式
  • 视图函数
  • 名称 name

 

1)关联各应用下的 URLconf

应用中创建 urls.py,定义本应用中的 urlconf。如 hero_info 应用目录下的 urls.py:

urlpatterns = [url(r'^$', views.index, name='index'),  # 正则匹配成功时访问index函数url(r'^([0-9]+)/$', views.detail, name='detail'),  # 正则匹配成功时访问detail函数
]

再在项目的 urls.py 中使用 include() 关联对应应用的 urls.py:

urlpatterns = [url(r'^admin/', include(admin.site.urls)),url(r'^hero_info/', include('hero_book.urls', namespace='hero_info')),  # 关联hero_book包下的urls.py
]

使用 include 可以去除 urlconf 的冗余。

注意:django 2.0 起,urls 不支持正则表达式问题。如果需要使用正则,需要导入 re_path:

from django.urls import path, re_pathurlpatterns = [path('admin/', admin.site.urls),re_path(r'^test-(\d+)-(\d+)/', views.test),path('index/', views.index),
]

匹配过程

解析 web 请求地址时,先与主 URLconf 匹配,成功后再用剩余的部分与应用中的 URLconf 匹配。如下示例:

  1. 请求 http://www.demo.cn/hero_info/1/
  2. 匹配部分是 /hero_info/1/
  3. 在 settings.py 中与“hero_info/”匹配成功,再用“1/”与 hero_info 应用的 urls 匹配成功

 

2)URLconf 的编写

  • url 的正则表达式不需要添加一个前导的反斜杠,如应该写作'hero_info/',而不应该写作'/hero_info/'。
  • 每个正则表达式前面的 r 表示字符串不转义。
  • 请求的 url 被看做是一个普通的 python 字符串,进行匹配时不包括 get 或 post 请求的参数及域名。
http://www.itcast.cn/python/1/?i=1&p=new  # 只匹配“/python/1/”部分
  • 若要从 url 中捕获一个值,则要使用正则中的分组。
    • 优先使用命名参数,如果没有命名参数则使用位置参数。
    • 每个捕获的参数都作为一个普通的 python 字符串传递给视图。
url(r'^([0-9]+)/$', views.detail, name='detail')  # 通过位置参数传递给视图
url(r'^(?P<id>[0-9]+)/$', views.detail, name='detail')  # 通过分组名称传递参数给视图函数,本例的参数名称为id

 

3)namespace 反向解析

在 include 中通过 namespace 定义命名空间,用于反向解析。

URL 的反向解析

问题:如果在视图、模板中使用硬编码的链接,在 urlconf 发生改变时,维护是一件非常麻烦的事情。

解决:在做链接时,通过指向 urlconf 中的 namespace 名称,动态生成链接地址。

  • 视图:使用 django.core.urlresolvers.reverse() 函数。
  • 模板:使用 url 模板标签。

 

3. 视图函数&错误视图

视图本质就是一个函数。在应用目录下默认有 views.py 文件,一般视图都定义在这个文件中。

视图的参数:

  • 一个 HttpRequest 实例
  • 通过正则表达式分组获取的位置参数或关键字参数

如果处理功能过多,可以将函数定义到不同的 py 文件中(但不建议)。示例:

# 新建views1.py
from django.http import HttpResponsedef index(request):return HttpResponse("你好")# 在urls.py中修改配置
from . import views1
url(r'^$', views1.index, name='index'),

错误视图

Django 原生自带了几个默认视图用于处理 HTTP 错误。

404 (page not found) 视图

  • 默认的 404 视图将传递一个变量 request_path 给模板,它是导致错误的 url。
  • 如果Django在检测URLconf中的每个正则表达式后没有找到匹配的内容时,将调用 404 视图。
  • 如果在 settings.py 中 DEBUG 设置为 True,那么将永远不会调用 404 视图,而是显示 URLconf。 并带有一些调试信息。

1)在 templates 中创建 404.html:

2)编写 404.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
{{request_path}}
<h1>Oops!该网页不存在..</h1>
</body>
</html>

3)在 settings.py 中修改两个配置:

DEBUG = False  # 取消调试状态
ALLOWED_HOSTS = ['*', ]  # 允许所有主机访问

4)访问不存在的地址:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90721.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS基础概念

一、OpenHarmony、HarmonyOS和Harmony NEXT区别OpenHarmony是由开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;孵化及运营的开源项目&#xff0c;开放原子开源基金会由华为、阿里、腾讯、百度、浪潮、招商银行、360等十家互联网企业共同发起组建。目标是面向全…

spark3 streaming 读kafka写es

1. 代码 package data_import import org.apache.spark.sql.{DataFrame, Row, SparkSession, SaveMode} import org.apache.spark.sql.types.{ArrayType, DoubleType, LongType, StringType, StructField, StructType, TimestampType} import org.apache.spark.sql.functions._…

【跟着PMP学习项目管理】每日一练 - 3

1、你是一个建筑项目的项目经理。电工已经开始铺设路线,此时客户带着一个变更请求来找你。他需要增加插座,你认为这会增加相关工作的成本。你要做的第一件事? A、拒绝做出变更,因为这会增加项目的成本并超出预算 B、参考项目管理计划,查看是否应当处理这个变更 C、查阅…

CentOS 安装 JDK+ NGINX+ Tomcat + Redis + MySQL搭建项目环境

目录第一步&#xff1a;安装JDK 1.8方法 1&#xff1a;安装 Oracle JDK 1.8方法 2&#xff1a;安装 OpenJDK 1.8第二步&#xff1a;使用yum安装NGINX第三步&#xff1a;安装Tomcat第四步&#xff1a;安装Redis第五步&#xff1a;安装MySQL第六步&#xff1a;MySQL版本兼容性问题…

如何设计一个登录管理系统:单点登录系统架构设计

关键词&#xff1a;如何设计一个登录管理系统、登录系统架构、用户认证、系统安全设计 &#x1f4cb; 目录 开篇&#xff1a;为什么登录系统这么重要&#xff1f;整体架构设计核心功能模块安全设计要点技术实现细节性能优化策略总结与展望 开篇&#xff1a;为什么登录系统这么…

论迹不论心

2025年7月11日&#xff0c;16~26℃&#xff0c;阴 紧急不紧急重要 备考ing 备课不重要 遇见&#xff1a;免费人格测试 | 16Personalities&#xff0c;下面是我的结果 INFJ分析与优化建议 User: Anonymous (隐藏) Created: 2025/7/11 23:38 Updated: 2025/7/11 23:43 Exported:…

【面板数据】省级泰尔指数及城乡收入差距测算(1990-2024年)

对中国各地区1990-2024年的泰尔指数、城乡收入差距进行测算。本文参考龙海明等&#xff08;2015&#xff09;&#xff0c;程名望、张家平&#xff08;2019&#xff09;的做法&#xff0c;采用泰尔指数测算城乡收入差距。参考陈斌开、林毅夫&#xff08;2013&#xff09;的做法&…

http get和http post的区别

HTTP GET 和 HTTP POST 是两种最常用的 HTTP 请求方法&#xff0c;它们在用途、数据传输方式、安全性等方面存在显著差异。以下是它们的主要区别&#xff1a;1. 用途GET&#xff1a;主要用于请求从服务器获取资源&#xff0c;比如获取网页内容、查询数据库等。GET 请求不应该用…

I2C集成电路总线

&#xff08;摘要&#xff1a;空闲时&#xff0c;时钟线数据线都是高电平&#xff0c;主机发送数据前&#xff0c;要在时钟为高电平时&#xff0c;把数据线从高电平拉低&#xff0c;数据发送采取高位先行&#xff0c;时钟线低电平时可以修改数据线&#xff0c;时钟线高电平时要…

为了安全应该使用非root用户启动nginx

nginx基线安全&#xff0c;修复步骤。主要是由于使用了root用户启动nginx。为了安全应该使用非root用户启动nginx一、检查项和问题检查项分类检查项名称身份鉴别检查是否配置Nginx账号锁定策略。服务配置检查Nginx进程启动账号。服务配置Nginx后端服务指定的Header隐藏状态服务…

论文解析篇 | YOLOv12:以注意力机制为核心的实时目标检测算法

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。长期以来&#xff0c;改进YOLO框架的网络架构一直至关重要&#xff0c;但尽管注意力机制在建模能力方面已被证明具有优越性&#xff0c;相关改进仍主要集中在基于卷积神经网络&#xff08;CNN&#xff09;的方法上。这是因…

学习C++、QT---20(C++的常用的4种信号与槽、自定义信号与槽的讲解)

每日一言相信自己&#xff0c;你比想象中更接近成功&#xff0c;继续勇往直前吧&#xff01;那么我们开始用这4种方法进行信号与槽的通信第一种信号与槽的绑定方式我们将按键右键后转到槽会自动跳转到这个widget.h文件里面并自动生成了定义&#xff0c;我们要记住我们这个按钮叫…

Anolis OS 23 架构支持家族新成员:Anolis OS 23.3 版本及 RISC-V 预览版发布

自 Anolis OS 23 版本发布之始&#xff0c;龙蜥社区就一直致力于探索同源异构的发行版能力&#xff0c;从 Anolis OS 23.1 版本支持龙芯架构同源异构开始&#xff0c;社区就在持续不断地寻找更多的异构可能性。 RISC-V 作为开放、模块化、可扩展的指令集架构&#xff0c;正成为…

4万亿英伟达,凭什么?

CUDA正是英伟达所有神话的起点。它不是一个产品&#xff0c;而是一个生态系统。当越多的开发者使用CUDA&#xff0c;就会催生越多的基于CUDA的应用程序和框架&#xff1b;这些杀手级应用又会吸引更多的用户和开发者投身于CUDA生态。这个正向飞轮一旦转动起来&#xff0c;其产生…

Unity3D iOS闪退问题解决方案

前言 在Unity3D开发中解决iOS闪退问题需要系统性排查&#xff0c;以下是关键步骤和解决方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀&#xff01; 1. 获取崩溃日志&#xff08;关键第一步&#xff…

嵌入式八股文之 GPIO

1. GPIO 的基本概念(1) 什么是 GPIO&#xff1f;GPIO 的中文意思是通用输入输出端口&#xff08;General Purpose Input/Output&#xff09;&#xff0c;是嵌入式系统中可编程控制的通用引脚&#xff0c;可通过软件配置为输入或输出模式。&#xff08;背诵&#xff09;(2) 它的…

Umi-OCR 的 Docker安装(win制作镜像,Linux(Ubuntu Server 22.04)离线部署)

前置博客&#xff1a;Ubuntu-Server 22.04.4 详细安装图文教程 wget命令在windows终端下不能使用的原因及解决办法 在 Ubuntu 22.04 LTS 上离线安装 Docker 手把手教你在Win11下安装docker Umi-OCR 安装docker时报错&#xff1a;workstation服务启动报错。错误1075&#…

力扣242.有效的字母异位词

给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的 字母异位词。示例 1:输入: s "anagram", t "nagaram" 输出: true示例 2:输入: s "rat", t "car" 输出: false提示:1 < s.length, t.length < 5 * 104s…

基于Springboot+UniApp+Ai实现模拟面试小工具二:后端项目搭建

本节介绍本项目后端项目的开发工具及基础项目的搭建&#xff0c;包括开发工具介绍及后端项目的创建和依赖框架的引入及对应配置。 源码下载&#xff1a; 点击下载 讲解视频&#xff1a; UniappSpringbootKimi实现模拟面试小程序-Springboot项目创建一&#xff0e;开发工具 1.…

Linux711 Mysql

模版 root192.168.235.130s password:┌──────────────────────────────────────────────────────────────────────┐│ • MobaXterm Personal Edition v23.2 • ││…