Django 对于版本化API,使用名称空间URL进行基本反转
我使用django rest框架进行名称空间版本控制。我的主URL.py如下所示:Django 对于版本化API,使用名称空间URL进行基本反转,django,django-rest-framework,Django,Django Rest Framework,我使用django rest框架进行名称空间版本控制。我的主URL.py如下所示: ... url(r'^api/v1/', include('my_api.api_urls', app_name="api", namespace='v1')), ... reverse('v1:some') 在my_api.api_url.py中: urlpatterns = [ url(r'^some-endpoint/$', api_views.MyView.as_view(), name='s
...
url(r'^api/v1/', include('my_api.api_urls', app_name="api", namespace='v1')),
...
reverse('v1:some')
在my_api.api_url.py中:
urlpatterns = [
url(r'^some-endpoint/$', api_views.MyView.as_view(), name='some'),
]
不知何故,我无法逆转这些网址。为什么我不能这么做?我得到一个NoReverseMatch
异常
reverse('some')
我无法理解django的名称空间,但它不应该只使用最后定义的路由吗?如果我从主url中删除namespace参数,一切都正常
编辑
也不起作用:
reverse('v1:some')
我还可以添加,在我的主URL文件中,我在api/v1/前缀中包含多个URL文件:
...
url(r'^api/v1/', include('my_api.api_urls', app_name="api", namespace='v1')),
url(r'^api/v1/', include('my_other_api.api_urls', app_name="api", namespace='v1')),
...
在django中反转url名称时,必须使用
名称空间:url名称
模式进行反转
您的反向呼叫应如下所示:
...
url(r'^api/v1/', include('my_api.api_urls', app_name="api", namespace='v1')),
...
reverse('v1:some')
见:
更新:在多个url条目上使用相同的命名空间。保持url名称空间的唯一性。您是否尝试过此方法:??请确保您使用rest\u framework中的
。反向导入反向
的反向功能。对不起,运气不好。我想那一定是我的配置出了问题。这可能与在多个包含上使用相同前缀的相同命名空间有关吗?当我将特定api的名称空间更改为其他名称空间(例如“v2”)并使用reverse('v2:some')时,它会工作。是的,很可能是这样。具有相同命名空间的多个URL可能会导致问题。尝试更改名称空间啊,那一定是问题所在。所以,根据经验,只使用一次名称空间,然后包含其中的子URL?@Ruben:哦,我已经很久没有修改过这个了,所以我对这个话题并不完全陌生。我在每个API版本中使用一个主URL文件,并包含其中的所有内容。如下所示:url(r'^api/v1/',include('main.api\u url\u v1',namespace='v1'))
。在api_url_v1中:url_模式=[url(r'app1/',include('app1.api.api_url'))、url(r'app2/',include('app2.api.api_url_v1'))]
。这种方法的好处是,您可以为每个应用程序独立连接版本。缺点是,它有点冗长。