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