我有要通过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

07-28 02:33
查看更多