Django中www.example.com的app_name有什么作用urls.py?

tvz2xvvm  于 2023-01-21  发布在  Go
关注(0)|答案(4)|浏览(159)

include()将Django应用的urlconf文件传输到项目的urls.py时,应用的名称(或命名空间)应该指定为:

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

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

因为,我猜,Django 2,第二种方法是首选的。虽然我复制粘贴了Django 3文档中的第一个函数签名,但这不是重点。
我目前对include()namespace参数的理解是,它是我在使用reverse()时使用的参数。
应用的urls.py中的app_name或主urls.py中的app_namespace的用途是什么?
这是一回事吗?
Django是如何使用它的?
我在这里找到的现有问题(和答案)解释了我应该如何指定它,而不是为什么。

pvcm50d1

pvcm50d11#

在这个答案中,我使用了DRF package和它的URL patterns。如果你想尝试这个答案中提到的任何代码片段,你必须安装(pip install djangorestframework)并将rest_framework添加到INSTALLED_APPS列表中。

***应用程序命名空间***可通过两种方式设置,[参考:Django文档]

1.在urls.py中使用app_name变量。
你可以看到DRF已经在urls.py中设置了app_name。只有当我们包含了带有***模块引用的模式时,Django才会使用这个app_name作为 * 应用程序名称空间
include(module, namespace=None)

    • 示例:**
urlpatterns = [  
 path('drf-auth/bare/', include('rest_framework.urls')),  
]

1.在include((pattern_list, app_namespace), namespace=None)函数中使用app_namespace参数。
在此方法中,如果需要,可以为应用程序设置一个 * 附加app_namespace
最重要的是,我们传递的是
pattern_list*而不是 * module *

    • 示例:**
from rest_framework.urls import urlpatterns as drf_urlpatterns

urlpatterns = [  
   path('drf-auth/foo/', include((drf_urlpatterns, 'foo-app-namespace'))),  
]

完整示例

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/

1.应用的urls.py中的app_name或主urls.py中的app_namespace的用途是什么?
两者都用于设置***应用程序命名空间***。如果在urls.py中定义,则app_name可用作***默认应用程序命名空间***。
1.这是一回事吗?
没有。

  1. Django是如何使用它的?

***应用程序命名空间***和***示例命名空间*用于获取URL路径。在Django中,每当执行reverse(...)**函数时,Django会首先查找应用程序命名空间。您可以在此处阅读更多关于Django如何解析URL的信息,反转命名空间URL

aurhwmvo

aurhwmvo2#

app/www.example.com中的app_name和main urls.py中的include((pattern_list, app_namespace), namespace=None)中的app_namespace与描述正在部署的应用程序名称的应用程序命名空间引用相同。urls.py and app_namespace in include((pattern_list, app_namespace), namespace=None) in main urls.py are the same referenced as application namespace which describes the name of the application that is being deployed.
可以将整个app/www.example.com或对app/urls.py的字符串引用(带有app_name)传递给include()urls.py or a string reference of app/urls.py with app_name to include()

# blog.urls
from django.urls import path

from . import views

app_name = 'blog'
urlpatterns = [
    path('', views.index(), name='index'),
    path('<int:pk>/', views.post(), name='detail'),
]
# project urls
from django.urls import include, path

urlpatterns = [
    path('', include('blog.urls')),
]


将url模式和app_namespace的元组转换为include()

# project urls
from django.urls import include, path
from blog.urls import urlpatterns as blogpatterns

urlpatterns = [
    path('', include((blogpatterns, 'blog'))),
]

如果include()中提供了app_namespace,则app_namespace将是默认的应用程序命名空间。如果未提供app_namespace,则它将在blog/urls.py中查找app_name,并将其作为默认命名空间。
如果没有应用命名空间,URL将添加到全局命名空间,这可能会导致URL冲突。
URL命名空间和包含的URLconf|术语应用程序命名空间|包括()

ncgqoxb0

ncgqoxb03#

多年来,我们(在Django)一直在回避应用程序名称(空格)和示例名称空间之间的(令人困惑的)区别。我们总是建议使用示例名称空间,就像文档中的例子一样。
Django2.0(及以后版本)的情况是,如果不使用应用程序名称,就不能使用示例名称空间。我们不应该修改代码,而应该更新我们的示例以正确使用。
include需要如下所示:

urlpatterns += [ url('API/', include((router.urls, 'pikachu')) ]

现在的趋势是也包含第二个namespace='pikachu'示例名称空间参数,但这不是必需的--它默认为None,在本例中自动设置为'pikachu'
一般来说,用户希望包含一个应用程序级URL模块,在其中显式设置app_name属性,而不是手动包含路由器。

hwamh0ep

hwamh0ep4#

来自https://docs.djangoproject.com/en/3.0/topics/http/urls/#introduction:
即使不同的应用程序使用相同的URL名称,URL命名空间也允许您唯一地反转命名的URL模式。第三方应用程序始终使用命名空间URL是一个很好的做法(就像我们在教程中所做的那样)。类似地,如果部署了应用程序的多个示例,它还允许您反转URL。换句话说,由于单个应用程序的多个示例将共享命名URL,名称空间提供了区分这些命名URL的方法。

相关问题