Настоящий пример пространства имен URL-адресов

Я изучаю документацию Django, но я столкнулся с той частью, которую я не могу понять: что является реальным примером использования пространства имен в реальной задаче. Я знаю синтаксис, но я не знаю цели этого.

Ответы

Ответ 1

Как правило, они используются для размещения URL-адресов каждого приложения в своем собственном пространстве имен. Это предотвращает возврат функции reverse() Django и функции шаблона {% url %} от неправильного URL-адреса, поскольку имя URL-шаблона совпало в другом приложении.

Что я имею в своем файле urls.py уровне 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 - это параметр, который я добавил, который содержит только мои приложения, он добавляется в INSTALLED_APPS который имеет другие вещи, такие как Юг), ищет urls.py в каждом из их и импортирует эти URL-адреса в пространство имен, указанное после приложения, а также помещает эти URL-адреса в подкаталог 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-адресом с именем "список" в другом приложении, и мне не нужно префиксно каждое имя с помощью hosts_.

Обратите внимание, что страница входа находится в {% url "login" %} поскольку ей не было предоставлено пространство имен.

Ответ 2

Учтите, что вы используете шаблон URL-адреса, как показано ниже.
url(r'^login/',include('app_name', name='login'))

Также подумайте, что вы используете стороннее приложение, такое как Django-RestFramework. Когда вы используете приложение, вы должны объявить следующую строку в файле confs проекта.

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 login view is in the URLconf.
    """
    try:
        login_url = reverse('rest_framework:login')
    except NoReverseMatch:
        return 'log in'

Имена имен пространства имен никогда не будут сталкиваться с другими пространствами имен.
Шаблон URL с именами может быть отменен с использованием
reverse('namespace:url_name')

Ответ 3

Мы также используем пространство имен в промежуточном программном обеспечении, чтобы по-разному обрабатывать определенные

    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