2015-02-06 51 views
1

我从Django开始,让我感到困惑的是URL命名空间的规范。据我了解,你在网站项目urls.py指定它们,就像这样:在网站url.py中指定Django URL命名空间的原因是什么?

urlpatterns = patterns('', 
    url(r'^polls/', include('polls.urls', namespace="polls")), 
    url(r'^admin/', include(admin.site.urls)), 
) 

而在此之后,命名空间可以在民意调查中的应用程序模板使用。

我担心的是:为什么命名空间没有在应用程序中指定,它可以被重用并在另一个站点中获得另一个命名空间,因此模板不再工作。我正在考虑Java中的包或者C++中的名称空间,这些都是在库中定义的,而不是在使用应用程序中定义的。

所以有人可以向我解释,为什么这是这样设计的?

感谢 汉纳斯

回答

1

这样的设计为您提供更多的灵活性。您可以使用不同的命名空间在项目中添加一个应用程序的两个实例(例如,针对不同类型用户的两个管理面板)。

此外,Django在urls中有两种类型的应用程序命名空间。应用程序名称空间与java中的包或C++中的名称空间相同,它是唯一的应用程序名称,您可以在模板中使用它。

除了Django的服务应用程序实例的命名空间,当你在你的例子中写道:

urlpatterns = patterns('', 
    url(r'^polls/', include('polls.urls', namespace="polls")), 
    url(r'^admin/', include(admin.site.urls)), 
) 

在这个例子中管理应用程序是由应用程序命名为“admin”访问,调查程序是可访问的应用程序实例命名空间“池',你明确定义。

您可以在文档阅读更多关于命名空间: https://docs.djangoproject.com/en/1.7/topics/http/urls/#url-namespaces

应用命名空间

这说明了正在部署的应用程序的名称。 单个应用程序的每个实例将具有相同的应用程序 命名空间。例如,Django的管理应用程序有一些 可预测的应用程序名称空间'admin'。

实例命名空间

这标识的应用的特定实例。实例 命名空间在整个项目中应该是唯一的。不过,实例名称空间可以与应用程序名称空间相同。此 用于指定应用程序的默认实例。例如, 默认的Django管理实例具有一个实例名称空间“admin”。

网址调度员查找由应用程序的命名空间首先,在那之后,如果没有匹配查找由实例名称空间试图扭转URL时: https://docs.djangoproject.com/en/1.7/topics/http/urls/#reversing-namespaced-urls