🏘️🏘️个人简介:以山河作礼。
🎖️🎖️:Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人
🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读!
🎁🎁:文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。
Django路由
路由分发函数
在实际开发过程中,一个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映射。
反向解析
- 我们知道每个视图函数都有一个和其相对应的路由,但是如果它们之间的匹配关系发生了变化,那么与之对应的访问地址也需要跟着发生改变,这是极其不方便的。
- 因此我们可以用一种动态解析 url 的方法来避免。我们使用 Path 语法提供的 name
属性给对应路由起别名,从而让与之对应的链接或者跳转,会根据这个别名来动态解析 url,这个动态解析 url 路径的过程就是反向解析。 - 在处理业务需求的过程中,当我们遇到重定向或在模板中需要链接到其他的视图函数,在这两种场景下我们就会使用到 url
的反向解析,而不使用硬编码的方式将 url 放在模板中。这样做的优势在于当 URL 发生变化后,也无须我们更改模板中的 URL。
使用反向解析(reverse)创建URL能够带来以下好处:
- 代码可维护性更高: 当你需要修改某个URL时,只需要修改该URL所关联的name或者将其修改为另一个URL,而不需要在整个代码库中寻找和更新它的引用。这可以节省大量的时间并减少一些常见的错误。
- 支持重构: 在代码重构中,大部分无法自动更新的URL都与Django应用程序中的地址相关。使用反向解析,这些URL可以更安全容易地重命名、布局或重新分组。
- 更易于语义化和可读性:如果你在代码中使用具有描述性名称的命名URL模式,则你的代码将更容易理解并增加可读性。因此,你的代码更适合他人阅读并更具可维护性。
反向解析应用
在需要解析 URL 的地方,Django 提供了不同的方式来实现 URL 反向解析:
- 在模板层使用 {% url %} 模板标签;
- 在视图函数的 Python 代码中:使用 reverse() 函数;
我们对前两种方法进行实例讲解。首先我们需要在 index/urls.py 路由文件中对 index 应用进行注册,使用如下方式来完成注册:
app_name='index' #写在开始位置即可
使用url标签实现反向解析
在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>Title</title>
</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()函数实现反向解析
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 函数完成了视图函数的重定向,但是这里还要给大家简单介绍一下 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))
其他参数说明如下:
- urlconf:这个属性用于决定当前的反向解析使用哪个 URLconf 模块,默认是根 URLconf;
- args:它用于传递参数,可以是元组或者列表,顺序填充 url 中的位置参数;
- kwargs:字典类型的传参,和 args 作用一样;
- current_app:它指定当前视图函数所在的 app,本例中是 index 应用。
命名空间namespace
我们知道一个 Django 项目中可以创建多个应用,每个应用又可以定义很多的视图函数,所以就会有很多的 url 路由映射(简称 url模式),在这种情况下给 url 命名就难免会发生命名冲突, Django 为了解决这一问题,为开发者提供了命名空间功能即namespace。url 命名空间使得即使在不同的应用(app)中定义了相同的 url 名称,也能够正确的实现 url 反向解析。
- URL 命名空间分为两个部分:第一,应用命名空间即使用 app_name 关联应用名字;第二,使用 namespace
用来标识一个应用的实例,主要功能是区分同一个应用中不同的实例。
下面为了让大家更好的理命名空间的概念,我们对本节的示例进行改写,首先在主路由 BookStore/urls.py 的 url 模式列表中,使用 namespace 参数给 index 应用添加命名空间。如下所示:
urlpatterns = [
path('index/',include('index.urls', namespace='books'))
]
在 index 应用的 urls.py 中添加(若之前已经添加则无需再重新添加)如下所示:文章来源:https://www.toymoban.com/news/detail-517665.html
app_name="books"
- 虽然在使用include()函数包含其他应用程序的URLconf时使用了"namespace=‘books’"参数来区分 URL 名称空间,但是为了使Django完全正确地处理 URL 命名空间,还需要在已经包含的应用程序的 URLconf 中设置
“app_name” 变量,以指定该应用程序的命名空间名称。 - 这主要是因为模板中的 reverse() 或 url() 函数可以使用命名空间来解析 URL。这也就是说,如果不设置 app_name
变量,则这些函数可能无法正确解析 URL 并将引起反向完成错误。
经过上面的设置我们就完成了 index 应用的命名空间操作,这样即使是不同的应用存在相同 url 名称,Django 也能精准的解析我们想要的 url 路径。文章来源地址https://www.toymoban.com/news/detail-517665.html
到了这里,关于Django基础入门⑧:Django路由详细讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!