Django对包含同一应用的多个URL使用reverse()

时间:2018-11-29 20:36:47

标签: django api reverse

编辑:我正在使用rest_framework.reverse并提供应用程序名称而不是反向查找的名称空间。反向调用的示例是:

reverse('api_app:system-detail', kwargs={...}, request=self.context.get('request'))

因此,我有一个带有单个应用程序的django项目,并且我有两个映射到该应用程序的不同的URL模式。我目前主要使用此方法,但是在某些情况下,使用reverse()会导致名称空间错误。我的基本urls.py看起来像这样:

from django.conf.urls import url, include
from django.views.generic.base import RedirectView


urlpatterns = [
    url(r'^api/', include('api_project.api_app.urls', 
    namespace='api')),
    url(r'^beta/api/', include('api_project.api_app.urls', 
    namespace='beta')),
    url(r'^$', RedirectView.as_view(url='api', permanent=False), 
    name='index')
]

编辑:api_app.urls看起来像:

from django.conf.urls import url
from rest_framework.urlpatterns import format_suffix_patterns
from . import views
from rest_framework.schemas import get_schema_view

schema_view = get_schema_view(title="Schema")


app_name = 'api_app'

urlpatterns = [
url(r'^$', views.APIRoot.as_view(), name='api-root'),
url(r'^schema/$', schema_view, name'api-schema'),
....

在大多数情况下,反向操作可以按预期进行,例如使用/ beta / endpoint在页面上具有如下链接:

/beta/endpoint/example

但是,在少数情况下,使用/ beta / endpoint的链接如下:

/api/endpoint/different-example

我的问题不是关于反向如何确定要使用哪个名称空间的问题,而是这是对同一应用程序使用两个名称空间的适当方法吗?这是我应该完全不同的方法吗?

到目前为止,我的大多数研究并没有取得太大的成功,所以我认为这可能根本上是错误的方法。

如果这种方法可行,那么我很好奇为什么反向返回返回的名称空间不一致。

1 个答案:

答案 0 :(得分:1)

reversing namespaced URLs上的文档向您显示了发生的情况。对于您的情况,您要实例化同一个应用程序两次,一次使用实例名称空间api,一次使用实例名称空间beta

您的应用程序名称空间为api_app,由包含的urls.py文件中的app_name变量定义。因此它与两个实例名称空间都不匹配,这意味着没有默认的应用程序实例。

因此,在您的情况下,URL解析器将大多数情况下解析为情况4:如果未在视图中指定current_app,它将解析为最后部署的实例(即最后注册的实例),即是“测试版”。

在使用current_app时和在reverse对象上,都应在视图中指定request(以便模板也可以正确解析)。