DRFを触ってみた

はじめに

Django REST framework(略称 DRF)を触ってみました。

https://www.django-rest-framework.org

DRFDjangoREST APIを作成する時に利用する有名なライブラリです。 今までちゃんと触ったことがなかったので、改めて学習してみました。 まずはQuickstartレベルですが、学んだことを以下に記します。

Quickstartをやってみた

Quickstartのリンクはこちら。

https://www.django-rest-framework.org/tutorial/quickstart/

普段はrequirements.txtを用意しますが、今回はクイックスタートに従って特にバージョンを指定しませんでした。 その結果、 djangorestframework==3.14.0Python3.12 Django==5.0.1 で動作することは確認できました。

PyPI上ではDjango4.1, Python3.10までは対応しているみたいなので、更に上のバージョンでもクイックスタートレベルは問題なく動作するみたいです。

https://pypi.org/project/djangorestframework/

何かやってて思ったことはある?

通常のDjangoと違った概念として  Serializers  ViewSet という概念が初めて出てきたので、それは最初「どういうものかな?」と思いました。

自分の中では、SerializersDRF版のFormViewSetDRF版のViewだという理解に落ち着いています。

現時点の理解度としては(RESTな)Web APIを作成、構築する上で必要な機能を提供するため存在しているのかな、という所です(学習して理解が深まったらまた別途記事を書きます)。

Serializers

Serializersfrom rest_framework import serializersのように記述して呼び出します。

from django.contrib.auth.models import Group, User
from rest_framework import serializers


class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ['url', 'username', 'email', 'groups']


class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ['url', 'name']

https://www.django-rest-framework.org/tutorial/quickstart/#serializers より引用。

これを見ると、Djangoの通常のFormとほぼ同じようなコードになっていることがわかります。

ViewSet

ViewSetfrom rest_framework import permissions, viewsetsのように記述して呼び出します。

from django.contrib.auth.models import Group, User
from rest_framework import permissions, viewsets

from tutorial.quickstart.serializers import GroupSerializer, UserSerializer


class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    permission_classes = [permissions.IsAuthenticated]


class GroupViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer
    permission_classes = [permissions.IsAuthenticated]

https://www.django-rest-framework.org/tutorial/quickstart/#views より引用。

これも書き方的にはDjangoのViewと同じようになっていることがわかりました。

URLs

from django.urls import include, path
from rest_framework import routers

from tutorial.quickstart import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)

# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

urlpatterns += router.urls

https://www.django-rest-framework.org/tutorial/quickstart/#urls より引用。

ここでは普段のDjangoだと記述しない、routersというものがありました。

Because we're using viewsets instead of views, we can automatically generate the URL conf for our API, by simply registering the viewsets with a router class.

リファレンスには上記のように記述されており、URLconfを自動的に生成できると理解しました。

また、他に見慣れない記述であるpath('api-auth/', include('rest_framework.urls', namespace='rest_framework'))というものがありましたが、リファレンスの以下の記述より、ログイン/ログアウトのviewを作成してくれる機能だというのも分かりました。Django自体も基本的に記述量が少なく色々なことをしてくれますが、初見だと「何をやっているんだろう?」と思うポイントの1つでした。

Finally, we're including default login and logout views for use with the browsable API. That's optional, but useful if your API requires authentication and you want to use the browsable API.

おわりに

今回はまずQuickstartを触ってみました。 思えば今までWeb APIを触る機会も少なく、初めて触れる概念で最初はちょっとだけ怯みましたが、DRFがWeb APIを作成するのに必要な機能を提供しているんだなーという理解まで落とし込めることが出来てよかったです。