Django5 实用指南(四)URL路由与视图函数
4.1 Django5的URL路由系统
Django 的 URL 路由系统是其核心组件之一,它负责将用户的 HTTP 请求(即 URL)映射到相应的视图函数上。每当用户在浏览器中访问某个 URL 时,Django 会根据项目的 URL 配置文件(urls.py)来匹配对应的视图函数,并调用它来处理请求。
Django 的 URL 路由支持模式匹配、动态路由以及带有参数的 URL,因此它非常强大和灵活。
4.1.1 URL路由的基础结构
在 Django 中,URL 路由配置通常位于 urls.py 文件中。这个文件定义了 URL 模式和它们对应的视图函数。
Django 通过 path() 和 re_path() 函数来配置 URL 路由。path() 是 Django 推荐的方式,它使用简洁的字符串匹配模式;而 re_path() 则使用正则表达式进行更复杂的匹配。
4.1.2 使用 path() 定义 URL 路由
path() 是 Django5 最常用的 URL 路由配置方法。它的基本用法如下:
from django.urls import path
from . import viewsurlpatterns = [path('home/', views.home, name='home'),path('about/', views.about, name='about'),
]
在上面的代码中,我们定义了两个 URL 路由:
- /home/ 映射到 views.home 视图函数。
- /about/ 映射到 views.about 视图函数。
4.1.3 路由参数
Django5 的路由系统支持动态参数,允许你在 URL 中包含动态值。例如,假设你要为用户的个人资料页面定义 URL,你可以通过如下方式实现:
urlpatterns = [path('profile/<int:user_id>/', views.profile, name='profile'),
]
此时,URL 中的 <int:user_id> 会被动态替换为实际的 user_id,并传递给视图函数 profile()。
在视图函数中,我们可以通过参数来访问这个 user_id:
from django.shortcuts import renderdef profile(request, user_id):# 这里的 user_id 就是从 URL 中提取的动态参数user = User.objects.get(id=user_id)return render(request, 'profile.html', {'user': user})
Django 支持多种类型的参数:
- <int>:用于提取整数类型的参数。
- <str>:用于提取字符串类型的参数。
- <slug>:用于提取由字母、数字、连字符等组成的字符串(如文章的 URL 标识符)。
4.1.4 使用 re_path() 定义 URL 路由
re_path() 允许你使用正则表达式来匹配更复杂的 URL 模式。它的基本语法与 path() 类似,但它允许你使用正则表达式进行灵活的匹配。
例如,以下代码演示了如何使用正则表达式匹配 URL:
from django.urls import re_path
from . import viewsurlpatterns = [re_path(r'^article/(?P<slug>[\w-]+)/$', views.article_detail, name='article_detail'),]
在这个示例中,(?P<slug>[\w-]+) 是一个正则表达式,表示 URL 中的 slug 参数可以是由字母、数字、下划线和连字符组成的字符串。Django 会将匹配到的 slug 传递给 article_detail 视图函数。
4.2 视图函数的使用
视图函数是 Django 的核心部分,它是处理用户请求并返回响应的地方。在 Django 中,视图函数接收 HTTP 请求,并返回一个 HTTP 响应。
4.2.1 基本视图函数
视图函数是普通的 Python 函数,接收一个 request 对象,并返回一个 HttpResponse 或其他响应对象。最常见的视图函数使用 render() 函数将数据传递给模板并返回一个渲染的页面。
基本视图函数示例:
from django.http import HttpResponse
from django.shortcuts import render# 简单的视图函数
def home(request):return HttpResponse("Welcome to the home page!")# 使用模板的视图函数
def about(request):return render(request, 'about.html')
在这个例子中,home() 视图函数直接返回了一个简单的文本响应,而 about() 视图函数则渲染了一个 HTML 模板并返回给用户。
4.2.2 使用上下文传递数据
视图函数不仅可以渲染模板,还可以向模板传递动态数据。你可以通过上下文字典将数据传递给模板,模板中可以使用这些数据来进行动态渲染。
视图函数传递数据示例:
def user_profile(request, user_id):user = User.objects.get(id=user_id)return render(request, 'user_profile.html', {'user': user})
在这个示例中,user_profile() 视图函数从数据库中获取了 user_id 对应的用户,并将用户数据传递给模板进行渲染。
4.2.3 视图函数中的重定向与反向解析
Django 提供了 HttpResponseRedirect 和 redirect() 方法来处理 URL 的重定向。重定向通常在用户提交表单后,将他们引导到另一个页面。
from django.shortcuts import redirectdef redirect_to_home(request):return redirect('home')
使用 redirect() 时,可以直接传入视图的名称(home)来实现反向解析,即根据视图名称自动生成 URL。
4.2.4 处理POST请求
Django的视图函数不仅可以处理GET请求,还可以处理POST请求。可以根据请求类型进行不同的处理。
处理POST请求的视图示例:
from django.shortcuts import render
from django.http import HttpResponsedef contact(request):if request.method == 'POST':name = request.POST.get('name')message = request.POST.get('message')# 这里可以进一步处理表单数据return HttpResponse(f"Thank you {name}, your message has been received!")return render(request, 'contact.html')
在这个示例中,当用户提交表单时,视图会接收POST请求并处理表单数据。
4.3 类视图(Class-Based Views)
Django 提供了基于类的视图(CBVs)来替代传统的函数视图(FBVs)。类视图通过继承 Django 提供的基类来组织视图逻辑,使得视图的代码更加模块化、可复用,并且更符合面向对象的编程范式。
4.3.1 基本的类视图
类视图通过继承 Django 的 View 类来定义。最常用的类视图包括 ListView、DetailView、CreateView 等,它们简化了常见的操作,如列出对象、显示详细信息、创建新对象等。
基本的类视图示例:
from django.http import HttpResponse
from django.views import Viewclass HomeView(View):def get(self, request):return HttpResponse("Welcome to the home page!")
在这个示例中,HomeView 继承了 View 类,并重写了 get() 方法来处理 GET 请求。
4.3.2 使用 TemplateView 渲染模板
Django 提供了 TemplateView 类视图来处理渲染模板的常见需求。
TemplateView 示例:
from django.views.generic import TemplateViewclass AboutView(TemplateView):template_name = 'about.html'
在这个例子中,AboutView 继承自 TemplateView,并指定了要渲染的模板。你可以通过 context 属性来传递动态数据。
4.3.3 使用 ListView 和 DetailView
Django 提供了很多通用类视图,例如 ListView 和 DetailView,用于列出对象和显示单个对象的详细信息。
ListView 示例:
from django.views.generic import ListView
from .models import Articleclass ArticleListView(ListView):model = Articletemplate_name = 'article_list.html'context_object_name = 'articles'
ListView 自动查询数据库中的所有 Article 对象,并将它们传递给模板。
DetailView 示例:
from django.views.generic import DetailView
from .models import Articleclass ArticleDetailView(DetailView):model = Articletemplate_name = 'article_detail.html'context_object_name = 'article'
DetailView 用于显示数据库中单个对象的详细信息。它会自动根据 URL 中的参数(通常是主键)来获取对象,并将其传递给模板。
小结
本章深入探讨了 Django5 的 URL 路由系统、视图函数以及类视图。通过 Django 的 URL 路由系统,你可以轻松地将 URL 与视图函数映射,并使用动态路由来处理不同类型的请求。视图函数是 Django 应用的核心,处理请求并返回响应。而类视图则提供了更加模块化和可复用的方式来组织视图逻辑。
在实际开发中,选择合适的视图类型和路由方式,有助于提高代码的可维护性和扩展性。后续章节将继续介绍如何在 Django 项目中深入应用这些概念。
相关文章:
Django5 实用指南(四)URL路由与视图函数
4.1 Django5的URL路由系统 Django 的 URL 路由系统是其核心组件之一,它负责将用户的 HTTP 请求(即 URL)映射到相应的视图函数上。每当用户在浏览器中访问某个 URL 时,Django 会根据项目的 URL 配置文件(urls.py&#…...
Android 14输入系统架构分析:图解源码从驱动层到应用层的完整传递链路
一、资料快车 1、深入了解Android输入系统:https://blog.csdn.net/innost/article/details/47660387 2、书籍 - Android系统源代码情景分析 二、Perface 1、参考: 2、系统程序分析方法 1)加入log,并跟着log一步步分析 -logc…...
Java中Map循环安全的删除数据的4中方法
文章目录 前言一、使用Iterator删除二、使用 removeIf(Java 8)三、遍历时记录需要删除的键(不推荐)四、使用 Stream(Java 8)总结 前言 在 Java 中,遍历 HashMap 并删除数据时,直接使…...
蓝桥杯(B组)-每日一题(1093字符逆序)
c中函数: reverse(首位置,尾位置) reverse(s.begin(),s.end()) 头文件:<algorithm> #include<iostream> #include<algorithm>//运用reverse函数的头文件 using namespace std; int main() {string s;//定义一…...
【数据分析】3 数据分析成长之路
职业发展路径: 向上发展(技术方向):可以详细说明成为数据科学家或专家所需的具体技能和步骤,包括学习的算法、工具等。向下发展(业务方向):可以探讨结合业务知识的具体领域ÿ…...
循环神经网络RNN原理与优化
目录 前言 RNN背景 RNN原理 上半部分:RNN结构及按时间线展开图 下半部分:RNN在不同时刻的网络连接和计算过程 LSTM RNN存在的问题 LSTM的结构与原理 数学表达层面 与RNN对比优势 应用场景拓展 从简易但严谨的代码来看RNN和LSTM RNN LSTM 前言 绕循环神经…...
Python正则表达式处理中日韩字符过滤全解析
Python正则表达式处理中日韩字符过滤全解析 一、核心原理:Unicode字符范围定位 中日韩字符在Unicode中的分布: 中文:\u4e00-\u9fff(基本区) \u3400-\u4dbf(扩展A区) \U00020000-\U0002a6df…...
Zabbix 7.2实操指南:基于OpenEuler系统安装Zabbix 7.2
原文出处:乐维社区 部署环境 openEuler 22.03 LTS PHP 8.0 Apache Mysql 8.0 MySQL数据库 6.0 以上版本需要安装mysql8.0以上版本的数据库(以mysql为例子)。 欧拉系统自带 mysql8.0 的源,无需要安装额外的源。 安装mysql …...
扩展阅读-Elasticsearch 通过索引阻塞实现数据保护深入解析
目录 前言 1、索引阻塞的种类 2、什么时候使用阻塞? 场景1:进行系统维护场景。 场景2:保护数据不被随意更改场景。 场景3:优化资源使用的场景。 场景4:遵守安全规则场景。 3、添加索引阻塞API 4、解除设置 AP…...
SpringMVC重定向接口,参数暴露在url中解决方案!RedirectAttributes
OK,首先描述下业务场景,终端数量限制登录 1.首先访问项目login的get接口 2.输入账号密码点击登录后,会请求login的POST接口 3.后台对终端数量逻辑处理不允许登录跳回到登录页面 4.因代码原因需在后台进行多次重定向接口,最后跳…...
硬件学习笔记--46 电能表影响量试验梳理
目录 1.电流和电压电路中的谐波影响试验 1)电流和电压电路中谐波——第5次谐波试验 2)电流和电压电路中谐波——方顶波波形试验 3)电流和电压电路中谐波——尖顶波波形试验 4)电流和电压电路中谐…...
大数据技术之HBase操作归纳
HBase基本命令总结表(实际操作方式) 进入Hbase:hbase shell 方式一:命令行窗口来操作HBase 1.通用性命令 version 版本信息 status 查看集群当前状态 whoami 查看登入者身份 help 帮助2.HBase DDL操作(对象级操作) 2.1、namespace命名空间(相当…...
后端Java Stream数据流的使用=>代替for循环
API讲解 对比 示例代码对比 for循环遍历 package cn.ryanfan.platformback.service.impl;import cn.ryanfan.platformback.entity.Algorithm; import cn.ryanfan.platformback.entity.AlgorithmCategory; import cn.ryanfan.platformback.entity.DTO.AlgorithmInfoDTO; im…...
遗传算法与深度学习实战系列,自动调优深度神经网络和机器学习的超参数
遗传算法与深度学习实战系列文章 目录 进化深度学习生命模拟及其应用生命模拟与进化论遗传算法中常用遗传算子遗传算法框架DEAPDEAP框架初体验使用遗传算法解决N皇后问题使用遗传算法解决旅行商问题使用遗传算法重建图像遗传编程详解与实现粒子群优化详解与实现协同进化详解与…...
体验用ai做了个python小游戏
体验用ai做了个python小游戏 写在前面使用的工具2.增加功能1.要求增加视频作为背景。2.我让增加了一个欢迎页面。3.我发现中文显示有问题。4.我提出了背景修改意见,欢迎页面和结束页面背景是视频,游戏页面背景是静态图片。5.提出增加更多游戏元素。 总结…...
谷粒商城—分布式高级②.md
认证服务 1. 环境搭建 创建gulimall-auth-server模块,导依赖,引入login.html和reg.html,并把静态资源放到nginx的static目录下 2. 注册功能 (1) 验证码倒计时 //点击发送验证码按钮触发下面函数 $("#sendCode").click(function () {//如果有disabled,说明最近…...
阿里云ECS命名规则解析与规格选型实战指南
阿里云ECS实例的命名规则通常采用 “ecs.{实例族}.{规格大小}” 的结构,各部分含义如下: 命名字段说明ecs代表“弹性计算服务”(Elastic Compute Service)。{实例族}标识实例的用途和代次(如 g7、c7、r7),由字母+数字组成。{规格大小}表示实例的资源配置(如 large、2xl…...
Spring MVC 的核心以及执行流程
Spring MVC的核心 Spring MVC是Spring框架中的一个重要模块,它采用了经典的MVC(Model-View-Controller)设计模式。 MVC是一种软件架构的思想,它将软件按照模型(Model)、视图(View)…...
ai json处理提示词
在解析JSON数据时,提示词的设计需要明确任务目标、输入格式以及期望的输出格式。以下是一些常用的提示词示例,适用于不同的JSON解析场景: 1. 提取特定字段 用于从JSON中提取特定字段的值。 示例: 从以下JSON数据中提…...
2025开源数据工程全景图
作者 | Alireza Sadeghi 译自Practical Data Engineering 2025年开源数据工程领域呈现蓬勃创新与生态重构的双重态势,九大技术赛道在实时化、轻量化与云原生架构驱动下加速演进。一份来自外网的2025年开源数据工程全景图全面地展示了这一领域的发展态势与走向&…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...
