Django URL反向解析:命名空间与实例详解
本文详解Django中URL反向解析的命名空间机制,区分application namespace与instance namespace。通过polls示例展示reverse()函数结合current_app参数的使用,说明如何根据当前实例或默认实例正确解析URL,适用于Django 2.0及以上版本。
本文介绍Django框架中URL反向解析的具体实现方式,供开发者参考。
在深入之前,需要明确几个核心概念:
1、Application Namespace(应用命名空间):
指正在部署的App名称。若同一App有多个部署实例,它们应共享相同的Application Namespace。
可在URLconf模块(即urls.py)中通过设置与urlpatterns同级的app_name属性来指定Application Namespace。注意:在Django 2.0版本中,必须设置app_name。
2、Instance Namespace(实例命名空间):
表示App的特定部署实例,在当前项目中必须唯一。一个App可以拥有多个不同的Instance Namespace。
3、默认实例(Default Instance of Application):
当Instance Namespace与所属App的Application Namespace相同时,该实例即为默认实例。
4、当前实例(Current Instance):
调用reverse()函数时,可通过current_app参数指定当前正在处理的App实例。
当尝试反向解析带有命名空间的URL(例如'polls:index')时,Django会将名称拆分为多个部分,并按以下逻辑查找:

参考Django文档中的示例,假设polls应用有两个部署实例:'publisher-polls'和'author-polls'。
#urls.py
from django.conf.urls import include, url
urlpatterns = [
url(r'^author-polls/', include('polls.urls', namespace='author-polls')),
url(r'^publisher-polls/', include('polls.urls', namespace='publisher-polls')),
]
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
...
]
基于上述配置,可使用如下方式进行查询:
此时,'polls:index'的命名空间与当前App的Application Instance(即app_name)相匹配。若其中一个实例为当前应用实例(current),例如正在渲染'author-polls'的detail视图,'polls:index'将解析至'author-polls'实例的index页面。以下两种方式均返回'/author-polls/':
在类视图中:
reverse('polls:index', current_app=self.request.resolver_match.namespace)
在模板中:{% url 'polls:index' %}
若不存在当前实例(current),例如在站点其他位置渲染页面,'polls:index'将解析至polls中最后注册的实例。由于没有默认实例(即Instance Namespace为'polls'的实例),系统将使用polls注册的最后一个实例。在此例中,因'publisher-polls'位于urlpatterns末尾,故解析至该实例。
若解析'author-polls:index',则直接定位至'author-polls'的index页面。此时Namespace为'author-polls',无法与Application Namespace匹配,根据上述流程将直接查找Instance Namespace。
若上述App还存在一个名为'polls'的默认实例,则第二种情况'polls:index'将解析至该默认实例,而非urlpatterns中最后声明的实例。
以上内容为本文全部介绍,希望有助于大家的学习,欢迎继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









