【Django篇】--动手实现路由模块化与路由反转
一、路由模块化
在一个Django项目中,由于功能类别不同,因此需要将不同功能进行模块化设计。在Django项目中模块化设计则需要将不同模块封装为对应的app模块,每一个模块中涉及到的路由则也需要进行模块化设计,才能更好的让整个项目的耦合性更低。
- 创建app的适用条件
- 功能模块化:为了将项目功能清晰划分,提高可维护性。
- 重用代码:为了在多个项目中重用特定功能模块。
- 大型项目拆分:为了提高大型项目的可管理性和可扩展性。
- 团队协作:为了在团队开发中减少代码冲突,提高工作效率。
- 插件或第三方集成:为了更好地管理和隔离第三方服务或插件。
- 测试和开发分离:为了在开发过程中便于管理和维护测试代码。
- API开发:为了集中和清晰地处理API请求。
- 遵循DRY原则:为了避免代码重复,提高代码复用性。
- 项目结构清晰:为了提高代码的可读性和逻辑性。
- 遵循Django的最佳实践:为了符合Django项目推荐的模块化开发方式
在Django项目中创建app的命令:
# 将movie替换为自己的app名称
python manage.py startapp movie
在movie包中的view视图文件中创建视图,如下:
from django.shortcuts import render, HttpResponse# Create your views here.def movie_list(request):return HttpResponse("电影列表")def movie_index(request, movie_id):return HttpResponse(f"你的电影ID为:{movie_id}")
在movie包中创建urls文件,并在其中将视图文件映射到url上,如下:
"""
@Author :江上挽风&sty
@Blog(个人博客地址):https://blog.csdn.net/weixin_56097064
@File :urls
@Time :2024/12/30 15:49
@Motto:一直努力,一直奋进,保持平常心"""
from django.urls import path
from . import viewsurlpatterns = [path('movie_list', views.movie_list, name='movie_list'),path('movie_index/<int:movie_id>', views.movie_index, name='movie_index')
]
最后在Django项目的urls文件中将创建的movie中的urls文件进行关联:
"""
URL configuration for DjangoProjectCode project.The `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/5.1/topics/http/urls/
Examples:
Function views1. Add an import: from my_app import views2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views1. Add an import: from other_app.views import Home2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""from django.contrib import admin
from django.urls import path, include
from django.shortcuts import HttpResponse
from book import views
# 默认的地址为:http://127.0.0.1:8000/# 如果我想要访问默认地址下的其他内容,可以通过定义视图并将视图进行映射
def index(request):return HttpResponse("这是默认页面")def my_page(request):return HttpResponse("我的第一个Django项目,我们一定会顺利毕业滴!")urlpatterns = [path("admin/", admin.site.urls),path("", index), # 双引号中为空内容,表示为默认地址path("mypage", my_page), # 自定义urlpath("book", views.book_detail_query_id),# 在book_id前面添加指定参数类型,如果在浏览器中输入了非整型,会报404错误,并且在视图函数中,book_id就是一个整型,否则是字符串类型path("book/<int:book_id>", views.book_detail_path),# 将movie app中的urls关联到项目urls中path("movie/", include("movie.urls"))]
项目演示:
二、路由反转
2.1、概念
在Django项目中,路由反转是指通过视图函数的名称或路径对象来动态生成URL的过程。这是Django URL dispatcher的一个特性,允许你在模板、视图或其他Python代码中引用视图,而不是硬编码URL。
- 进行路由反转的优势:
-
减少硬编码:避免在代码中硬编码URL,使得URL的修改更加灵活,只需更改URL配置而不需要修改引用该URL的代码。
-
提高代码可维护性:当URL发生变化时,只需更改一处即可,无需搜索整个项目中的硬编码URL,降低了维护成本。
-
增强代码的可读性:使用视图名称或路径对象引用URL,使得代码更加清晰易懂,尤其是对于大型项目来说,可以快速定位到对应的视图函数。
-
支持国际化:在进行国际化时,URL可能会根据语言的不同而变化,路由反转可以动态生成适应不同语言环境的URL。
-
简化测试:在编写测试时,可以使用路由反转来构造测试URL,而不需要关心具体的URL路径是什么。
-
支持命名空间:在Django中,可以使用命名空间来组织URL,路由反转可以帮助正确地解析带有命名空间的URL。
-
动态URL生成:在某些情况下,URL可能依赖于动态数据,如对象的ID或slug,路由反转可以方便地生成这些动态URL。
-
2.2、实现方式
测试代码:
"""
URL configuration for DjangoProjectCode project.The `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/5.1/topics/http/urls/
Examples:
Function views1. Add an import: from my_app import views2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views1. Add an import: from other_app.views import Home2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""from django.contrib import admin
from django.urls import path, include
from django.shortcuts import HttpResponse
from book import views
from django.urls import reverse"""
URL configuration for DjangoProjectCode project.The `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/5.1/topics/http/urls/
Examples:
Function views1. Add an import: from my_app import views2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views1. Add an import: from other_app.views import Home2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""from django.contrib import admin
from django.urls import path, include
from django.shortcuts import HttpResponse
from book import views
from django.urls import reverse
# 默认的地址为:http://127.0.0.1:8000/# 如果我想要访问默认地址下的其他内容,可以通过定义视图并将视图进行映射
def index(request):print(reverse("index"))return HttpResponse("这是默认页面")def my_page(request):return HttpResponse("我的第一个Django项目,我们一定会顺利毕业滴!")urlpatterns = [path("admin/", admin.site.urls),path("", index, name='index'), # 双引号中为空内容,表示为默认地址path("mypage", my_page), # 自定义urlpath("book", views.book_detail_query_id, name='book_id'),# 在book_id前面添加指定参数类型,如果在浏览器中输入了非整型,会报404错误,并且在视图函数中,book_id就是一个整型,否则是字符串类型path("book/<int:book_id>", views.book_detail_path, name='book_path'),# 将movie app中的urls关联到项目urls中path("movie/", include("movie.urls"))]# 默认的地址为:http://127.0.0.1:8000/# 如果我想要访问默认地址下的其他内容,可以通过定义视图并将视图进行映射
def index(request):print(reverse("index"))return HttpResponse("这是默认页面")def my_page(request):return HttpResponse("我的第一个Django项目,我们一定会顺利毕业滴!")urlpatterns = [path("admin/", admin.site.urls),path("", index, name='index'), # 双引号中为空内容,表示为默认地址path("mypage", my_page), # 自定义urlpath("book", views.book_detail_query_id, name='book_id'),# 在book_id前面添加指定参数类型,如果在浏览器中输入了非整型,会报404错误,并且在视图函数中,book_id就是一个整型,否则是字符串类型path("book/<int:book_id>", views.book_detail_path, name='book_path'),# 将movie app中的urls关联到项目urls中path("movie/", include("movie.urls"))]
运行项目并访问http://127.0.0.1:8000/得到:
通过传递参数:
"""
URL configuration for DjangoProjectCode project.The `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/5.1/topics/http/urls/
Examples:
Function views1. Add an import: from my_app import views2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views1. Add an import: from other_app.views import Home2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""from django.contrib import admin
from django.urls import path, include
from django.shortcuts import HttpResponse
from book import views
from django.urls import reverse
# 默认的地址为:http://127.0.0.1:8000/# 如果我想要访问默认地址下的其他内容,可以通过定义视图并将视图进行映射
def index(request):print(reverse("book_path",kwargs={"book_id":1}))# print(reverse("index"))return HttpResponse("这是默认页面")def my_page(request):return HttpResponse("我的第一个Django项目,我们一定会顺利毕业滴!")urlpatterns = [path("admin/", admin.site.urls),path("", index, name='index'), # 双引号中为空内容,表示为默认地址path("mypage", my_page), # 自定义urlpath("book", views.book_detail_query_id, name='book_id'),# 在book_id前面添加指定参数类型,如果在浏览器中输入了非整型,会报404错误,并且在视图函数中,book_id就是一个整型,否则是字符串类型path("book/<int:book_id>", views.book_detail_path, name='book_path'),# 将movie app中的urls关联到项目urls中path("movie/", include("movie.urls"))]
运行项目并访问http://127.0.0.1:8000/得到:
查询字符串传参:
"""
URL configuration for DjangoProjectCode project.The `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/5.1/topics/http/urls/
Examples:
Function views1. Add an import: from my_app import views2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views1. Add an import: from other_app.views import Home2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""from django.contrib import admin
from django.urls import path, include
from django.shortcuts import HttpResponse
from book import views
from django.urls import reverse
# 默认的地址为:http://127.0.0.1:8000/# 如果我想要访问默认地址下的其他内容,可以通过定义视图并将视图进行映射
def index(request):print(reverse("book_id")+"?id=1")# print(reverse("book_path",kwargs={"book_id":1}))# print(reverse("index"))return HttpResponse("这是默认页面")def my_page(request):return HttpResponse("我的第一个Django项目,我们一定会顺利毕业滴!")urlpatterns = [path("admin/", admin.site.urls),path("", index, name='index'), # 双引号中为空内容,表示为默认地址path("mypage", my_page), # 自定义urlpath("book", views.book_detail_query_id, name='book_id'),# 在book_id前面添加指定参数类型,如果在浏览器中输入了非整型,会报404错误,并且在视图函数中,book_id就是一个整型,否则是字符串类型path("book/<int:book_id>", views.book_detail_path, name='book_path'),# 将movie app中的urls关联到项目urls中path("movie/", include("movie.urls"))]
运行项目并访问http://127.0.0.1:8000/得到:
命名空间传参:
"""
URL configuration for DjangoProjectCode project.The `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/5.1/topics/http/urls/
Examples:
Function views1. Add an import: from my_app import views2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views1. Add an import: from other_app.views import Home2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""from django.contrib import admin
from django.urls import path, include
from django.shortcuts import HttpResponse
from book import views
from django.urls import reverse
# 默认的地址为:http://127.0.0.1:8000/# 如果我想要访问默认地址下的其他内容,可以通过定义视图并将视图进行映射
def index(request):print(reverse("movie:movie_list"))# print(reverse("book_id")+"?id=1")# print(reverse("book_path",kwargs={"book_id":1}))# print(reverse("index"))return HttpResponse("这是默认页面")def my_page(request):return HttpResponse("我的第一个Django项目,我们一定会顺利毕业滴!")urlpatterns = [path("admin/", admin.site.urls),path("", index, name='index'), # 双引号中为空内容,表示为默认地址path("mypage", my_page), # 自定义urlpath("book", views.book_detail_query_id, name='book_id'),# 在book_id前面添加指定参数类型,如果在浏览器中输入了非整型,会报404错误,并且在视图函数中,book_id就是一个整型,否则是字符串类型path("book/<int:book_id>", views.book_detail_path, name='book_path'),# 将movie app中的urls关联到项目urls中path("movie/", include("movie.urls"))]
运行项目并访问http://127.0.0.1:8000/得到:
相关文章:

【Django篇】--动手实现路由模块化与路由反转
一、路由模块化 在一个Django项目中,由于功能类别不同,因此需要将不同功能进行模块化设计。在Django项目中模块化设计则需要将不同模块封装为对应的app模块,每一个模块中涉及到的路由则也需要进行模块化设计,才能更好的让整个项目…...
多元统计分析练习题3
从总体 A A A 和 B B B 中分别抽取 n 10 n10 n10 个样本 假设 A , B A,B A,B 协方差矩阵相同,并且服从多元正态分布 计算得到的样本均值和样本离差阵分别为 X ‾ A ( 1 , 2 , 3 ) T , V B d i a g ( 1 , 1 , 1 ) X ‾ B ( 1.5 , 2.5 , 3.5 ) T , V B d i…...

windows remote desktop service 远程桌面RDS授权激活
windows remote desktop service 远程桌面RDS授权激活 功能介绍:操作步骤:1、添加远程桌面授权服务2、添加远程桌面授权许可 功能介绍: 本文以 windows Server 2016为例,系统默认远程桌面连接数是2个用户,如果多余两个…...
6-pandas数据读取
前言 一、分组聚合 1.groupby使用: groupby() 是 pandas 库中用于对数据进行分组操作的一个非常重要的方法。 import pandas as pddata {城市: [北京, 上海, 广州, 北京, 上海, 广州],人口: [2154, 2424, 1303, 2154, 2424, 1303],年龄: [25, 30, 35, 25, 30, 3…...
【Logback详解】
Logback详解 Logback 是一个用于 Java 应用的日志框架,它由 Log4j 的创始人 Ceki Glc 创建。Logback 分为三个模块:logback-core、logback-classic 和 logback-access。logback-classic 模块实现了 SLF4J (Simple Logging Facade for Java) API…...

Flume的概念和原理
一、Flume的概念 1、flume 作为 cloudera 开发的实时日志收集系统 2、flume一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种…...

初始nginx
华子目录 nginx介绍nginx功能介绍基础特性web服务相关功能nginx进程结构web请求处理机制 nginx进程间通信nginx启动与http连接建立http处理过程 nginx模块介绍nginx命令演示 nginx介绍 nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服…...

vulnhub靶场 Empire LupinOne
使用命令查看靶机ip,访问ip arp-scan -l 使用御剑扫描一下子域名,但是没有获取到什么有用的信息 这是一个Apache文档,没有什么用 紧接着我们尝试暴力破解,这里推荐使用ffuf工具暴力破解目录,kali自带的ffuf扫描速度贼快 参数解释…...

6-Gin 路由详解 --[Gin 框架入门精讲与实战案例]
Gin 是一个用 Go 语言编写的 HTTP Web 框架,以其高性能和简洁的 API 而闻名。它提供了一套强大的路由功能,使得开发者可以轻松地定义 URL 路由规则,并将这些规则映射到具体的处理函数(handler)。以下是关于 Gin 路由的…...

使用Lodash工具库的orderby和sortby进行排序的区别
简介 _.orderBy 和 _.sortBy 是 Lodash 库中用于排序数组的两个函数。 区别 _.orderBy 允许你指定一个或多个属性来排序,并为每个属性指定排序方向(升序或降序)。默认所有值为升序排,指定为"desc" 降序,…...
CSS面试题|[2024-12-24]
1.说一下CSS的盒模型 在HTML页面中的所有元素都可以看成是一个盒子 盒子的组成:内容content、内边距padding、边框border、外边距margin 盒模型的类型: 标准盒模型 margin border padding content IE盒模型 margin content(包括border p…...
flask-admin 在modelview 视图中重写on_model_change 与after_model_change
背景: 当我们在使用flask-admin进行WEB开发时应该第一时间想到的是竟可能使用框架推荐的modelView模型,其次才是自定义模型 baseview,因为只有modelview模型下开发才能最大限度的提高效率。 制作: 1、在modelview视图下框架会通过默认视图…...

Excel粘贴复制不完整的原因以及解决方法
在数据处理和分析的过程中,Excel无疑是不可或缺的工具。然而,在使用Excel进行复制粘贴操作时,有时会遇到粘贴不完整的情况,这可能会让人感到困惑和烦恼。本文将深入探讨Excel粘贴复制不完整的原因、提供解决方案,并给出…...

【深度学习环境】NVIDIA Driver、Cuda和Pytorch(centos9机器,要用到显示器)
文章目录 一 、Anaconda install二、 NIVIDIA driver install三、 Cuda install四、Pytorch install 一 、Anaconda install Step 1 Go to the official website: https://www.anaconda.com/download Input your email and submit. Step 2 Select your version, and click i…...

Cocos Creator 3.8.5 正式发布,更小更快更多平台!
在 Cocos Creator 3.8.5 版本中,我们做了新一轮的优化。 在加载速度、代码裁剪、平台增强等多方面做了优化,提升了开发者体验和游戏性能。 希望能够助 Cocos 开发者们的产品更上一层楼。 一、加载速度优化 1、WASM 模块延迟加载 在早期版本中,…...

Python中构建终端应用界面利器——Blessed模块
在现代开发中,命令行应用已经不再仅仅是一个简单的文本输入输出工具。随着需求的复杂化和用户体验的重视,终端界面也逐渐成为一个不可忽视的设计环节。 如果你曾经尝试过开发终端UI,可能对传统的 print() 或者 input() 函数感到不满足&#…...
Android 15 状态栏闹钟图标不显示问题修复
Android 15 状态栏闹钟图标不显示问题修复 问题描述 在 Android 15 系统中,发现即使设置了闹钟,状态栏也不会显示闹钟图标。这个问题影响了用户及时查看闹钟状态的体验。 问题分析 通过查看 SystemUI 的配置文件,发现在 frameworks/base/packages/SystemUI/res/values/conf…...

数据采集背后的效率革命:如何优化你的爬虫性能
在爬虫技术日益发展的今天,性能优化成为提升数据采集效率的关键。面对日益复杂的网页结构和庞大的数据量,高效的爬虫能够显著降低运行时间和资源成本。本文将围绕爬虫性能优化的核心方法展开讨论,并通过实例对比多进程、多线程以及普通爬取的…...

【Compose multiplatform教程06】用IDEA编译Compose Multiplatform常见问题
当我们从Kotlin Multiplatform Wizard | JetBrains 下载ComposeMultiplatform项目时 会遇到无法正常编译/运行的情况,一般网页和桌面是可以正常编译的, 我这里着重解决如下问题 1:Gradle版本不兼容或者Gradle连接超时 2:JDK版本不兼容 3:Gradle依赖库连…...

《计算机组成及汇编语言原理》阅读笔记:p128-p132
《计算机组成及汇编语言原理》学习第 10 天,p128-p132 总结,总计 5 页。 一、技术总结 1.8088 organization and architecture 8088处理器是16位电脑,寄存器是16位,数据总线(data bus)是8位,地址总线是20位。 (1)g…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...