Django路由层(反向解析、路由分发、命名空间、路径转换)

news2024/11/16 19:42:24

Django路由层(反向解析、路由分发、命名空间、路径转换)

目录

  • Django路由层(反向解析、路由分发、命名空间、路径转换)
    • 路由配置
    • 反向解析
      • 前端用法
      • 后端用法
    • 反向解析的本质
    • 路由分发
      • 用法示例
    • 分发时遇到的问题
        • 解决方案1
        • 解决方案2
    • 命名空间
      • 应用命名空间app_name
      • 实例命名空间namespace
    • 路径转换
      • 五种转换器

路由配置

Django中默认的路由配置在创建项目的urls.py文件中

from django.contrib import admin
from django.urls import path
from django.conf.urls import include

urlpatterns = [
    path('admin/', admin.site.urls),
]

每当创建新的app项目并且创建新的视图函数(类)时,记得都要在urls.py中添加路径

# views.py
def index(request):
    return render(request,'home.html')
# urls.py
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/',views.index)
]

'index/':路径名,也就是浏览器输入的url

views.index:解析路径的视图文件中的具体函数

反向解析

前端使用连接跳转是可能会在原路径的基础上进行添加,这种情况是一定会报错的,如下

{#aaa.html#}
<body>
<p>你好,我是{% url 'aaa' %}</p>
</body>
# views.py
def aaa(request):
    return render(request,'aaa.html')
# urls.py
    path('aaa/',views.aaa),

报错:

image-20240229152610535

解决方法:

# urls.py
path('aaa/',views.aaa,name='aaa'),

image-20240229155704135

前端用法

<p>{% url 'aaa' %}</p>

后端用法

from django.urls import reverse

def aaa(request):
    print(reverse('aaa'))
    # 输出:/aaa/

反向解析的本质

给路由取一个别名,可以让项目的其他地方在调用该别名时正确的解析其路由地址

路由分发

路由分发是Web开发中约定俗成的代码规范,即每个app都拥有自己的路由解析文件:

  • templates文件夹(名字可以随意改)
  • urls.py
  • static文件夹

用法示例

项目默认的路由配置

urlpatterns = [
    path('admin/', admin.site.urls),
	path('index/', views.index),
    path('home/', views.home,name='home'),
    path('register/', views.register,name='register'),
    path('test/', views.test,name='test'),
]

然后直接在app中新建urls.py,再将urlpatterns列表复制过来

from django.urls import path,include,re_path
from app01 import views
urlpatterns = [
    path('index/', views.index),
    path('home/', views.home,name='home'),
    path('register/', views.register,name='register'),
    path('test/', views.test,name='test'),
]

然后再总的项目urls.py中改写

from django.contrib import admin
from django.urls import path
from django.conf.urls import include
import app01

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app01/', include('app01.urls')),
]

这样在浏览器中输入路径就能访问了

分发前:http://127.0.0.1:8000/test/

分发后:http://127.0.0.1:8000/app01/test/

分发时遇到的问题

触发条件:

同时拥有app01,app02,并且分别配置了templates目录,总路由下也做了两个app的分发

现在两个app下都有同一个视图函数test

def test(request):
    return render(request,'test.html')

image-20240229165455269

此时同时存在两个同名的test.html文件

<p>你好,我是app01{% url 'test' %}</p>
<p>你好,我是app02{% url 'test' %}</p>

那么这个时候浏览器访问app01/test应该是这样的

image-20240229165651466

那么访问app02/test应该显示的是你好,我是app02/app02/test,但结果却是

image-20240229165801666

明显app2的视图函数读取到了app1中的templates目录,这是因为当存在同名路径时Django并不会区分,而是默认解析第一个读到的路由路径

解决方案1

直接修改html文件的名称,或者templates目录的名称对其进行区分

解决方案2

在各个app中的templates目录下新建一个目录,然后将该目录名添加在视图函数的render解析的路径前

例如

修改前:image-20240229173504428

修改后:image-20240229173553699

命名空间

为什么要用命名空间?

添加命名空间可以更好的进行url反向解析,通过指定某个app的命名空间来确保解析正确的url

应用命名空间app_name

例如在两个app中都有一个name=index的函数,那么在没有命名空间的情况下你也无法确定他通过{% url 'index' %}reverse('index')解析出来的是哪个app的url

解决方法

直接用命名空间将各个app隔离分离

Django提供了一个叫作app_name的属性

# 注意是在app下的urls.py
from django.urls import path,include,re_path
from app01 import views

app_name = 'app01'	# 生成命名空间

urlpatterns = [
    path('index/', views.index),
    path('home/', views.home,name='home'),
    path('register/', views.register,name='register'),
    path('test/', views.test,name='test'),
]
# 视图层
def test(request):
    a = reverse('app01:test')	# 也就前面加个app名
# 模板层
{% url 'app01:test' %}

注:如果未在app01中搜寻到test路径,他会自动搜索其他app下的test路径,直到报错

实例命名空间namespace

有一种情况会用到namespace

两次分发都指向同一路径

# 总urls.py
urlpatterns = [
    path('admin/', admin.site.urls),
    path('app01/', include('app02.urls',namespace='app01')),
    path('app02/', include('app02.urls',namespace='app02')),
]
# app01下的urls.py
from django.urls import path,include,re_path
from app01 import views

app_name = 'app01'

urlpatterns = [
    path('home/', views.home,name='home'),
    path('register/', views.register,name='register'),
    path('test/', views.test,name='test'),
]

# app02下的urls.py
from django.urls import path,include,re_path
from app02 import views

app_name = 'app02'

urlpatterns = [
    path('home/', views.home,name='home'),
    path('test/', views.test,name='test'),
    path('register/', views.register,name='register'),
]

此时当浏览器访问路径的时候app01/registerapp02/register访问的都是app2中的register,当然你访问home\test都是访问的app02的

image-20240229201009657

那么此时如何分辨他们的命名空间呢?

request.resolver_match.namespace可以返回当前url的命名空间

def test(request):
    now_namespace = request.resolver_match.namespace
    print(now_namespace)
    return HttpResponse(now_namespace)

image-20240229201136391

这样就可以根据不同的namespace执行不同的命令了

路径转换

五种转换器

  • str
    • 匹配除了 ‘/’ 之外的非空字符串。
    • 如果表达式内不包含转换器,则会默认匹配字符串。
  • int
    • 匹配 0 或任何正整数。返回一个 int 。
  • slug
    • 匹配任意由 ASCII 字母或数字以及连字符和下划线组成的短标签。
    • 比如,building-your-1st-django-site 。
  • uuid
    • 匹配一个格式化的 UUID 。为了防止多个 URL 映射到同一个页面,必须包含破折号并且字符都为小写。
    • 比如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID 实例。
  • path
    • 匹配非空字段,包括路径分隔符 ‘/’ 。
      非空字符串。
    • 如果表达式内不包含转换器,则会默认匹配字符串。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1485765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

过于老旧的pytorch_ssim包 请从github下载源码

有些冷门算法真的不要随便pip&#xff0c;有可能下载到史前版本…最好还是找源代码 汗 今天要用到SSIM损失函数&#xff0c;从网上简单看了一下原理就想测试一下&#xff0c;偷了一下懒就直接在命令行输入pip install pytorch_ssim了&#xff0c;结果报了一堆错误&#xff08;汗…

vue3编写H5适配横竖屏

具体思路如下&#xff1a; 1、监听浏览器屏幕变化&#xff0c;通过监听屏幕宽高&#xff0c;辨别出是横屏&#xff0c;还是竖屏状态 在项目的起始根页面进行监听&#xff0c;我就是在App.vue文件下进行监听 代码如下&#xff1a; <template><RouterView /> <…

【MySQL】:约束全解析

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. 约束概述二. 约束演示三. 外键约束3.1 介绍3.2 语法3.3 删除/更新行为 &…

Ribbon负载均衡(黑马学习笔记)

上Eureka一节中&#xff0c;我们添加了LoadBalanced注解&#xff0c;即可实现负载均衡功能&#xff0c;这是什么原理呢&#xff1f; 负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件&#xff0c;来实现负载均衡功能的。 那么我们发出的请求明明是http://users…

文献阅读:The Unreasonable Effectiveness of Easy Training Data for Hard Tasks

文献阅读&#xff1a;The Unreasonable Effectiveness of Easy Training Data for Hard Tasks 1. 文章简介2. 方法介绍 1. 数据集难易度分析2. 模型训练前后变化 3. 实验考察 & 结论 1. 实验设计 1. 使用数据集2. 使用模型 2. 实验结果 1. 数据集难度分析2. 在Easy数据集下…

迭代器模式:分离遍历逻辑与数据结构,实现统一访问接口与灵活扩展

文章目录 一、引言二、应用场景与技术背景三、模式定义与实现四、优缺点分析总结&#xff1a; 一、引言 ​ 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供了一种方法顺序访问聚合对象的元素&#xff0c;而又不暴露其底层表示。迭…

SaaS 电商设计 (九) 动态化且易扩展的实现购物车底部弹层(附:一套普适的线上功能切量的发布方案)

目录 一.背景1.1 业务背景1.2 技术负债 二.技术目标三.方案设计3.1 解决移动端频繁发版3.1.1 场景分析3.1.2 技术方案 3.2 减少后端坏味道代码&无法灵活扩展问题3.2.1 通过抽象接口完成各自单独楼层渲染逻辑3.2.2 通过配置能力做到部分字段可配 四.升级上线(普适于高并发大…

NoSQL--2.MongoDB配置

目录 2.MongdoDB配置 2.1 Windows环境下操作 2.1.1 注册MongDB Atlas&#xff1a; 2.1.2 MongoDB Community Server Download&#xff1a; 2.1.3 启动MondgoDB服务&#xff1a; 2.1.3.1 命令行参数的方式启动MongoDB服务&#xff1a; 2.1.3.2 使用配置文件方式启动Mongo…

Python算法100例-3.4 完数

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.问题拓展 1&#xff0e;问题描述 求某一范围内完数的个数。 如果一个数等于它的因子之和&#xff0c;则称该数为“完数”&#xff08;或“完全数”&…

C#中多语言编程原理及实例解析

文章目录 一、了解C#多语言编程原理1. 通用语言运行库&#xff08;CLR&#xff09;2. 通用类型系统&#xff08;CTS&#xff09;3. 微软中间语言&#xff08;MSIL&#xff09;4. 元数据和反射5. 公共语言规范&#xff08;CLS&#xff09; 二、实例说明 一、了解C#多语言编程原理…

Linux笔记--用户与用户组

Linux系统是一个多用户多任务的操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员(root)申请一个账号&#xff0c;然后以这个账号的身份进入系统。 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪&#xff0c;并控制他们对系…

MIT-BEVFusion系列九--CUDA-BEVFusion部署6 前向推理的数据加载与图像预处理

目录 加载图像数据加载点云数据模型推理并计时预热操作模型推理检查点云输入数据量打印信息中CopyLidar部分的计算和耗时打印信息中ImageNrom图像预处理部分计算和耗时 该系列文章与qwe、Dorothea一同创作&#xff0c;喜欢的话不妨点个赞。 接上面的文章&#xff0c;目光聚焦回…

为啥要用C艹不用C?

在很多时候&#xff0c;有人会有这样的疑问 ——为什么要用C&#xff1f;C相对于C优势是什么&#xff1f; 最近两年一直在做Linux应用&#xff0c;能明显的感受到C带来到帮助以及快感 之前&#xff0c;我在文章里面提到环形队列 C语言&#xff0c;环形队列 环形队列到底是怎么回…

数据结构——lesson5栈和队列详解

hellohello~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所属专栏&#xff1a;数据结构学习笔记 &#x1f4a5;对于顺序表链表有疑问的都可以在上面数据结构的专栏进行学习哦~感谢大家的观看与…

ElasticSearch相关知识点

ElasticSearch相关知识点 1.了解ES ES的作用&#xff1a;ES是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 ELK技术栈&#xff1a;ES结合kibana、Logstash、Beasts&#xff0c;也就是 elastic stack 。…

NoSQL--1.虚拟机网络配置

目录 1.初识NoSQL 1.1 NoSQL之虚拟机网络配置 1.1.1 首先&#xff0c;导入预先配置好的NoSQL版本到VMware Workstation中 1.1.2 开启虚拟机操作&#xff1a; 1.1.2.1 点击开启虚拟机&#xff1a; 1.1.2.2 默认选择回车CentOS Linux&#xff08;3.10.0-1127.e17.x86_64) 7 …

小白必看的Python函数讲解

定义函数 我们通过斐波那契数列来理解定义函数 >>> def fib(n): # 将斐波那契数列打印到 n ... """将斐波那契数列打印到 n""" ... a, b 0, 1 ... while a < n: ... print(a, end ) ... a, b b, …

IPC资源在linux内核中如何管理

1.先看各个通信的接口 1.共享内存接口 2.消息队列接口 3.信号量接口 2.管理他们的结构体&#xff1a; 其实管理他们的是一个数组&#xff0c;和open返回的fd差不多&#xff0c;shmid&#xff0c;msqid,semid的大小都是这个数组的下标。那数组的结构是什么呢&#xff1f; 然后…

hive中spark SQL做算子引擎,PG作为MetaDatabase

简介 hive架构原理 1.客户端可以采用jdbc的方式访问hive 2.客户端将编写好的HQL语句提交&#xff0c;经过SQL解析器&#xff0c;编译器&#xff0c;优化器&#xff0c;执行器执行任务。hive的存算都依赖于hadoop框架&#xff0c;所依赖的真实数据存放在hdfs中&#xff0c;解析…

JCL中IEFBR14和COND

JCL中IEFBR14和COND ​ COND CODE&#xff0c;就是反映JCL中STEP运行状态的参数&#xff0c;JCL正常终了的COND CODE 是0000&#xff0c;另外笔者在执行某些工具JCL时候&#xff0c;比方说简单一个COMPARE吧&#xff0c;可能会出现0012、0004或者0016&#xff0c;0001&#xf…