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

Django 路由层

1. 路由基础概念

  • URLconf (URL 配置):Django 的路由系统是基于 urls.py 文件定义的。
  • 路径匹配:通过模式匹配 URL,并将请求传递给对应的视图处理函数。
  • 命名路由:每个路由可以定义一个名称,用于反向解析。

2. 基本路由配置

示例 urls.py 文件

from django.urls import path
from . import viewsurlpatterns = [path('', views.home, name='home'),  # 根路径path('about/', views.about, name='about'),  # 静态路径path('article/<int:id>/', views.article_detail, name='article-detail'),  # 动态参数
]

# views.pyfrom django.http import HttpResponsedef home(request):return HttpResponse("Welcome to the Home page!")def about(request):return HttpResponse("This is the About page.")def article_detail(request, id):return HttpResponse(f"Article Detail for Article {id}")

  • path() 函数
    • 第一个参数:URL 模式。
    • 第二个参数:对应的视图函数。
    • 第三个参数(可选):name 用于反向解析。

3. 动态路由

动态路由允许在 URL 中传递参数。

示例

urlpatterns = [path('user/<int:user_id>/', views.user_profile, name='user-profile'),  # 整数参数path('post/<slug:slug>/', views.post_detail, name='post-detail'),      # 字符串参数path('date/<int:year>/<int:month>/', views.archive, name='archive'),   # 多参数
]

# views.py
from django.http import HttpResponsedef user_profile(request, user_id):return HttpResponse(f"User Profile for user {user_id}")def post_detail(request, slug):return HttpResponse(f"Post Detail for post {slug}")def archive(request, year, month):return HttpResponse(f"Archive for {year}-{month}")

支持的路径转换器:

转换器描述示例
str匹配任意非空字符串(默认类型)'hello/'
int匹配正整数'123/'
slug匹配字母、数字、-_'my-post-slug/'
uuid匹配 UUID 格式'550e8400-e29b-...'
path匹配包含 / 的字符串'some/path/'

4. 子路由与 include

Django 推荐在大型项目中将路由分模块管理。

示例:主路由

from django.urls import path, includeurlpatterns = [path('blog/', include('blog.urls')),  # 引入子路由path('shop/', include('shop.urls')),  # 引入另一个应用的路由
]

示例:子路由(blog/urls.py

from django.urls import path
from . import viewsurlpatterns = [path('', views.blog_home, name='blog-home'),path('<int:post_id>/', views.blog_post, name='blog-post'),
]

# blog/views.pyfrom django.http import HttpResponsedef blog_home(request):return HttpResponse("Welcome to the blog home page.")def blog_post(request, post_id):return HttpResponse(f"Blog Post with ID {post_id}")

URL /blog//blog/123/ 将分别被子路由处理。


5. 命名空间

在大型项目中,为不同应用的路由定义命名空间,避免路由名称冲突。

主路由配置

from django.urls import path, includeurlpatterns = [path('blog/', include(('blog.urls', 'blog'), namespace='blog')),  # 定义命名空间
]

子路由配置(blog/urls.py

from django.urls import path
from . import viewsapp_name = 'blog'  # 命名空间urlpatterns = [path('', views.home, name='home'),path('<int:post_id>/', views.post_detail, name='post-detail'),
]

使用反向解析

from django.urls import reverse# 使用命名空间解析路由
url = reverse('blog:post-detail', kwargs={'post_id': 1})  # 返回 /blog/1/

6. 正则表达式路由

如果路径匹配需要更复杂的规则,可以使用 re_path,支持正则表达式。

* 示例:  在2.x以上版本 无名分组 有名分组 可以用 re_path 实现

# urls.pyfrom django.urls import re_path
from . import viewsurlpatterns = [# 无名分组re_path(r'^page/(\d+)/$', views.page_view, name='page-view'),# 有名分组re_path(r'^page/(?P<page_number>\d+)/$', views.page_view, name='page-view'),
]

路径 /page/123/ 会被捕获为 page_number=123


# views.pyfrom django.http import HttpResponsedef page_view(request, page_number):return HttpResponse(f"Page number: {page_number}")


7. 路由中的默认值

可以为动态路由提供默认值,以减少 URL 的复杂度。

示例

from django.urls import path
from . import viewsurlpatterns = [path('profile/<str:username>/', views.profile, name='profile'),path('profile/', views.profile, {'username': 'default_user'}, name='default-profile'),
]

请求 /profile/ 将自动解析为 username='default_user'


# views.pyfrom django.http import HttpResponsedef profile(request, username='default_user'):return HttpResponse(f"User profile: {username}")

8. 类视图的路由

在路由中,可以直接绑定类视图。

示例

# urls.pyfrom django.urls import path
from .views import HomeView, ArticleViewurlpatterns = [path('', HomeView.as_view(), name='home'),path('article/<int:pk>/', ArticleView.as_view(), name='article-detail'),
]

类视图必须使用 .as_view() 方法绑定。


# views.pyfrom django.views import View
from django.http import HttpResponseclass HomeView(View):def get(self, request):return HttpResponse("Welcome to the Home page!")class ArticleView(View):def get(self, request, pk):return HttpResponse(f"Article Detail for Article {pk}")

9. 自定义路由转换器

Django 支持自定义路径转换器,用于处理特定格式的路径。

定义自定义转换器

converters.py 中:

class FourDigitYearConverter:regex = r'\d{4}'def to_python(self, value):return int(value)def to_url(self, value):return f'{value}'

局部注册转换器

urls.py 中:

from django.urls import path, register_converter
from .converters import FourDigitYearConverterregister_converter(FourDigitYearConverter, 'yyyy')urlpatterns = [path('year/<yyyy:year>/', views.year_archive, name='year-archive'),
]

请求 /year/2024/ 将解析为 year=2024


 * 也可以用继承

导包

from django.urls.converters import StringConverterclass FourDigitYearConverter(StringConverter):regex = r'\d{4}'def to_python(self, value):return int(value)def to_url(self, value):return f'{value}'


 * 全局注册

from django.urls.converters import StringConverter, DEFAULT_CONVERTERSDEFAULT_CONVERTERS['yyyy'] = FourDigitYearConverter


# views.pyfrom django.http import HttpResponsedef year_archive(request, year):return HttpResponse(f"Year Archive for {year}")

10. 静态文件与媒体文件路由

Django 开发模式下可以通过路由处理静态文件和媒体文件。

配置 settings.py

from pathlib import PathBASE_DIR = Path(__file__).resolve().parent.parentSTATIC_URL = '/static/'
MEDIA_URL = '/media/'STATICFILES_DIRS = [BASE_DIR / "static"]
MEDIA_ROOT = BASE_DIR / "media"

配置 urls.py

from django.conf import settings
from django.conf.urls.static import staticurlpatterns = [# 其他路由
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

总结

Django 路由是通过 urls.py 文件进行管理的,支持以下特性:

  1. 静态和动态路由:支持静态路径和动态参数传递。
  2. 子路由与命名空间:方便模块化管理,避免路由名称冲突。
  3. 反向解析:通过路由名称动态生成 URL。
  4. 自定义转换器:处理自定义路径格式。
  5. 正则表达式路由:支持复杂路径匹配。

路由系统是 Django 项目请求处理的起点,合理设计路由结构能显著提高项目的可维护性

* 11. 前后端反向解析 

解析方式方法示例代码解析结果
前端解析{% url 'route-name' %}<a href="{% url 'about' %}">About</a>/about/
后端解析reverse('route-name')reverse('about')/about/
动态参数reverse/{% url %}reverse('article-detail', kwargs={'id': 42})/article/42/
命名空间reverse/{% url %}{% url 'blog:post-detail' post_id=5 %}/blog/5/
延迟解析reverse_lazyreverse_lazy('profile', kwargs={...})/profile/...

相关文章:

Django 路由层

1. 路由基础概念 URLconf (URL 配置)&#xff1a;Django 的路由系统是基于 urls.py 文件定义的。路径匹配&#xff1a;通过模式匹配 URL&#xff0c;并将请求传递给对应的视图处理函数。命名路由&#xff1a;每个路由可以定义一个名称&#xff0c;用于反向解析。 2. 基本路由配…...

《硬件架构的艺术》笔记(八):消抖技术

简介 在电子设备中两个金属触点随着触点的断开闭合便产生了多个信号&#xff0c;这就是抖动。 消抖是用来确保每一次断开或闭合触点时只有一个信号起作用的硬件设备或软件。&#xff08;就是每次断开闭合只对应一个操作&#xff09;。 抖动在某些模拟和逻辑电路中可能产生问…...

Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系

一.什么是Spring&#xff1f;它解决了什么问题&#xff1f; 1.1什么是Spring&#xff1f; Spring&#xff0c;一般指代的是Spring Framework 它是一个开源的应用程序框架&#xff0c;提供了一个简易的开发方式&#xff0c;通过这种开发方式&#xff0c;将避免那些可能致使代码…...

【算法】连通块问题(C/C++)

目录 连通块问题 解决思路 步骤&#xff1a; 初始化&#xff1a; DFS函数&#xff1a; 复杂度分析 代码实现&#xff08;C&#xff09; 题目链接&#xff1a;2060. 奶牛选美 - AcWing题库 解题思路&#xff1a; AC代码&#xff1a; 题目链接&#xff1a;687. 扫雷 -…...

如何选择黑白相机和彩色相机

我们在选择成像解决方案时黑白相机很容易被忽略&#xff0c;因为许多新相机提供鲜艳的颜色&#xff0c;鲜明的对比度和改进的弱光性能。然而&#xff0c;有许多应用&#xff0c;选择黑白相机将是更好的选择&#xff0c;因为他们产生更清晰的图像&#xff0c;更好的分辨率&#…...

Rust 力扣 - 740. 删除并获得点数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 首先对于这题我们如果将所有点数装入一个切片f中&#xff0c;该切片f中的i号下标表示所有点数为i的点数之和 那么这题就转换成了打家劫舍这道题&#xff0c;也就是求选择了切片中某个下标的元素后&#xff0c;该…...

OpenCV从入门到精通实战(七)——探索图像处理:自定义滤波与OpenCV卷积核

本文主要介绍如何使用Python和OpenCV库通过卷积操作来应用不同的图像滤波效果。主要分为几个步骤&#xff1a;图像的读取与处理、自定义卷积函数的实现、不同卷积核的应用&#xff0c;以及结果的展示。 卷积 在图像处理中&#xff0c;卷积是一种重要的操作&#xff0c;它通过…...

Docker核心概念总结

本文只是对 Docker 的概念做了较为详细的介绍&#xff0c;并不涉及一些像 Docker 环境的安装以及 Docker 的一些常见操作和命令。 容器介绍 Docker 是世界领先的软件容器平台&#xff0c;所以想要搞懂 Docker 的概念我们必须先从容器开始说起。 什么是容器? 先来看看容器较为…...

环形缓冲区

什么是环形缓冲区 环形缓冲区,也称为循环缓冲区或环形队列,是一种特殊的FIFO(先进先出)数据结构。它使用一块固定大小的内存空间来缓存数据,并通过两个指针(读指针和写指针)来管理数据的读写。当任意一个指针到达缓冲区末尾时,会自动回绕到缓冲区开头,形成一个"环"。…...

jQuery-Word-Export 使用记录及完整修正文件下载 jquery.wordexport.js

参考资料&#xff1a; jQuery-Word-Export导出word_jquery.wordexport.js下载-CSDN博客 近期又需要自己做个 Html2Doc 的解决方案&#xff0c;因为客户又不想要 Html2pdf 的下载了&#xff0c;当初还给我费尽心思解决Html转pdf时中文输出的问题&#xff08;html转pdf文件下载之…...

云服务器部署WebSocket项目

WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;其设计的目的是在Web浏览器和Web服务器之间进行实时通信&#xff08;实时Web&#xff09; WebSocket协议的优点包括&#xff1a; 1. 更高效的网络利用率&#xff1a;与HTTP相比&#xff0c;WebSocket的握手只…...

C#+数据库 实现动态权限设置

将权限信息存储在数据库中&#xff0c;支持动态调整。根据用户所属的角色、特定的功能模块&#xff0c;动态加载权限” 1. 数据库设计 根据这种需求&#xff0c;可以通过以下表设计&#xff1a; 用户表 (Users)&#xff1a;存储用户信息。角色表 (Roles)&#xff1a;存储角色…...

(原创)Android Studio新老界面UI切换及老版本下载地址

前言 这两天下载了一个新版的Android Studio&#xff0c;发现整个界面都发生了很大改动&#xff1a; 新的界面的一些设置可参考一些博客&#xff1a; Android Studio新版UI常用设置 但是对于一些急着开发的小伙伴来说&#xff0c;没有时间去适应&#xff0c;那么怎么办呢&am…...

Ubuntu24虚拟机-gnome-boxes

推荐使用gnome-boxes&#xff0c; virtualbox构建失败&#xff0c;multipass需要开启防火墙 sudo apt install gnome-boxes创建完毕&#xff5e;...

k8s rainbond centos7/win10 -20241124

参考 https://www.rainbond.com/ 国内一站式云原生平台 对centos7环境支持不太行 [lighthouseVM-16-5-centos ~]$ curl -o install.sh https://get.rainbond.com && bash ./install.sh 2024-11-24 09:56:57 ERROR: Ops! Docker daemon is not running. Start docke…...

SpringBoot+Vue滑雪社区网站设计与实现

【1】系统介绍 研究背景 随着互联网技术的快速发展和冰雪运动的普及&#xff0c;滑雪作为一种受欢迎的冬季运动项目&#xff0c;吸引了越来越多的爱好者。与此同时&#xff0c;社交媒体和在线社区平台的兴起为滑雪爱好者提供了一个交流经验、分享心得、获取信息的重要渠道。滑…...

MySql.2

sql查询语句执行过程 SQL 查询语句的执行过程是一个复杂的过程&#xff0c;涉及多个步骤。以下是典型的关系数据库管理系统 (RDBMS) 中 SQL 查询语句的执行过程概述&#xff1a; 1. ‌客户端发送查询‌ 用户通过 SQL 客户端或应用程序发送 SQL 查询语句给数据库服务器。 2. ‌…...

算法之区间和题目讲解

题干 难度&#xff1a;简单 题目分析 题目要求算出每个指定区间内元素的总和。 然而&#xff0c;区间在输入的最下面&#xff0c;所以按照暴力破解的思路&#xff0c;我们首先要遍历数组&#xff0c;把它的值都存进去。 然后&#xff0c;遍历下面的区间&#xff0c;从索引a…...

价格分类(神经网络)

# 1.导入依赖包 import timeimport torch import torch.nn as nn import torch.optim as optimfrom torch.utils.data import TensorDataset, DataLoader from sklearn.model_selection import train_test_splitimport numpy as np import pandas as pd import matplotlib.pypl…...

对智能电视直播App的恶意监控

首先我们要指出中国广电总局推出的一个政策性文件是恶意监控的始作俑者&#xff0c;这个广电总局的政策性文件禁止智能电视和电视盒子安装直播软件。应该说这个政策性文件是为了保护特殊利益集团&#xff0c;阻挠技术进步和发展的。 有那么一些电视机和电视盒子的厂商和电信运…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...