2015-07-13 66 views
2

我有我想通过web服务发布版本的历史数据。要做到这一点,我使用的是Django-Rest-Framework。我已经在使用这个框架来提供其他服务,但现在似乎有点难以实现这一目标。Django-Rest-Framework动态url(动态前缀)

主要目标是提供一个网址:

http://127.0.0.1:8000/service/vocab (realtime) - done 
http://127.0.0.1:8000/service/v1/vocab (version 1) 
http://127.0.0.1:8000/service/v2/vocab (version 2) 
http://127.0.0.1:8000/service/vn/vocab (version n) 

为了这个,我正在尝试配置的DRF路由器使这成为可能。

这样的想法是这样的:

urls.py

router = routers.DefaultRouter() 
router.register(r'vocab', views.VocabViewSet, 'vocabs') 
router.register(r'{version}/vocab', views.VersionViewSet, 'vocab') 

    urlpatterns = patterns('', 
    ... 
     url(r'^service/', include(router.urls)) 


) 

views.py

class VersionViewSet(viewsets.ModelViewSet): 
     queryset = Version.objects.all() 
     serializer_class = VersionSerializer 

     @detail_route(methods=['post'], url_path='vocab') 
      def get_vocabs(self, request, version='v1'): 
      queryset = Version.objects.filter(version=version) 

在这种情况下发生:

invalid literal for int() with base 10: 'version' 

这是因为DRF在service/之后期望int。

我正试图找到解决这个案例。你能提供任何提示,我怎么能做到这一点?

也许Customize dynamic routes是一个很好的方法,你怎么看?如果是这样,你能提供一个例子来说明在这种情况下还是类似的情况?

在此先感谢。

回答

0

您可以拥有一个包含多个文件的url文件夹(__init__.py,urls_api_1_0.pyurls_api_1_0.pyurls_api_1_0.py)。 基本上每个API版本的一个文件和您的__init__.py文件。哪些路由您的不同的API版本。见下面

import urls_api_1_0 
import urls_api_2_0 

urlpatterns = patterns('', 
    url(r'^api/v1/', include(urls_api_1_0)), 
    url(r'^api/v2/', include(urls_api_2_0)), 
) 

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 
urlpatterns += format_suffix_patterns(urlpatterns, allowed=['json', 'html']) 

urls_api_1_0.py代码可能看起来像这样

from django.conf.urls import patterns, url 
import package.views.api_2_0 as views 

urlpatterns = \ 
patterns('', 
     url(r'^ vocab/$', views.VocabListView.as_view(), 
      name='all-vocab-v2'), 
     ) 
+0

这不是动态的。如果你在后台定义第三个版本?你将如何定义?你将不得不去urls.py并定义一个新的url模式? – ePascoal

1

的正确答案,这是URL版本,这是由Django的REST框架自动支持。你可以找到所有的细节,你需要在这里:

http://www.django-rest-framework.org/api-guide/versioning/

你的具体情况,你要使用的URLPathVersioning。您可以通过添加此键值对您REST_FRAMEWORK设置启动:然后

REST_FRAMEWORK = { 
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning' 
} 

,配置urls.py与此类似:

http://www.django-rest-framework.org/api-guide/versioning/#urlpathversioning