我有要通过Web服务按版本发布的历史数据。为此,我正在使用Django-Rest-Framework。我已经在使用该框架来提供其他服务,但是现在看来要实现该目标要困难一些。
主要目标是提供一个网址:
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是个好方法,您怎么看?如果是这样,您能否提供一个示例在这种情况下或类似情况下如何应用?
提前致谢。
最佳答案
正确的答案是URL版本控制,Django Rest Framework自动支持该功能。您可以在此处找到所需的所有详细信息:
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