서로 다른 client간에 행동을 지정 할 수 있도록 해줌
Versioning은 request의 request URL 혹은 headers에 따라 결정됨
Versioning이 활성화 되면 request.version 을 사용해 확인 가능
def get_serializer_class(self):
if self.request.version == 'v1':
return AccountSerializerVersion1
return AccountSerializer
# request version에 따라 url 이 변환 됨
# reverse 사용
# reverse란? urls.py 에서의 name 혹은 viewname 을 통해 다시 url로 되돌림
from rest_framework.reverse import reverse
reverse('boolings-list', request=request)
# Versioned API 및 hyperlinked Serializers
# URL 기반 Versioning과 함께 사용시 request를 context로 추가할 것
def get(self, request):
queryset = Booking.objects.all()
serializer = BookingsSerializer(queryset, many=True, context={'request': request})
return Response({'all_bookings': serializer.data})
DEFAULT_VERSIONING_CLASS 에 정의됨
기본 설정은 None
REST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.NamespaceVersioning'
}
from rest_framework import versioning
class profileList(APIView):
versioning_class = versioning.QueryParameterVersioning
DEFAULT_VERSION
ALLOWED_VERSIONS
허용할 버전들을 설정
DEFAULT_VERSION의 값은 항상 포함됨
VERSION_PARAM
versioning parameter에 사용할 문자, default = ‘version’
전역 설정 뿐만 아니라 view 별로도 설정 가능
from rest_framework.versioning import URLPathVersioning
from rest_framework.views import APIView
class ExampleVersioning(URLPathVersioning):
default_version = ...
allowed_versions = ...
version_param = ...
class ExampleView(APIVIew):
versioning_class = ExampleVersioning
request에 Accept 헤더에 버전을 명시
version 은 Media type parameter에 포함됨
vendor media type 사용
JSONRenderer 클래스를 상속받아 재정의 필요
class BookingsAPIRenderer(JSONRenderer):
media_type = 'application/vnd.megacorp.bookings+json'
버전을 URL에 명시하는 방법
URL 설정시 ‘version’ 에 맞는 패턴 필요
urlpatterns = [
re_path(
r'^(?P<version>(v1|v2))/bookings/$',
bookings_list,
name='bookings-list'
),
re_path(
r'^(?P<version>(v1|v2))/bookings/(?P<pk>[0-9]+)/$',
bookings_detail,
name='bookings-detail'
)
]
클라이언트에게는 URLPathVersioning과 동일
Django 설정에서 차이가 있음
URL 키워드 대신 namespace 사용
BaseVersioning 을 상속하여 determine_version 재정의