️️个人简介:以山河作礼。
️️:Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人
:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读!
:文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。
在实际开发过程中,一个Django 项目会包含很多的 app ,这时候如果我们只在主路由里进行配置就会显得杂乱无章,所以通常会在每个 app里,创建各自的 urls.py 路由模块,然后从根路由出发,将 app 所属的 url 请求,全部转发到相应的 urls.py模块中。而这个从主路由转发到各个应用路由的过程叫做路由的分发,而它的实现是使用include() 函数来完成的
include
是Django路由系统的一个重要组成部分,它允许我们将一个应用程序的URL模式与另一个应用程序的URL模式组合在一起,从而创建更复杂的URL映射。我们可以使用include
函数在urlpatterns
中嵌套URL配置。
使用include
的通用语法如下:
path('prefix/', include('app.urls')),
prefix
是目标URL前缀,app.urls
是目标应用程序的URL配置模块。include
,我们可以将多个Django应用程序相互分离,每个应用程序负责处理其内部的URL。但是,如果某个URL模式需要跨越应用程序,则可以使用include
将多个应用程序内的URL组装起来。例如,假设我们有两个应用程序,一个名为blog
,一个名为news
(需要注册app到项目中)。blog
应用程序处理所有博客相关的URL,news
应用程序将管理所有新闻相关的URL。为了构建这些应用程序的URL,我们可以使用Django的include
函数,将它们组合到一个目录下。
首先,我们需要在blog
应用程序中定义自己的URL模式:
# blog/urls.py
from django.urls import path, include
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('about/', views.about, name='about'),
# ...
]
接下来,在news
应用程序中定义自己的URL模式:
# news/urls.py
from django.urls import path, include
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('about/', views.about, name='about'),
# ...
]
现在,我们可以在我们的主应用程序中使用include
函数将这两个URL模式合并到一起:
# myproject/urls.py
from django.urls import include, path
urlpatterns = [
path('blog/', include('blog.urls')),
path('news/', include('news.urls')),
]
在上述代码中,我们使用
include
函数将所有与blogs相关的URL映射到前缀为blog/
的路径下,所有与news相关的URL映射到前缀为news/
的路径下。这样,我们就可以通过输入相应URL路径来访问到它们了。
总之,include
函数是建立复杂URL路由的重要工具,它允许我们创建高度模块化的应用程序,并将多个URL模式拼凑成一个完整的URL映射。
使用反向解析(reverse)创建URL能够带来以下好处:
在需要解析 URL 的地方,Django 提供了不同的方式来实现 URL 反向解析:
我们对前两种方法进行实例讲解。首先我们需要在 index/urls.py 路由文件中对 index 应用进行注册,使用如下方式来完成注册:
app_name='index' #写在开始位置即可
在index/urls.py 的路由列表中给 test/
添加相应的 name 参数,如下所示:
from django.urls import path
from index import views
app_name='index'
urlpatterns=[
path('test/',views.index_html,name='detail_hello'),
]
然后在 templates/index 目录下新建 newtest.html 并编写如下代码:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<a href=" {% url 'index:detail_hello' %}">点击继续a>
<p>一起去酒吧嗨翻天。p>
body>
html>
最后在 index\views.py 编写视图函数并配置相应路由映射,如下所示:
#视图函数
def redict_url(request):
return render(request,'index/newtest.html')
#路由映射
urlpatterns=[
path('redict/',views.redict_url),
]
最终通过访问 http://127.0.0.1:8000/index/redict/ 可以实现反向解析页面跳转。
reverse() 函数是在视图函数中实现反向解析的一种方式,它通常与配合 HttpResponseRedirect(http 重定向) 一起使用。我们再结合上面的例子来讲解,那么它理解与使用起来就会非常的简单,首先我们 index/views.py 中定义一个视图函数,如下所示:
from django.http import HttpResponseRedirect
from django.urls import reverse
#reverse函数实现反向解析重定向到我们想要的有页面
def test_to_reverse(request):
return HttpResponseRedirect(reverse('index:detail_hello'))
#在index/urls.py中为视图函数配置路由
urlpatterns=[
path('test/',views.index_html,name='detail_hello'),
path('reverse/',views.test_to_reverse)
]
注意:在分发式路由中使用 index:detail_hello 也就是“应用名:url 别名”,如果不是分发式路由可以直接使用 url 别名,即 reverse(‘detail_hello’)
最后访问 http://127.0.0.1:8000/index/reverse/ 可以直接重定向到 http://127.0.0.1:8000/index/test/。
上面我们使用 reverse 函数完成了视图函数的重定向,但是这里还要给大家简单介绍一下 reverse() 函数。在 Django中 reverse() 的定义如下所示:
reverse(viewname,urlconf=None,args=None,kwargs=None,current_app=None)
它只有一个必填参数,其他都是可选参数。其中 viewname 参数除了可以接受 url 路由 name 的别名以外,还可以接受可调用视图函数对象作为参数。示例如下:
from BookStore import views
def test_to_reverse(request):
return HttpResponseRedirect(reverse(views.test_url))
其他参数说明如下:
我们知道一个 Django 项目中可以创建多个应用,每个应用又可以定义很多的视图函数,所以就会有很多的 url 路由映射(简称 url模式),在这种情况下给 url 命名就难免会发生命名冲突, Django 为了解决这一问题,为开发者提供了命名空间功能即namespace。url 命名空间使得即使在不同的应用(app)中定义了相同的 url 名称,也能够正确的实现 url 反向解析。
下面为了让大家更好的理命名空间的概念,我们对本节的示例进行改写,首先在主路由 BookStore/urls.py 的 url 模式列表中,使用 namespace 参数给 index 应用添加命名空间。如下所示:
urlpatterns = [
path('index/',include('index.urls', namespace='books'))
]
在 index 应用的 urls.py 中添加(若之前已经添加则无需再重新添加)如下所示:
app_name="books"
经过上面的设置我们就完成了 index 应用的命名空间操作,这样即使是不同的应用存在相同 url 名称,Django 也能精准的解析我们想要的 url 路径。