Django-Rest-Framework动态URL(动态前缀)

时间:2015-07-13 11:30:08

标签: regex django rest django-rest-framework

我有历史数据,我希望通过版本的webservice发布。要做到这一点,我使用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是一个好方法,你怎么看?如果是这样,你能提供一个如何在这种情况下应用它的例子吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

正确答案是URL版本控制,Django Rest Framework自动支持。您可以在此处找到所需的所有详细信息:

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

在您的特定情况下,您需要使用cmbPaymentType.DisplayMember = "PaymentTypeName" cmbPaymentType.ValueMember = "PaymentTypeID" cmbPaymentType.DataSource = _paymentTypes cmbPaymentType.DataBindings.Add("SelectedValue", _data, "PaymentTypeID", False, DataSourceUpdateMode.OnPropertyChanged) 。您可以首先将此键值对添加到URLPathVersioning设置中:

REST_FRAMEWORK

然后,配置与此类似的REST_FRAMEWORK = { 'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning' }

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

答案 1 :(得分:0)

您可以拥有一个包含多个文件的网址文件夹(runtime = JS_NewRuntime(8L * 1024L * 1024L); __init__.pyurls_api_1_0.py)。 基本上每个API版本和您的urls_api_1_0.py文件都有一个文件。哪个路由您的不同API版本。见下面的代码

__init__.py

您的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