真实的例子命名空间 URL

我研究了文件 Django, 但面对我无法理解的部分:如何在真正问题中使用命名空间的真实例子是什么。 我知道语法,但我不知道这个目的。
已邀请:

莫问

赞同来自:

通常,他们用来了 URLs 每个应用于自己的命名空间。 这可以防止功能
reverse//

Django 以及模板的功能
{% url %}

从返回错误 URL, 因为模板的名称 URL 不小心在另一个应用程序中恰当地吻合。

我在项目级文件中拥有的内容
urls.py

在下之中:


from django.conf.urls.defaults import *
from django.conf import settings
from django.contrib import admin
admin.autodiscover//

urlpatterns = patterns/'',
url/r'^$', 'main.views.main', name='main'/,
url/r'^login$', 'django.contrib.auth.views.login', name="login"/,
url/r'^logout$', 'django.contrib.auth.views.logout',
{"next_page": "/"}, name="logout"/,

# Admin
url/r'^admin/doc/', include/'django.contrib.admindocs.urls'//,
url/r'^admin/', include/admin.site.urls//,
/

# Auto-add the applications.
for app in settings.LOCAL_APPS:
urlpatterns += patterns/'',
url/r'^{0}/'.format/app/, include/app + '.urls', namespace=app//,
/


注意最后一节:它通过我安装的应用程序 /
settings.LOCAL_APPS

- 这是我添加的参数,其中仅包含我的应用程序; 它被添加到K.
INSTALLED_APPS

, 这有其他事情,如南方/, 寻找
urls.py

在他们每个人中导入这些 URLs 在命名空间中称为纪念应用程序,也涉及这些 URLs 在一个主题中 URL, 以纪念申请命名。

因此,例如,如果我有一个名为的应用程序
hosts

, 和
hosts/urls.py

看起来像:


from django.conf.urls.defaults import *

urlpatterns = patterns/'hosts.views',
url/r'^$', 'show_hosts', name='list'/,
/


现在我的
views.py

可能会导致
reverse/"hosts:list"/

, 获得 URL 在原因的页面上
hosts.views.show_hosts

, 它看起来像是这样的
"/hosts/"

. 这同样适用于
{% url "hosts:list" %}

在模板中。 所以我不需要担心碰撞 URL 由名称 "list" 在另一个应用程序中,我不需要阻止每个名称
hosts_

.

请注意,入口页面已开启
{% url "login" %}

, 因为她没有命名空间。

裸奔

赞同来自:

认为你使用模板 url, 如下所示

url/r'^login/',include/'app_name', name='login'//


例如,认为您使用第三方应用程序 Django-RestFramework.
使用该应用程序时,必须在文件中声明以下字符串 URLs conf 项目。


url/r'^api-auth/', include/'rest_framework.urls', namespace='rest_framework'//


现在,如果你检查代码 rest-framework, 您将在文件中找到以下代码。 urls.py


urlpatterns = [
url/r'^login/$', login, login_kwargs, name='login'/,
url/r'^logout/$', logout, name='logout'/,
]


我们使用了一个名字 'login' 对于模式 URL 在我们的项目中,使用相同的名称 Django-rest-framework 他们的一个模式 URL. 当你使用时 reverse /'login'/, Django 使困惑。

要解决此类问题,我们使用命名空间。


@register.simple_tag
def optional_docs_login/request/:
"""
Include a login snippet if REST framework's login view is in the URLconf.
"""
try:
login_url = reverse/'rest_framework:login'/
except NoReverseMatch:
return 'log in'


URL 其他名称空间将永远不会遇到命名空间名称。

模板 URL 命名空间可以逆转

reverse/'namespace:url_name'/

三叔

赞同来自:

我们还在中间软件中使用命名空间以以不同的方式处理其中一些。


def process_response/self, request, response/:
try:
if resolve/request.path/.namespace == 'special_namespace':
response['Custom-Header'] = 'Custom-Value'
return response
except Resolver404:
return response

要回复问题请先登录注册