在这个答案中,我将使用DRF包及其URL模式。如果您想尝试本答案提到的任何代码片段,则必须安装(pip install djangorestframework
)并将rest_framework
添加到INSTALLED_APPS
列表中。
应用程序命名空间有两种设置方式,[参考:Django文档]
在urls.py
中使用 app_name
变量。
您可以看到DRF在urls.py
中设置了app_name
。仅当我们使用模块引用包含模式时,Django才会将此app_name
用作应用程序命名空间。
也就是说,include(module, namespace=None)
示例:
urlpatterns = [
path('drf-auth/bare/', <b>include('rest_framework.urls')</b>),
]
在include((pattern_list, app_namespace), namespace=None)
函数中使用app_namespace
参数。
通过这种方法,您可以为应用程序设置一个额外的app_namespace
(如果需要)。
最重要的是,我们传递了一个模式列表而不是模块。
示例:
<b>from rest_framework.urls import urlpatterns as drf_urlpatterns</b>
urlpatterns = [
path('drf-auth/foo/', include(<b>(drf_urlpatterns, 'foo-app-namespace')</b>)),
]
完整示例
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'))
/drf-auth/bare/login/
/drf-auth/foo/login/
/drf-auth/bar/login/
urls.py
文件中的app_name
或主urls.py
中的app_namespace
有什么作用?
这两个都用于设置应用程序命名空间。如果在urls.py
中定义了app_name
,则可以将其用作默认应用程序命名空间。
- 它们完全相同吗?
不是完全相同的。
- Django如何使用它?
应用程序命名空间和实例命名空间用于检索URL路径。在Django中,每当执行reverse(...)
函数时,Django首先查找应用程序命名空间,然后才查找其他命名空间。您可以在此处阅读有关Django如何解析URL的更多信息:反向命名空间URL。