0

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

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

我希望我的网址不受 API 版本信息的影响,如下所示:

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

网址.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不起作用。

我怎样才能完全摆脱版本信息?

谢谢..

4

2 回答 2

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
于 2012-10-18T19:01:03.627 回答
0

尽管 sweetpie 使提供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 版本控制策略没有任何警告。但是,它的响应速度很快并且可以预测。

于 2014-12-12T20:39:00.553 回答