django中的路由层

1.什么是路由层

简单来说,就是通过路由层中的path函数,告诉django遇到那个url,执行那个视图函数

2.路由层的请求流程

1.客户在浏览器输入网址→请求进入django的setting.py中的ROOT_URLCONF寻找指定使用的urls.py文件位置(如果中间件有路由功能,urls文件功能会被其替代)

2.Django会先匹配项目目录下的path路径然后在匹配应用里面的url路径,从上至下查找url匹配,一旦匹配成功,停止查找。

3.一旦匹配url成功后,路由层向视图层传递下列参数:
        1)一个HttpRequest实例,即request
        2)如果url中的可变参数没有命名,那么就按照位置来与视图函数中的形参一一对应,如果有则按关键字方式传参

4.如果匹配不到url,Django会发出异常

re_path(r'^test/$',views.test)
注意:path路径匹配是会自动在url后面加上一个斜杠,即先匹配test没有找到,会自动加个/在匹配一次!

如何取消自动加斜杠?
在setting.py里添加APPEND_SLASH = False 默认是True

3.路由层的格式和参数说明

分组:就是给某一段正则表达式用小括号扩起来

无名分组:就是将括号内的正则表达式匹配到的内容当做位置参数传递给后面的视图函数

from django.urls import path, re_path
re_path(r'^test/(\d+)/',views.test)

def test(request,xx):  # xx这个参数就是对应path里面的(\d+)
    pass

补充:path里面views.xxx,后面也可以在加一个参数(字典形式),该参数可以被传到视图函数,视图函数request后面在加个参数(字典的key)
有名分组:可以给正则表达式起个别名

from django.urls import path, re_path
re_path&#xFF08;r&#x2018;^&#xFF08;?P<自定义参数名>&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;)/$',view.xxx),

def test(request,&#x81EA;&#x5B9A;&#x4E49;&#x53C2;&#x6570;&#x540D;):
    pass
</自定义参数名>

有名无名不能混用!单个分组可以使用多次!

&#x53CD;&#x5411;&#x89E3;&#x6790;&#x7684;&#x6B65;&#x9AA4;&#xFF1A;

1.&#x5148;&#x7ED9;&#x6539;url&#x8D77;&#x4E00;&#x4E2A;&#x522B;&#x540D;
re_path&#xFF08;r'^test/$',views.test,name='ooo'&#xFF09;

2.&#x540E;&#x7AEF;&#x53CD;&#x5411;&#x89E3;&#x6790;&#xFF08;&#x89C6;&#x56FE;&#x5C42;&#xFF09;
&#x5148;&#x5BFC;&#x5165;reverse
from django.shortcuts import reverse
print&#xFF08;reverse&#xFF08;&#x2018;ooo&#x2019;&#xFF09;&#xFF09; # &#x5F97;&#x5230;&#x7684;&#x5C31;&#x662F;&#x5BF9;&#x5E94;&#x522B;&#x540D;&#x7684;url

3.&#x524D;&#x7AEF;&#x53CD;&#x5411;&#x89E3;&#x6790;
&#x5728;&#x9700;&#x8981;url&#x7684;&#x5730;&#x65B9;&#xFF0C;&#x6539;&#x6210;&#x5982;&#x4E0B;&#x683C;&#x5F0F;&#xFF1A;
<a href="{% url " ooo' %}'>111</a>
1.&#x65E0;&#x540D;&#x5206;&#x7EC4;
&#x540E;&#x7AEF;&#x90E8;&#x5206;&#xFF1A;

&#x5148;&#x5BFC;&#x5165;reverse
from django.shortcuts import reverse
print&#xFF08;reverse&#xFF08;&#x2018;ooo&#x2019;&#xFF09;&#xFF0C;args=&#xFF08;1&#xFF0C;&#xFF09;&#xFF09;#&#x9700;&#x8981;&#x4F20;&#x4E00;&#x4E2A;&#x5BF9;&#x5E94;&#x53C2;&#x6570;args&#xFF0C;&#x91CC;&#x9762;&#x7684;1&#x53EF;&#x4EE5;&#x8BA9;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;&#x5339;&#x914D;&#x5230;

&#x524D;&#x7AEF;&#x90E8;&#x5206;&#xFF1A;
<a 123 href="{% url " ooo' %}'>111</a>
123&#x662F;&#x5339;&#x914D;&#x5230;url&#x7684;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;

2.&#x6709;&#x540D;&#x5206;&#x7EC4;
&#x5176;&#x5B9E;&#x662F;&#x548C;&#x65E0;&#x540D;&#x5206;&#x7EC4;&#x4E00;&#x6837;&#x7684;&#xFF0C;&#x4F46;&#x662F;&#x4E5F;&#x53EF;&#x4EE5;&#x5199;&#x6210;&#x5173;&#x952E;&#x5B57;&#x65B9;&#x5F0F;&#x4F20;&#x53C2;
print&#xFF08;reverse&#xFF08;&#x2018;ooo&#x2019;&#xFF09;&#xFF0C;kwargs={&#x2018;year&#x2019;:1111}))
<a href="{% url " ooo' year="1111">

&#x4F20;&#x5165;&#x7684;&#x6570;&#x5B57;&#x53C2;&#x6570;&#x4E00;&#x822C;&#x662F;&#x6570;&#x636E;&#x7684;&#x4E3B;&#x952E;&#x503C;&#xFF01;&#xFF01;
</a>

起因:分布式路由是基于django应用诞生的,有了应用则就应该有分布式路由,主路由不用在处理用户具体路由了,而是转而做请求的分发,具体的请求由各自的应用负责。

&#x4E3B;&#x8DEF;&#x7531;&#x8BED;&#x6CD5;&#xFF1A;
from django.urls import path,include
&#x5339;&#x914D;http://127.0.0.1:8000/music/index--music&#x5E94;&#x7528;path('music/', include('music.urls'))
include('app&#x540D;&#x5B57;.url&#x6A21;&#x5757;&#x540D;')
&#x4F5C;&#x7528;&#x662F;&#x5C06;&#x5F53;&#x524D;path&#x91CC;&#x9762;music&#x8DEF;&#x7531;&#x8F6C;&#x5230;include&#x91CC;&#x9762;&#x7684;&#x8FD9;&#x4E2A;&#x5E94;&#x7528;&#x8DEF;&#x7531;&#x91CC;&#x5904;&#x7406;

&#x5B50;&#x8DEF;&#x7531;&#x8BED;&#x6CD5;&#xFF1A;
&#x624B;&#x52A8;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;urls.py&#xFF0C;&#x7ED3;&#x6784;&#x548C;&#x4E3B;&#x8DEF;&#x7531;&#x5B8C;&#x5168;&#x4E00;&#x6837;
&#x53EA;&#x662F;path&#x540E;&#x9762;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#xFF0C;&#x53EA;&#x9700;&#x7BA1;&#x4E3B;&#x8DEF;&#x7531;path&#x5339;&#x914D;&#x7684;&#x540E;&#x9762;&#x4E00;&#x90E8;&#x5206;

在各路由起别名的时候,由于我们采用的是分布式路由开发,很有可能每个开发人员起的别名是一样的,这样我们在进行反向解析的时候就没有用了!

因此,名称空间的使用很好的解决了这一问题!具体的语法如下:

&#x603B;&#x8DEF;&#x7531;
    re_path(r'^app01/',include('app01.urls',namespace='app01')),
    re_path(r'^app02/',include('app02.urls',namespace='app02'))
&#x89E3;&#x6790;&#x7684;&#x65F6;&#x5019;
app01
urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
]
app02
urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
]
&#x89C6;&#x56FE;&#x5C42;&#xFF1A;
reverse('app01:reg')
reverse('app02:reg')
&#x6A21;&#x677F;&#x5C42;&#xFF1A;
{% url 'app01:reg' %}
{% url 'app02:reg' %}

但其实,我们在起别名的时候只要保证别名不冲突,就没有必要使用名称空间。

一般情况下,有多个app的时候我们在起别名的时候会加上app的前缀,如name=’app01_xxx’,这样就能解决了!

path('page/<int:num>', views.test),
&#x8BF4;&#x660E;&#xFF1A;1.path&#x8F6C;&#x6362;&#x5668;&#xFF1A;&#x53EF;&#x4EE5;&#x7528;&#x6765;&#x6279;&#x91CF;&#x5339;&#x914D;&#x4E00;&#x767E;&#x4E2A;&#x7F51;&#x9875;&#x5206;&#x522B;&#x4E3A;page/1&#x3001;page/2...&#x7B49;
2.&#x8BED;&#x6CD5;&#x4E3A;&#xFF1A;<转换器类型:自定义名>
3.&#x4F5C;&#x7528;&#xFF1A;&#x82E5;&#x8F6C;&#x6362;&#x5668;&#x7C7B;&#x578B;&#x5339;&#x914D;&#x5230;&#x5BF9;&#x5E94;&#x7C7B;&#x578B;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x5219;&#x5C06;&#x6570;&#x636E;&#x6309;&#x7167;&#x5173;&#x952E;&#x5B57;&#x4F20;&#x53C2;&#x7684;&#x65B9;&#x5F0F;&#x4F20;&#x9012;&#x7ED9;&#x89C6;&#x56FE;&#x51FD;&#x6570;
4.&#x8F6C;&#x6362;&#x5668;&#x7684;&#x7C7B;&#x578B;&#xFF1A;str&#xFF1A;&#x5339;&#x914D;&#x9664;&#x4E86;'/'&#x4E4B;&#x5916;&#x7684;&#x975E;&#x7A7A;&#x5B57;&#x7B26;&#x4E32;&#xFF1B;int&#xFF1A;&#x5339;&#x914D;0&#x6216;&#x8005;&#x4EFB;&#x4F55;&#x6B63;&#x6574;&#x6570;&#xFF1B;# slug&#xFF1A;&#x5339;&#x914D;&#x4EFB;&#x610F;&#x7531;ascll&#x5B57;&#x6BCD;&#x6216;&#x6570;&#x5B57;&#x4EE5;&#x53CA;&#x8FDE;&#x5B57;&#x7B26;&#x548C;&#x4E0B;&#x5212;&#x7EBF;&#x7EC4;&#x6210;&#x7684;&#x77ED;&#x6807;&#x7B7E;&#xFF1B;path&#xFF1A;&#x5339;&#x914D;&#x975E;&#x7A7A;&#x5B57;&#x6BB5;&#x3002;
</转换器类型:自定义名></int:num>

Original: https://www.cnblogs.com/suncolor/p/16662018.html
Author: 等日落
Title: django中的路由层

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611326/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 互联网大厂那些儿“高逼格”词汇

    转载请注明出处❤️ 你好,我是测试蔡坨坨。 目前任职于上海某互联网公司测试开发工程师。 相信在互联网公司上班的同学,日常工作中一定听过不少互联网那些”高(zhuang)…

    数据库 2023年6月11日
    0147
  • 基础算法知识

    一、冒泡排序 冒泡排序其实跟握手定理差不多(即A,B,C三人需每两个都都要握手一次 AB,AC,BC) 时间复杂度比较差的O(n²) int[] arrays = {2, 1, 5…

    数据库 2023年6月6日
    0109
  • MySQL实现阶段累加的sql写法 ,eq:统计余额

    最近项目碰到一个新的需求,统计每日充值/消费之后的余额。对于这种需求,其实也很简单,只需要在每次充值/消费后,计算下余额,然后保存下来就可以了。但是对于这种需求,一条sql就能搞定…

    数据库 2023年6月16日
    080
  • MySQL索引:B+树索引

    MySQL索引:B+树索引 B+树索引是传统意义上的索引,这是目前关系型数据库系统中查找最为常用和最为有效的索引。B+树索引的构造类似于二叉树,根据键值快速找到数据 B树 B+树是…

    数据库 2023年5月24日
    073
  • 报错One record is expected, but the query result is multiple records

    总结:出现这种情况,显而易见,就是查询的数据在数据库中不止一条,而我调用的selectOne方法,返回值是一个User对象,导致报错 点击查看错误代码 LambdaQueryWra…

    数据库 2023年6月11日
    0889
  • leetcode 226. Invert Binary Tree 翻转二叉树(简单)

    一、题目大意 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1…

    数据库 2023年6月16日
    071
  • Mysql索引总结

    一、索引分类 Hash索引:Hash 索引查询效率很高,时间复杂度O(1)。Mysql Innodb引擎不支持hash索引的。Hash索引适合精确查找,不适合范围查找。 平衡二叉树…

    数据库 2023年5月24日
    055
  • MySQL8.0 InnoDB并行执行

    概述 MySQL经过多年的发展已然成为最流行的数据库,广泛用于互联网行业,并逐步向各个传统行业渗透。之所以流行,一方面是其优秀的高并发事务处理的能力,另一方面也得益于MySQL丰富…

    数据库 2023年6月9日
    081
  • 分享我常用的一些JS验证和函数

    下面是我常用一些JS验证和…

    数据库 2023年6月9日
    075
  • Vue router-link点击事件不生效

    在学习路由时,想给 贴个代码: index.html 命名视图 <router-link v-on:click=&qu…

    数据库 2023年6月16日
    093
  • Spark学习(3) SparkSQL

    什么事sparkSQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用, 它是将Spark…

    数据库 2023年6月16日
    079
  • Jenkins权限配置

    Jenkins权限配置 需要的插件 一、添加用户 二、修改配置 三、管理添加角色 添加全局查看角色 给全局角色添加用户(Anonymous-任何人) 添加角色(全局,项目) 检查项…

    数据库 2023年6月11日
    070
  • CPU 是如何与内存交互的

    这篇文章主要整理了一下计算机中的内存结构,以及 CPU 是如何读写内存中的数据的,如何维护 CPU 缓存中的数据一致性。什么是虚拟内存,以及它存在的必要性。如有不对请多多指教。 概…

    数据库 2023年6月14日
    079
  • CompletableFuture的简单使用

    日常开发中,我们都会用到线程池,一般会用execute()和submit()方法提交任务。但是当你用过CompletableFuture之后,就会发现以前的线程池处理任务有多难用,…

    数据库 2023年6月14日
    084
  • 计算机图形学

    计算机图形学 光追一般指光线追踪。 光线跟踪(也叫ray tracing或者光束投射法)。是一个在二维(2D)屏幕上呈现三维(3D)图像的方法。 BRDF是双向反射分布函数(Bid…

    数据库 2023年6月14日
    064
  • [SQLServer]NetCore中将SQLServer数据库备份为Sql脚本

    描述: 最近写项目收到了一个需求, 就是将 SQL Server数据库备份为Sql脚本, 如果是My Sql之类的还好说, 但是在网上搜了一大堆, 全是教你怎么操作 SSMS的, …

    数据库 2023年6月9日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球