我正在使用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
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
不起作用。
如何完全摆脱版本信息?
谢谢..
答案 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版本控制策略没有它的一些警告;但是,它的响应很快实现和可预测。