当前位置: 首页 > news >正文

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.dtcms.com/a/274160.html

相关文章:

  • 指令重排序带来的多线程问题与volatile解决方案
  • Linux设备树(dts/dtsi/dtb、设备树概念,设备树解析,驱动匹配)
  • P1204 [USACO1.2] 挤牛奶Milking Cows
  • 如何设置直播间的观看门槛,让直播间安全有效地运行?
  • 云原生周刊:镜像兼容性
  • 假日流量红利:如何用ASO策略抢占季节性下载高峰?
  • 不同质押周期对代币价格稳定性的具体影响及数据支撑
  • MinIO文件存储服务工具详细使用指南
  • 和服腰封改造:3种解构主义造型的东方美学新解
  • 2025年亚太中文赛赛题浅析-助攻快速选题
  • 【氮化镓】100 V GaN晶体管在关态应力下的双退化
  • Spring Boot中请求参数读取方式
  • HTTP 请求方法详解:GET、POST、PUT、DELETE 等
  • Python中类静态方法:@classmethod/@staticmethod详解和实战示例
  • LeetCode 278. 第一个错误的版本
  • 基于生产者消费者模型的线程池【Linux操作系统】
  • mysql中的自增ID
  • 物联网-ESP8266
  • API、MCP Client、MCP Server、LLM之间的业务逻辑关系
  • 医疗预约系统中的录音与图片上传功能实现:Vue3+Uniapp 实战
  • 在线重装 Proxmox VE
  • Swift中SwiftyJSON使用详情
  • 墙裂推荐!McpStore库三行代码为Agent添加MCP能力
  • 业务建模如何让金融数字化转型 “轻” 装上
  • CentOS7环境安装包部署并配置MySQL5.7
  • 什么是proxy
  • 使用浏览器inspect调试wx小程序
  • 构建基于表单配置的 Jenkins 测试项目(接口、UI、APP、Jmeter)
  • 加速市场反馈,助力产品迭代升级​
  • 如何使用 Python 删除 Excel 中的行、列和单元格 – 详解