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

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 includeurlpatterns = [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.pypath('aaa/',views.aaa),

报错:

image-20240229152610535

解决方法:

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

image-20240229155704135

前端用法

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

后端用法

from django.urls import reversedef 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 app01urlpatterns = [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 viewsapp_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 viewsapp_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 viewsapp_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.namespaceprint(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.hqwc.cn/news/506518.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣 分割回文串

输出的是不同的分割方案 class Solution { public:vector<vector<bool>>flag;vector<string>ans;vector<vector<string>>nums;void dfs(string &s,int i){int ns.size();if(in){i表示s长度&#xff0c;等于即全部分割完毕nums.push_back(ans…

PTA天梯 L1-071前世档案

网络世界中时常会遇到这类滑稽的算命小程序&#xff0c;实现原理很简单&#xff0c;随便设计几个问题&#xff0c;根据玩家对每个问题的回答选择一条判断树中的路径&#xff08;如下图所示&#xff09;&#xff0c;结论就是路径终点对应的那个结点。 现在我们把结论从左到右顺…

C++指针(三)

个人主页:PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 文章目录 前言 1.字符指针 1.1字符指针的概念 1.2字符指针的用处 1.3字符指针的操作 1.3.1定义 1.3.2初始化 1.4字符指针使用注意事项 2.数组参数&#xff0c;指针参数 2.1数组参数 2.1.1数组参数的概念 2.1…

鸡尾酒疗法 T1067

鸡尾酒疗法&#xff0c;原指 “高效抗逆转录病毒治疗”&#xff08;HAARTHAART&#xff09;&#xff0c;由美籍华裔科学家何大一于 1996 年提出&#xff0c;是通过三种或三种以上的抗病毒药物联合使用来治疗艾滋病。该疗法的应用可以减少单一用药产生的抗药性&#xff0c;最大限…

一文了解docker与k8s

随着 k8s 作为容器编排解决方案变得越来越流行&#xff0c;有些人开始拿 Docker 和 k8s 进行对比&#xff0c;不禁问道&#xff1a;Docker 不香吗&#xff1f; k8s 是 kubernetes 的缩写&#xff0c;8 代表中间的八个字符。 其实 Docker 和 k8s 并非直接的竞争对手两者相互依存…

配电房轨道式巡检机器人方案

一、应用背景 在变电站、配电房、开关站等各种室内变配电场所内&#xff0c;由于变配电设备的数量众多、可能存在各类安全隐患&#xff0c;为了保证用电的安全可靠&#xff0c;都要进行日常巡检。 但目前配电房人工巡检方式有以下主要问题&#xff1a; 巡检工作量大、成本高 …

智能的花火,照亮一座5G钢铁工厂的时代之舞

“东风夜放花千树。更吹落&#xff0c;星如雨。凤箫声动&#xff0c;玉壶光转&#xff0c;一夜鱼龙舞”&#xff0c;辛弃疾在《青玉案》中描绘的“打铁花”&#xff0c;是刚刚过去的春节假期中&#xff0c;全国各地都在上演的中式浪漫。 当铁水被击打向高空&#xff0c;犹如千万…

[NSSCTF 2nd] web复现

1.php签到 <?phpfunction waf($filename){$black_list array("ph", "htaccess", "ini");$ext pathinfo($filename, PATHINFO_EXTENSION);foreach ($black_list as $value) {if (stristr($ext, $value)){return false;}}return true; }if(i…

反向传播算法(Back Propagation)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 反向传播算法 梯度下降和反向传播是神经网络训练过程中两个非常重要的概念&#xff0c;它们密切相关。梯度下降是一种常用的优化算法&#xff0…

萝卜大杂烩 | 提高数据科学工作效率的 8 个 Python 库

本文来源公众号“萝卜大杂烩”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;提高数据科学工作效率的 8 个 Python 库 在进行数据科学时&#xff0c;可能会浪费大量时间编码并等待计算机运行某些东西。所以我选择了一些 Python 库…

STM32 DMA入门指导

什么是DMA DMA&#xff0c;全称直接存储器访问&#xff08;Direct Memory Access&#xff09;&#xff0c;是一种允许硬件子系统直接读写系统内存的技术&#xff0c;无需中央处理单元&#xff08;CPU&#xff09;的介入。下面是DMA的工作原理概述&#xff1a; 数据传输触发&am…

UE 打包窗口及鼠标状态设置

UE 打包窗口及鼠标状态设置 打包后鼠标不锁定 显示鼠标图标 打包后设置窗口模式 找到打包路径下的配置文件GameUserSettings&#xff0c;设置相关项目 FullscreenMode0表示全屏模式&#xff0c;1表示窗口全屏模式&#xff0c;2表示窗口模式