如何在TastypieDjango中去除API url中的版本信息?

如何在TastypieDjango中去除API url中的版本信息?,django,api,rest,tastypie,Django,Api,Rest,Tastypie,我正在为使用Tastypie和Django的应用程序创建基于REST的API。问题是Tastypie中的默认API url包含url模式中的版本信息,即 http://lx:3001/api/v1/vservers/?username=someuser&api_key=someapikey 我希望我的url不包含以下API版本信息: http://lx:3001/api/vservers/?username=someuser&api_key=someapikey url.py 我仍在用空字符串覆

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

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

我希望我的url不包含以下API版本信息:

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

url.py 我仍在用空字符串覆盖api_名称

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

我怎样才能完全删除版本信息


感谢..

子类
Api
并覆盖
url
以删除所有与
Api\u 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

子类
Api
并覆盖
url
以删除所有
Api\u 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

虽然tastypie使提供
api\u名称
成为可选的,但如果不提供一个,则会将
api\u名称
默认为
“v1”
。可以通过子类化
Api
并重写
Api.py
中的
url
属性来修改此行为,使其行为独立于
Api\u 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
如预期的那样

为了方便起见,我在下面加入了修改过的代码

解决方案 惯例
Django的核心理念之一是URL应该是美丽的;在任何高质量的Web应用程序中,干净、优雅的URL方案都是一个重要的细节。关于此方法的有效性,使用自定义请求头或接受头将完成版本控制工作,而不会使方案与(主观上)丑陋的v1/相混淆。这并不是说URL版本控制策略没有相应的警告;但是,它的响应速度很快,而且是可预测的。

尽管tastypie将提供
api\u name
作为可选选项,但如果不能提供,则只能将
api\u name
默认为
“v1”
。可以通过子类化
Api
并重写
Api.py
中的
url
属性来修改此行为,使其行为独立于
Api\u 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
如预期的那样

为了方便起见,我在下面加入了修改过的代码

解决方案 惯例
Django的核心理念之一是URL应该是美丽的;在任何高质量的Web应用程序中,干净、优雅的URL方案都是一个重要的细节。关于此方法的有效性,使用自定义请求头或接受头将完成版本控制工作,而不会使方案与(主观上)丑陋的v1/相混淆。这并不是说URL版本控制策略没有相应的警告;但是,它的实施速度很快,响应也可以预测。

这不是一个好主意。您应该始终设置API的版本。如果你将来改变了什么,你会后悔这个决定的。我同意。这是一个特点。当(不可避免地)需要添加或更改API时,通过对API进行版本控制,可以保持向后兼容。尚未更新调用的客户端仍然可以正常工作,而新客户端可以利用新的API功能。我的想法是在客户端不知道版本信息的情况下,随时将客户端引导到最新版本的API。这是个糟糕的主意,他们的应用程序会崩溃。考虑一下当你发布新的API和他们的应用程序开始使用它没有必要的变化的情况。谢谢你的澄清。我将版本信息保存在url中。这不是一个好主意。您应该始终设置API的版本。如果你将来改变了什么,你会后悔这个决定的。我同意。这是一个特点。当(不可避免地)需要添加或更改API时,通过对API进行版本控制,可以保持向后兼容。尚未更新调用的客户端仍然可以正常工作,而新客户端可以利用新的API功能。我的想法是在客户端不知道版本信息的情况下,随时将客户端引导到最新版本的API。这是个糟糕的主意,他们的应用程序会崩溃。考虑一下当你发布新的API和他们的应用程序开始使用它没有必要的变化的情况。谢谢你的澄清。我将版本信息保存在url中。感谢dokkaebi提供的代码片段。现在将在REST url中保留版本信息..可能是最好的。当您决定更改API时,这两个小角色可能会使您免受伤害。出于好奇,这段代码有用吗?是的,我一直在看一些演讲,关于版本控制有很大的争论。不过,如果您的API确实是REST而不仅仅是JSON HTTP API,那么您就不需要进行版本设置,因为响应将提供指向其他数据的链接……感谢dokkaebi提供的代码片段。现在将在REST url中保留版本信息..可能是最好的。当您决定更改API时,这两个小角色可能会使您免受伤害。出于好奇,这段代码有用吗?是的,我一直在看一些演讲,关于版本控制有很大的争论。不过,争论的焦点是您的API是否真的是