Django的urls.py中的app_name有什么作用? [英] What is the purpose of app_name in urls.py in Django?
问题描述
当include()
将urlconf从Django应用程序发送到项目的urls.py
时,应将某种应用程序的名称(或命名空间)指定为:
app_namespace
在include((pattern_list, app_namespace), namespace=None)
在Mainurls.py
或
- 应用程序的
urls.py
中的app_name
变量。
因为我想是Django 2,所以第二种方法是首选方法,尽管我从Django 3文档复制粘贴了第一个函数签名。但这不是重点。
我目前对include()
的namespace
参数的理解是我在使用reverse()
时使用它。
urls.py
中的app_name
或Main中的app_namespace
有什么作用?这些是完全一样的东西吗?
Django如何使用它?
我在此处找到的现有问题(和答案)解释了我应该如何指定它,而不是为什么。
推荐答案
在此答案中,我使用DRF package及其URL patterns。如果要尝试此答案中提到的任何代码段,您必须安装(pip install djangorestframework
)并将rest_framework
添加到INSTALLED_APPS
列表中。
应用程序命名空间可以通过两种方式设置[Ref:Django doc]
在
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')), ]
在
include((pattern_list, app_namespace), namespace=None)
函数中使用app_namespace
参数。在此方法中,您可以根据需要为应用程序设置其他
app_namespace
。最重要的是,我们传递的是模式列表而不是模块
示例:
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/
- APP的
urls.py
中的app_name
或Main中的app_namespace
有什么作用?
两者都用于设置应用程序命名空间。如果在urls.py
中定义,app_name
可以用作默认应用程序命名空间。
- 这两件事完全一样吗?
否
- Django如何使用它?
应用程序命名空间和实例命名空间用于检索URL路径。在Django中,无论何时执行reverse(...)
函数,Django都会首先查找应用程序命名空间。您可以在这里阅读有关Django如何解析URL的更多信息,Reversing namespaced URLs
这篇关于Django的urls.py中的app_name有什么作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!