【补充】Django中路由分发的本质

发布时间 2023-07-21 15:52:32作者: Chimengmeng

【补充】Django中路由分发的本质

【一】路由分发机制

  • 在Django中,admin 路由分发的本质是将管理员后台管理功能与应用程序正常的 URL 分发机制进行了分离。
  • admin 路由分发可以让开发者方便地创建、配置和管理应用程序的后台管理界面。

【二】关键部分

  • admin.site.register(model):

    • 通过调用 admin.site.register() 方法,将应用程序中的模型(Model)注册到管理员后台。

    • 这样,Django 就知道要为这些模型提供哪些默认的管理功能

      • 如列表显示、搜索、过滤、添加、编辑、删除等。
  • admin.autodiscover():

    • 该方法被用于自动发现应用程序中的 admin.py 文件,以便导入其中的 admin 实例。

    • 在 Django 的设置文件中,通常会包含这样一行代码:

      • admin.autodiscover()

      • 这会触发 Django 在每个应用程序中查找 admin.py 文件

      • 并将其导入到管理员后台。

  • admin.site.urls:

    • 在项目的 URL 配置中,通常会包含一个路由模式,即将 ^admin/ 路径匹配到 admin.site.urls
    • 这个 URL 模式实际上将所有以 admin/ 开头的请求都分发给了管理员后台的视图函数。
    • Django 的 admin.site.urls 内部使用了一些 URL 配置和视图处理来渲染和处理后台管理界面的相关请求。
  • 通过以上的机制,Django 的 admin 路由分发可以将管理员后台的 URL 请求与应用程序正常的 URL 分发机制进行隔离,并提供一套功能强大、易于配置和扩展的后台管理界面。
  • 开发者可以在 admin.py 文件中自定义注册的模型的显示方式、过滤器、搜索字段、编辑表单等各个方面,以满足具体业务需求。

【三】案例演示

path('admin/', ([],None,None)),
  • admin路由分发的本质是使用include函数将admin.site.urls包含进项目的URL配置中。
  • 具体来说
    • admin.site.urls实际上是一个AdminSite类的实例
      • 其中定义了一个名为urls的装饰器。
    • 这个装饰器返回了一个三元组
      • 包含了后台管理界面的URL配置、名称和命名空间。
  • 当我们在项目的URL配置中使用include('admin.urls')或者path('admin/', admin.site.urls)
    • Django会将后台管理界面的URL配置追加到主URL配置中
    • 从而使得以admin/开头的URL都可以被匹配。
  • AdminSite类中的urls装饰器的具体实现是通过定义一个property属性
    • 返回了self.get_urls(), 'admin', self.name
    • 这里的self.get_urls()实际上调用了AdminSite类的get_urls方法
    • 用于获取后台管理界面的URL配置列表。
  • 通过这种方式,我们可以在项目的URL配置中套娃无限制地添加多层级的URL,构建复杂的 URL 分发结构。
    • 比如,可以在admin/路径下再嵌套其他路径和视图函数,形成多层级的后台管理界面。
  • 以下是一个完整且稍微复杂一点的案例演示:
from django.contrib import admin
from django.urls import include, path
from django.http import HttpResponse

def index(request):
    return HttpResponse("This is the index page.")

urlpatterns = [
    # 主页
    path('', index, name='home'),

    # 后台管理界面
    path('admin/', admin.site.urls),

    # 自定义的二级路径
    path('custom/', include([
        # 二级路径下的一级路径
        path('level1/', include([
            # 二级路径下的一级路径下的二级路径
            path('level2/', include([
                # 二级路径下的一级路径下的二级路径下的三级路径
                path('level3/', index, name='custom-level3'),
            ])),
        ])),
    ])),
]
  • 在上述代码中,我们定义了一个带有自定义路径的URL配置,包括了主页和后台管理界面。
    • 在自定义路径的部分,我们通过include函数进行嵌套,形成了多层级的URL结构。
  • 其中
    • 后台管理界面被包含在admin/路径下,而自定义路径则为custom/
    • custom/路径下又包含了多层级的路径,最终指向了一个名为custom-level3的视图函数。
  • 通过这样的URL配置
    • 我们可以实现非常灵活的URL分发,并构建符合我们项目需求的后台管理界面和其他自定义功能页面。