Django 中 urls.py 中 app_name 的目的是什么?

Den*_*nov 7 django django-urls

include()从 Django 应用程序到项目的 urlconf 时urls.py,某种应用程序的名称(或命名空间)应指定为:

  • app_namespaceinclude((pattern_list, app_namespace), namespace=None)urls.py

或者

  • app_name应用程序中的变量urls.py

因为,我猜是 Django 2,第二种方法是首选方法,尽管我从 Django 3 文档中复制粘贴了第一个函数签名。但这不是重点。

我目前对namespace参数的理解include()是它是我在使用reverse().

app_namein app'surls.pyapp_namespacein main的目的是什么urls.py
这些是完全一样的吗?
Django 如何使用它?

我在这里找到的现有问题(和答案)解释了我应该如何指定它而不是为什么。

JPG*_*JPG 5

在这个答案中,我采用了DRF 包及其URL 模式。如果您想尝试此答案中提到的任何片段,您必须安装 ( pip install djangorestframework) 并添加rest_frameworkINSTALLED_APPS列表中。


应用程序命名空间可以通过两种方式来设定,[参考:Django的DOC ]

  1. urls.py使用app_name变量。

    可以看到 DRF 已经设置了app_namein urls.py。只有当我们包含带有模块引用的模式时,Django 才会使用它app_name 作为应用程序命名空间

    那是, include(module, namespace=None)

    例子:

    urlpatterns = [  
     path('drf-auth/bare/', include('rest_framework.urls')),  
    ]
    Run Code Online (Sandbox Code Playgroud)
  2. include((pattern_list, app_namespace), namespace=None)函数中使用app_namespace参数。

    在此方法中,您可以根据需要为应用程序设置附加项app_namespace

    最重要的是,我们传递的是pattern_list而不是模块

    例子:

    from rest_framework.urls import urlpatterns as drf_urlpatterns
    
    urlpatterns = [  
       path('drf-auth/foo/', include((drf_urlpatterns, 'foo-app-namespace'))),  
    ]
    
    Run Code Online (Sandbox Code Playgroud)

完整示例

from django.urls import path, include, reverse  
from rest_framework.urls import urlpatterns as drf_urlpatterns  
  
urlpatterns = [  
  path('drf-auth/bare/', include('rest_framework.urls')),  
  path('drf-auth/foo/', include((drf_urlpatterns, 'foo-app-namespace'))),  
  path('drf-auth/bar/', include((drf_urlpatterns, 'bar-app-namespace'))),  
]  

print(reverse('rest_framework:login'))
print(reverse('foo-app-namespace:login'))
print(reverse('bar-app-namespace:login'))

#results
/drf-auth/bare/login/
/drf-auth/foo/login/
/drf-auth/bar/login/
Run Code Online (Sandbox Code Playgroud)
  1. app_namein app'surls.pyapp_namespacein main的目的是什么urls.py

两者都用于设置应用程序命名空间。该app_name可被用作一个缺省应用的名称空间,如果在所定义的urls.py

  1. 这些是完全一样的吗?

不。

  1. Django 如何使用它?

应用命名空间实例命名空间用于检索的URL路径。在 Django 中,无论何时reverse(...)执行函数,Django 都会首先查找应用程序命名空间,而不是其他任何命名空间。您可以在此处阅读有关 Django 如何解析 URL 的更多信息,Reversing namespaced URLs