Django基础入门⑧:Django路由详细讲解

Django基础入门⑧:Django路由

  • Django路由
      • 路由分发函数
      • 反向解析
      • 反向解析应用
        • 使用url标签实现反向解析
        • reverse()函数实现反向解析
        • reverse() 函数简析
      • 命名空间namespace

️️个人简介:以山河作礼。
️️: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能够带来以下好处:

  1. 代码可维护性更高: 当你需要修改某个URL时,只需要修改该URL所关联的name或者将其修改为另一个URL,而不需要在整个代码库中寻找和更新它的引用。这可以节省大量的时间并减少一些常见的错误。
  2. 支持重构: 在代码重构中,大部分无法自动更新的URL都与Django应用程序中的地址相关。使用反向解析,这些URL可以更安全容易地重命名、布局或重新分组。
  3. 更易于语义化和可读性:如果你在代码中使用具有描述性名称的命名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>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()函数实现反向解析

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 中添加(若之前已经添加则无需再重新添加)如下所示:

app_name="books"
  • 虽然在使用include()函数包含其他应用程序的URLconf时使用了"namespace=‘books’"参数来区分 URL 名称空间,但是为了使Django完全正确地处理 URL 命名空间,还需要在已经包含的应用程序的 URLconf 中设置
    “app_name” 变量,以指定该应用程序的命名空间名称。
  • 这主要是因为模板中的 reverse() 或 url() 函数可以使用命名空间来解析 URL。这也就是说,如果不设置 app_name
    变量,则这些函数可能无法正确解析 URL 并将引起反向完成错误。

经过上面的设置我们就完成了 index 应用的命名空间操作,这样即使是不同的应用存在相同 url 名称,Django 也能精准的解析我们想要的 url 路径。

你可能感兴趣的:(Web全栈开发,django,python,后端)