更新:
现在正确支持版本控制。
您的链接中有一些答案:
我们发现将版本放在 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/