Django:路由系统

本文深入探讨了Django的路由系统,详细介绍了URLconf的配置、URL匹配流程、导入其他URLconf、动态URL参数、查询字符串参数、URL参数类型转换器、URL跳转以及命名空间等内容。通过实例解析了如何使用path和re_path函数,以及如何处理URL中的动态参数和查询字符串。此外,还讨论了自定义URL参数类型转换器和URL映射时的默认参数设置,帮助读者全面理解Django中URL路由的工作原理和最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

路由系统理解

1、系统功能:根据用户访问的不同url,执行对应的视图函数

2、web服务器可以根据用户访问的url地址的不同,返回相应的html页面,而html的页面渲染由视图函数处理,这就需要有一个模块负责分析用户访问的url地址,并根据预先定义的映射规则,将请求分发到不同的视图函数中进一步处理,负责这个工作的模块就是web框架中的路由系统。路由系统的工作总结起来就是:制定路由规则,分析url,分发请求到响应视图函数中

3、为了给应用程序设计URL,开发人员需要开发一个Python模块,这个模块就是就是URL的配置信息,通常将这个配置模块叫做URLconf。这个模块是一个纯粹的Python脚本,它包含了URL表达式与Python方法(视图)之间的映射,这里所说的Python方法就是Django应用中的视图方法。(如前面那章中的根目录下的urls.py和各个app下的urls.py都是URLconf实例)

4、路由系统的路由功能基于路由表,路由表是预先定义好的url和视图函数的映射记录。换句话说,可以理解成将url和视图函数做了绑定,映射关系有点类似一个python字典

5、路由表的建立是控制层面,需要在实际业务启动前就准备完毕,即:先有路由,后有业务。一旦路由准备完毕,业务的转发将会完全遵从路由表的指导

6、URL配置(URLconf)的本质是:URL与该URL调用的视图函数之间的映射表。以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码

例1:

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path("login/",include("Login.urls")),#新增登录路由
]

注:

1、上面例子中定义了两个url,分别是admin/和login/,其中admin/直接对应的是处理函数(视图,admin.site.urls),而login/对应的则是一个app下的url子配置文件,因此需要在其子配置中找其对应的视图

 

URLconf基本格式

1、所有的url路径和对应的视图映射都是写在"urlpatterns"中的,只是说分为根目录下的根配置(urls.py)和各个应用程序app下的子配置(urls.py)

2、所有的映射不是随便写的,而是使用"path"函数或者"re_path"函数进行包装的

urlpatterns = [
         path(正则表达式, views视图函数,字典型参数,别名),
]

'''
参数说明:
    一个正则表达式字符串或具体的url字符串
    一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
    可选的要传递给视图函数的默认参数(字典形式)
    一个可选的name参数
'''

 

Django处理HTTP请求的流程

当用户发起一个HTTP请求时,Django就会按照以下逻辑对请求进行处理:

1、确定URL根配置位置:通常URL根配置在ROOT_URLCONF中设置:URL的根配置在根目录下的setting.py文件中,由项目名.urls组成,即指向根目录下的urls.py文件。因此每次请求时都会根据该配置先确定URL根配置在哪里,然后去对应配置文件中找url配置信息(ROOT_URLCONF是默认设置好了的,不需要修改)

ROOT_URLCONF = 'Web.urls'

2、加载配置信息,在配置信息中查找urlpatterns:即加载根目录下的urls.py文件中的URL配置

urlpatterns = [
    path('admin/', admin.site.urls),
    path("url路劲",对应的视图函数或应用程序下的urls.py文件),
]

3、按顺序检索urlpatterns中的所有URL模式字符串,并定位在第一个与URL匹配的URL模式字符串:即由请求中的URL匹配到urlpattern中的URL,进而确认对应的视图函数或子urls.py文件

4、当检索到匹配的URL模式字符串后,调用对应的视图方法,并传递以下参数给视图方法
    ⑴一个HttpRequest对象实例
    ⑵如果匹配到的URL模式字符串不包含任何组,那么匹配的信息会作为位置参数传递给视图
    ⑶如果在URLconf中没有找到任何匹配的URL模式字符串,或者出现其他任何错误,Django将会调用一个处理错误信息的视图

5、因此:请求时必须保证访问的URL与定义的URL完全一致

例1:

⑴编辑视图函数

⑵编辑URL映射

⑶访问

 

导入其他URLconf

1、对于现代Web应用程序来说,一个工程下通常包含多个应用程序(app),每个应用程序中又会包含很多URL,如果将这些URL都写在URLconf根模块中的话,那么URLconf将会变得非常臃肿,不利于维护。对于这种情况,常用的解决办法就是为每一个应用程序写一套独立的URLconf,而URLconf根模块可以通过使用include()方法将其他应用程序的URLconf引用进来

2、如果把所有app的views视图路由都放在根目录下的urls.py文件中进行映射,肯定会让代码显得非常乱,因此django给我们提供一个方法,可以在app内部包含自己的url匹配规则,而在根目录下的urls.py中再统一包含着个app的urls。使用这个技术需要借助include()函数

3、上面两点的实现方法叫叫做:分布式路由

4、在Django中采用的是分布式路由
   ⑴ 在根URLConf中:定义到各个应用程序APP的URL路由,指向应用程序APP下的urls.py文件(使用include('应用程序名.urls')方法来指定)
   ⑵ 在各个子URLConf中:定义到对应视图函数的URL路由,指向视图函数

例2:
有一个名为"图书"的app:该app下的所有url都是以"book/"开始的,如book/s/2/2/2等(同一个app下的所有url都是同样的开头,后面再具体细分)

⑴编写根目录下的urls.py文件:URLconf根模块
    ①因为现在app"图书"下的所有URL都是以book/开头的,因此我们可以将"book/"这块放到根目录下的urls.py中:这就表示,只要请求的url是以'book/'开头的,就会进入到这个app下的子urls.py中去,不是以"book/"开头的 就不会进去匹配
    ②前面我们的例子中:我们是将完整的url都放到了子urls.py文件中,而根目录下的urls.py我们我们配置的是空字符串。这样的话表示的是请求的每个url都会到每个子urls.py中去匹配一次,这样就会浪费资源

⑵编写应用程序下的urls.py文件:URLconf子模块
注:因为在根URLconf下定义的是"book/",这里面已经有斜杠了,所以在子URLconf中的url就不需要以斜杠开头了。如果根URLconf下定义的是"book",那子URLconf中的url就需要以斜杠开头了

⑶访问url


注:上面例子中我们访问了两个不同的app下的url(login和book)

1、在访问book时:首先在URLconf根模块中匹配login时未匹配上,因此不会进入到其对应的urls.py文件中。匹配到book时,匹配成功,然后就进入到其对应的urls.py文件中再继续进行匹配

2、在访问login时:跟上面步骤一样

3、在app的urls.py中,所有的url匹配也是要放在一个名为urlpatterns的变量中,否则找不到(与根URLconf一样)

4、url会根据URLconf根模块(根目录下的urls.py)和URLconf子模块(app下的urls.py)进行拼接,所以需要注意不要多加斜杠

例2_1:分布式路由

⑴编辑根URLConf

⑵编辑子URLConf

⑶访问

 

URL:动态URL参数

1、前面介绍的URL都是固定的,即一开始就是在URLconf中定义、配置好了的,用户只需要输入正确的URL就能访问到对应的页面,如果输入了错误的URL,就不会访问到页面了

2、但实际上,在网页应用中,很多情况下需要动态编写URL,而不是用户直接在浏览器中输入URL,例如网页超链接的URL需要在生成网页时固定好

3、有时候,url中包含了一些参数需要动态调整。比如简书某篇文章的详情页面的URL是:https://www.jianshu.com/p/0aa957b19adfd,另一篇文章的url又是:https://www.jianshu.com/p/e10773fb1ebf
    ⑴这两个URL中实际上不同的就是后面那串数字(e10773fb1ebf)
   ⑵ 试想一下,如果每篇文章都用前面那种定义URL的方法去定义配置一个URL的话,那就会显得很繁琐且浪费资源
    ⑶因此,就可以在定义、配置URL的时候将后面这串数字定义成一个可变的(就跟我们在定义函数时一样,使用形参来代替实参,不论实参怎么变,形参都是一个)
    ⑷前面两个URL中最后那串数字,实际就是这篇文章的ID,那么简书的文章详情页面的URL就可以写成https://www.jianshu.com/p/<id>,其中id就是文章的id
    ⑸即在发出请求时由客户端(HTML之类的)捕捉到这篇文档的ID,然后动态的生成这篇文章的URL,进而进行请求

4、在Django中要动态的生成URL参数,可以使用尖括号的形式来定义一个参数(也可以在url中定义多个变量参数)。通过URL中传递参数给视图函数

5、也就是在url中捕获参数:在url规则中使用<变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值