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)

大家都在看

  • Linux–>磁盘分区,挂载

    对于IDE硬盘,驱动器标识符为 “hdx~”,其中”hd”表明分区所在设备类型,这里是指IDE硬盘 “x”为…

    数据库 2023年6月14日
    0100
  • MySQL–排序检索数据(ORDER BY)

    检索出的数据并不是以纯粹的随机顺序显示的。如果不排序,数据一般将以它在底层表中出现的顺序显示。这可以是数据最初添加到表中的顺序。但是,如果数据后来进行过更新或删除,则此顺序将会受到…

    数据库 2023年6月16日
    079
  • MySQL启动过程详解五:GTID的处理

    MySQL启动过程中 GTID 的处理: 在核心模块启动函数 init_server_components() 会调用 gtid_server_init() 初始化 gtid se…

    数据库 2023年6月9日
    086
  • 系统稳定性—OutOfMemoryError常见原因及解决方法

    当 JVM内存严重不足时,就会抛出 java.lang.OutOfMemoryError错误。本文总结了常见的 OOM原因及其解决方法,如下图所示。如有遗漏或错误,欢迎补充指正。 …

    数据库 2023年6月11日
    0103
  • mysql中group by,having,order by,limit,distinct的用法和简单的的多表查询

    group:组 by:通过 group by :通过….。分组group by列名:通过指定列来分组 一般情况下在题目中出现 “每个” &#82…

    数据库 2023年6月16日
    0116
  • QT槽函数获取信号发送对象

    Qt 在槽函数中获取信号发送对象 Qt中提供了一个函数 qobject_cast(QObject *object),可以通过这个函数判断信号发出对象 Qt 帮助文档的解释:Retu…

    数据库 2023年6月16日
    0136
  • Github上传代码慢

    设置git全局代理 查看代理 git config –global http.proxy git config –global https.proxy 如果你想让clone命令…

    数据库 2023年6月14日
    081
  • 五分钟搞懂POM设计模式

    大家好,我是测试蔡坨坨。 今天,我们来聊聊Web UI自动化测试中的POM设计模式。 前期,我们学会了使用Python+Selenium编写Web UI自动化测试线性脚本 线性脚本…

    数据库 2023年6月11日
    0113
  • 实现一个简单的Database2(译文)

    前文回顾:实现一个简单的Database1(译文) 译注:cstsck在github维护了一个简单的、类似sqlite的数据库实现,通过这个简单的项目,可以很好的理解数据库是如何运…

    数据库 2023年6月11日
    0105
  • Java面试题(四)–RabbitMQ

    1、MQ有哪些使用场景?(高频) 异步处理:用户注册后,发送注册邮件和注册短信。用户注册完成后,提交任务到 MQ,发送模块并行获取 MQ 中的任务。 系统解耦:比如用注册完成,再加…

    数据库 2023年6月16日
    082
  • MySQL8.0.26的安装与配置——详细教程

    网上的教程有很多,基本上大同小异。 但是安装软件有时就可能因为一个细节安装失败。 我也是综合了很多个教程才安装好的,所以本教程可能也不是普遍适合的。 二、Mysql 配置 1.解压…

    数据库 2023年6月9日
    092
  • Java并发编程之CAS

    在Java并发编程的世界里,synchronized 和 Lock 是控制多线程并发环境下对共享资源同步访问的两大手段。其中 Lock 是 JDK 层面的锁机制,是轻量级锁,底层使…

    数据库 2023年6月11日
    074
  • 你的 SQL 还在回表查询吗?快给它安排覆盖索引

    什么是回表查询 小伙伴们可以先看这篇文章了解下什么是聚集索引和辅助索引:Are You OK?主键、聚集索引、辅助索引,简单回顾下,聚集索引的叶子节点包含完整的行数据,而非聚集索引…

    数据库 2023年5月24日
    085
  • IDEA中如何查看接口的所有实现类呢?

    接口是我们日常开发中常用的操作,那么如何查看一个接口有哪些实现类呢?下文笔者将讲述IDEA编辑器中 查看实现类的快捷方法,如下所示 在spring源码阅读中,每一个接口都有很多实现…

    数据库 2023年6月11日
    079
  • 一条SQL查询语句是如何执行的?

    MySQL是典型的 C/S&#x67B6;&#x6784;(客户端/服务器架构),客户端进程向服务端进程发送一段文本(MySQL指令),服务器进程进行语句处理然后返…

    数据库 2023年5月24日
    082
  • git 清除账号密码缓存

    配置用户名和邮箱: git config –global user.name “username”git config –globa…

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