2015-07-13 86 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