我从Django开始,令我困惑的是URL命名空间的规范。据我所知,你在网站项目urls.py中指定它们,如下所示:
urlpatterns = patterns('',
url(r'^polls/', include('polls.urls', namespace="polls")),
url(r'^admin/', include(admin.site.urls)),
)
之后,命名空间可用于民意调查应用程序的模板。
我关心的是:为什么未在应用程序中指定名称空间,可以重用该名称空间并在另一个站点中获取另一个名称空间,因此该模板不再起作用。我正在考虑使用Java中的包或C ++中的命名空间,这些包在库中定义而不是在使用应用程序中。
所以有人可以向我解释,为什么这个设计就像它一样?
由于 汉纳斯
答案 0 :(得分:1)
此设计为您提供更大的灵活性。您可以在项目中使用不同的命名空间添加一个应用程序的两个实例(例如,针对不同类型的用户使用两个管理面板)。
此外,Django为url中的应用程序提供了两种类型的命名空间。应用程序命名空间与Java中的包或C ++中的命名空间相同,它是唯一的应用程序名称,您可以在模板中使用它。
正如您在示例中所写的那样,Django还提供app实例名称空间:
urlpatterns = patterns('',
url(r'^polls/', include('polls.urls', namespace="polls")),
url(r'^admin/', include(admin.site.urls)),
)
在此示例中,管理员应用程序可以通过应用程序命名空间“管理员”访问,并且轮询应用程序可由应用程序实例名称空间“池”访问,您可以明确定义它们。
您可以在文档中阅读有关命名空间的更多信息: https://docs.djangoproject.com/en/1.7/topics/http/urls/#url-namespaces
应用程序命名空间
这描述了正在部署的应用程序的名称。 单个应用程序的每个实例都将具有相同的应用程序 命名空间。例如,Django的管理应用程序有点 可预测的应用程序命名空间' admin'。
实例名称空间
这标识了应用程序的特定实例。例 命名空间在整个项目中应该是唯一的。但是,一个 实例名称空间可以与应用程序名称空间相同。这个 用于指定应用程序的默认实例。例如, 默认的Django管理实例的实例名称空间为' admin'。
Url调度程序首先按app命名空间查找,然后在尝试反向url时,如果实例名称空间没有匹配项查找: https://docs.djangoproject.com/en/1.7/topics/http/urls/#reversing-namespaced-urls