如何摆脱tastypie django中API url中的版本信息?

时间:2012-10-18 18:56:58

标签: django api rest tastypie

我正在使用Tastypie和Django为应用创建基于REST的API。问题是Tastypie中的默认API网址包含网址模式中的版本信息,即

http://lx:3001/api/v1/vservers/?username=someuser&api_key=someapikey

我希望我的网址免费提供API版本信息:

http://lx:3001/api/vservers/?username=someuser&api_key=someapikey

urls.py

v1_api = Api()
v1_api.api_name = ''
v1_api.register(UserResource())
...
url(r'^api/', include(v1_api.urls)),

我用空字符串覆盖api_name

http://lx:3001/api/vservers/?username=someuser&api_key=someapikey不起作用。

如何完全摆脱版本信息?

谢谢..

2 个答案:

答案 0 :(得分:3)

子类Api并覆盖urls以删除所有与api_name相关的位:

class MyApi(Api):
    @property
    def urls(self):
        """
        Provides URLconf details for the ``Api`` and all registered
        ``Resources`` beneath it.
        """
        pattern_list = [
            url(r"^%s$" % trailing_slash(), self.wrap_view('top_level'), name="api_top_level"),
        ]

        for name in sorted(self._registry.keys()):
            pattern_list.append((r"^/", include(self._registry[name].urls)))

        urlpatterns = self.override_urls() + patterns('',
            *pattern_list
        )
        return urlpatterns

答案 1 :(得分:0)

虽然tastypie提供api_name可选,但未提供一个只是默认api_name"v1"。可以通过继承Api并覆盖urls中的api.py属性来独立于api_name来修改此行为。然而,为了达到理想的URLconf,@ dokkaebi的解决方案还有一个值得注意的地方:

pattern_list.append((r"^/", include(self._registry[name].urls)))

应改为:

pattern_list.append((r'', include(self._registry[name].urls)))

为了避免引导客户

的可怕//

http://lx:3001/api//vservers/?username=someuser&api_key=someapikey 代替 http://lx:3001/api/vservers/?username=someuser&api_key=someapikey 如预期的那样。

为方便起见,我已在下面修改了代码。

解决方案

class MyApi(Api):
"""
An API subclass that circumvents api_name versioning.
"""
@property
def urls(self):
    """
    Provides URLconf details for the ``Api`` and all registered
    ``Resources`` beneath it.
    """
    pattern_list = [
        url(r"^%s$" % trailing_slash(), self.wrap_view('top_level'), name="api_top_level"),
    ]

    for name in sorted(self._registry.keys()):
        pattern_list.append((r'', include(self._registry[name].urls)))

    urlpatterns = self.override_urls() + patterns('',
        *pattern_list
    )
    return urlpatterns

公约

Django的核心理念之一是URL应该是美丽的;一个干净,优雅的URL方案是任何高质量Web应用程序中的重要细节。关于这种方法的有效性,使用自定义请求标头或接受标头将完成版本控制工作,而无需使用(主观)丑陋的v1 /卷积方案。这并不是说URL版本控制策略没有它的一些警告;但是,它的响应很快实现和可预测。