如何在TastypieDjango中去除API url中的版本信息?
我正在为使用Tastypie和Django的应用程序创建基于REST的API。问题是Tastypie中的默认API url包含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 我仍在用空字符串覆
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是否真的是