DRF_APIのバージョニングについて #176日目
Django REST Framework (以下、DRF) に関するアウトプットをしています。本日はAPIのバージョニングについて整理したいと思います。
本番リリース後に、APIに大幅な変更やアップデートを加えることになり、互換性が保てなくなってしまう場合などの対処法です。この場合、処理の異なる複数バージョンのAPIを並行運用させることになると思います。
この時に考えられるアプローチが2つあります。
DRFのバージョニング機能を使ったアプローチ
アプリケーションを分けるアプローチ
1つずつ見てみたいと思います。
DRFのバージョニング機能を使ったアプローチ
DRFには元々「バージョニング」という機能が備わっており、それを活用するアプローチです。いくつかある機能のうち、リクエストURLからバージョン情報を動的に取得し、Viewの中で処理を分ける方法をご紹介します。
使うのは「URLPathVersioning」という機能です。まずは全体設定のファイルに定義します。
[config/settings.py]
REST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
}
続いてURLconfです。URLで振り分けるので、変数として<version>を含めます。
[config/urls.py]
from django.urls import path
from sampleapp.views import SampleListAPIView
urlpatterns = [
path('sampleapp/<version>/sample', SampleListAPIView.as_view()),
]
最後にviewsです。リクエストされたversionによってシリアライザーが変わるようになっています。
[sampleapp/views]
from rest_framework import generics
from rest_framework.exceptions import ValidationError
from .serializers import SampleSerializer, SampleSerializerV2
from .models import SampleModel
class SampleListAPIView(generics.ListAPIView):
queryset = Book.objects.all()
def get_serializer_class(self):
if self.request.version == 'v1':
return SampleSerializer
elif self.request.version == 'v2':
return SampleSerializerV2
else:
raise ValidationError("バージョンが異なるため利用できません。")
上記は一見簡単そうですが、バージョンが増えるにつれてコードがややこしくなってしまいそうです。
そこで次の方法が推奨されています。
アプリケーションを分けるアプローチ
これはとてもシンプルな方法で、バージョンごとに「sampleappv1」「sampleappv2」などと、アプリケーションを新たに作っていくアプローチです。
全体設定のURLConfでパスを振り分けるだけで完了します。
[config/urls.py]
from sampleappv1 import views as v1_views
from sampleappv2 import views as v2_views
urlpatterns = [
path('sampleapp/v1/sample', v1_views.SampleListAPIView.as_view()),
path('sampleapp/v2/sample', v2_views.SampleListAPIView.as_view()),
]
これであれば、バージョンごとのif文を増やす必要がないため、各バージョンのコードをシンプルに管理できます。
ここまでお読みいただきありがとうございました!!