更新:
versioning 现已得到适当支持。
您的链接中有一些答案:
我们发现将版本放在 URL 中既实用又有用。它
让您一目了然地知道您正在使用什么。我们做别名 /foo
到 /foo/(最新版本) 以便于使用,更短/更清晰的 URL,
等等,正如公认的答案所暗示的那样。
永远保持向后兼容性通常成本高昂和/或非常困难。我们更愿意提前通知
弃用、重定向,如建议的此处、文档和其他
机制。
所以我们采用了这种方法,并允许客户端在请求标头中指定版本(X-Version),我们是这样做的:
API 应用程序内部的结构:
.
├── __init__.py
├── middlewares.py
├── urls.py
├── v1
│ ├── __init__.py
│ ├── account
│ │ ├── __init__.py
│ │ ├── serializers.py
│ │ └── views.py
│ └── urls.py
└── v2
├── __init__.py
├── account
│ ├── __init__.py
│ ├── serializers.py
│ └── views.py
└── urls.py
项目 urls.py:
url(r'^api/', include('project.api.urls', namespace='api')),
api 应用级 urls.py:
from django.conf.urls import *
urlpatterns = patterns('',
url(r'', include('project.api.v2.urls', namespace='default')),
url(r'^v1/', include('project.api.v1.urls', namespace='v1')),
)
版本级 urls.py
from django.conf.urls import *
from .account import views as account_views
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('account', account_views.AccountView)
router.register('myaccount', account_views.MyAccountView)
urlpatterns = router.urls
创建一个中间件,通过更改 path_info 来切换到正确的代码,请注意项目级 url 中定义的命名空间 ('api') 不灵活,需要在中间件中知道:
from django.core.urlresolvers import resolve
from django.core.urlresolvers import reverse
class VersionSwitch(object):
def process_request(self, request):
r = resolve(request.path_info)
version = request.META.get('HTTP_X_VERSION', False)
if r.namespace.startswith('api:') and version:
old_version = r.namespace.split(':')[-1]
request.path_info = reverse('{}:{}'.format(r.namespace.replace(old_version, version), r.url_name), args=r.args, kwargs=r.kwargs)
示例网址:
curl -H "X-Version: v1" http://your.domain:8000/api/myaccount/