django urls中的实例命名空间和应用程序命名空间有什么区别?

时间:2018-03-12 14:22:59

标签: python django django-urls urlconf

我指的是https://www.webforefront.com/django/namedjangourls.html来理解django urlconfs。我遇到过术语实例命名空间和应用程序命我知道urlsconfs中的命名空间。但我不知道它们之间的区别。

我提到了django docs。它提到在django项目中使用相同应用程序的多个实例时,实例和应用程序命名空间就会出现。

但是,我仍然无法理解它。我已经google了,但无法找到任何帮助。

提前致谢。

3 个答案:

答案 0 :(得分:5)

将实例名称空间作为您的昵称,将应用程序名称空间作为您的真实名称。

人们可以为您提供多个昵称,但您的真实姓名不会改变。

Django使用应用程序名称空间(您的真实姓名)来反转url,因为作为应用程序,您不必在意有多少实例名称空间(昵称)。

但是要区分一个实例和另一个实例,您将在urlconfs中使用实例名称空间(昵称)。

假设您的应用与客户和商店员工打交道。这两个都有物理地址,您可能要使用一个只处理所有地址信息的应用程序:表单,验证,模型结构,地理位置等。我们的虚构应用程序是可重用的django应用程序,称为“ django_super_address”。

您的根URL conf可能如下所示:

urlpatterns = [
    path('customer/address/',
         include('django_super_address.urls',
         namespace='customer_address')
    ),
    path('employee/address/',
         include('django_super_address.urls',
         namespace='employee_address')
    ),
]

这包括在不同URL路径下的相同URL,它们使用不同的名称空间(昵称)指向同一应用。

django_super_address中,它已经定义了它的应用程序名称空间:

# File: django_super_address/urls.py
from . import views
app_name = 'django_super_address'

urlpatterns = [
    path('create/', views.SomeAddressCreateView.as_view(),
         name='address_create'),
    path('create/success/', views.SuccessView(),
         name='address_create_success'),
    ...
]

在视图中使用:

# File django_super_address/views.py
class SomeAddressCreateView(generic.CreateView):
    def success_url(self):
        return reverse(
           'django_super_address:address_create_success'
        )
    ...

当Django获取URL`/ employee / address / create /'时:

  1. 它将实例名称空间设置为customer_address
  2. 它从django_super_address读取网址
  3. 它将应用程序名称空间设置为django_super_address并 将urls.py与该应用程序名称空间相关联。

在视图中:

  1. 它通过查看与应用程序名称空间(真实名称)关联的urls文件来反转URL,并将其反转为:create/success
  2. 然后它回到链上,现在使用实例名称空间(昵称)在其余URL之前:root + employee/address/ + create/success/ = /employee/address/create/success/

就可以了:urlconfs的昵称和反向的应用程序名称空间!

答案 1 :(得分:0)

据我了解,它是这样的:

  • 对于使用相同URL模式的两个不同应用程序,请使用应用程序命名空间
  • 对于使用相同URL配置和视图的同一应用程序的两个不同实例,请使用实例名称空间

实例名称空间的应用听起来可能有些混乱。让我尝试澄清是否是这种情况。考虑一下Django docs中给出的示例。

  

urls.py:

from django.urls import include, path

urlpatterns = [
path('author-polls/', include('polls.urls', namespace='author-polls')),
path('publisher-polls/', include('polls.urls', namespace='publisher-polls')),
]
  

polls / urls.py:

from django.urls import path

from . import views

app_name = 'polls'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
...
]

命名空间的定义如下:

  • 应用程序名称空间 polls / urls.py
  • 中的app_name属性定义
  • 实例名称空间 urls.py
  • 中的namespace参数定义

此处,author-pollspublisher-polls都使用相同的polls.urls来解析其URL。如果没有实例名称空间,则解析'polls:index'之类的URL可能会导致混淆其打算获取的URL。这就是为什么Django定义了一组protocol来解决各种情况下试图反转和解析命名空间URL时此问题的原因。

答案 2 :(得分:0)

您可以将urls.py用于应用程序,方法是将其包含在不同的urls路径中,例如,我们可以:

urlpatterns = [
    path('author-polls/', include('polls.urls')),
    path('publisher-polls/', include('polls.urls')), 
]

如您所见,两个都包含polls.urls,

app_name = 'polls' urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('<int:pk>/', views.DetailView.as_view(), name='detail'),
    ... 
]

到目前为止一切顺利!

但是有一个问题。在模板中,“ polls:index”指向哪里? 现在,实例名称空间出现了。

urlpatterns = [
    path('author-polls/', include('polls.urls', namespace='author-polls')),
    path('publisher-polls/', include('polls.urls', namespace='publisher-polls')), 
]

Django有一些逆向命名空间网址的规则>> https://docs.djangoproject.com/en/3.0/topics/http/urls/#reversing-namespaced-urls