DRF Versioning

허진수·2022년 7월 10일
0

Django

목록 보기
3/5

개요

서로 다른 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})

Versioning 설정

DEFAULT_VERSIONING_CLASS 에 정의됨
기본 설정은 None

전역 설정

REST_FRAMEWORK = {
  'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.NamespaceVersioning'
}

View 별 설정

from rest_framework import versioning
class profileList(APIView):
  versioning_class = versioning.QueryParameterVersioning

기타 설정

  • DEFAULT_VERSION

    • versioning이 설정 안돼있을 경우 기본값
  • 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

종류

AcceptHeaderVersioning

request에 Accept 헤더에 버전을 명시
version 은 Media type parameter에 포함됨
vendor media type 사용
JSONRenderer 클래스를 상속받아 재정의 필요
class BookingsAPIRenderer(JSONRenderer):
	media_type = 'application/vnd.megacorp.bookings+json'

URLPathVersioning

버전을 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'
    )
]

NamespaceVersioning

클라이언트에게는 URLPathVersioning과 동일
Django 설정에서 차이가 있음
URL 키워드 대신 namespace 사용

Custom versioning

BaseVersioning 을 상속하여 determine_version 재정의
profile
안녕하세요

0개의 댓글