URL命名空间的一个真实示例

Har*_*nch 32 django url namespaces django-views

我正在研究Django文档,但是我遇到了一个我无法理解的部分:在真正的问题中如何使用命名空间的真实示例是什么.我知道语法,但我不知道这个的目的.

Mik*_*one 38

通常,它们用于将每个应用程序的URL放入其自己的命名空间中.这可以防止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)),
    )
Run Code Online (Sandbox Code Playgroud)

请注意最后一部分:这是通过我安装的应用程序(settings.LOCAL_APPS我添加的设置,仅包含我的应用程序;它添加到INSTALLED_APPS其他东西,如南),urls.py在每个中查找a ,并将这些URL导入以app命名的命名空间,并将这些URL放入以app命名的URL子目录中.

所以,例如,如果我有一个名为的app hosts,hosts/urls.py看起来像:

from django.conf.urls.defaults import *

urlpatterns = patterns('hosts.views',
    url(r'^$', 'show_hosts', name='list'),
)
Run Code Online (Sandbox Code Playgroud)

现在我views.py可以调用reverse("hosts:list")获取调用页面的URL hosts.views.show_hosts,它看起来像"/hosts/".这同样适用于{% url "hosts:list" %}在模板.这样我就不必担心在另一个应用程序中与名为"list"的URL发生冲突,而且我不必为每个名称添加前缀hosts_.

请注意,登录页面位于,{% url "login" %}因为它没有给出命名空间.

  • 我实际上得到了什么?通过使用像"myns:myname"这样的网址,我强制用户使用namespace ="myns"包含我的应用程序.上面使用"myns-myname"并且不依赖命名空间的真正好处是什么? (9认同)
  • 现在我看到了完整的答案......它很棒......如果我做对了,你就将命名空间与命名URL一起使用..这样你就不用担心你是否从不同的应用程序中命名了两个视图名字......这是对的吗? (3认同)
  • 我明白了..但这与将名字放入网址相同,对吧?做同样的工作.. (2认同)
  • 差不多.我确信还有其他用途,还有更好的用途,但这是一个快速的例子. (2认同)

nik*_*uru 5

考虑您正在使用如下的URL模式
url(r'^login/',include('app_name', name='login'))

还考虑您正在使用像Django-RestFramework这样的第三方应用程序.使用应用程序时,必须在项目的URL conf文件中声明以下行.

url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
Run Code Online (Sandbox Code Playgroud)

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

urlpatterns = [
    url(r'^login/$', login, login_kwargs, name='login'),
    url(r'^logout/$', logout, name='logout'),
]
Run Code Online (Sandbox Code Playgroud)

我们在项目中使用了'login'名称作为URL模式,Django-rest-framework使用了同名的URL模式.当你使用反向('登录')时,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'
Run Code Online (Sandbox Code Playgroud)

命名空间的URL名称永远不会与其他命名空间冲突.
可以使用反转命名空间的URL模式
reverse('namespace:url_name')