見出し画像

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文を増やす必要がないため、各バージョンのコードをシンプルに管理できます。


ここまでお読みいただきありがとうございました!!


参考


いいなと思ったら応援しよう!