【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…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
