アップデート:
バージョニングが適切にサポートされるようになりました。
あなたのリンクからいくつかの答えがあります:
URLにバージョンを含めることが実用的で便利であることがわかりました。何を使っているのか一目でわかります。受け入れられた答えが示唆するように、使いやすさ、より短い/よりクリーンなURLなどのために/fooを/foo /(最新バージョン)にエイリアスします。下位互換性を永久に維持することは、多くの場合、コストが高く、および/または非常に困難です。非推奨、ここで提案されているようなリダイレクト、ドキュメント、およびその他のメカニズムについて事前に通知することをお勧めします。
そのため、このアプローチに加えて、クライアントがリクエストヘッダー(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)
サンプルURL:
curl -H "X-Version: v1" http://your.domain:8000/api/myaccount/