🐈

Django REST frameworkを使ってAPIを作成してみる

2023/01/17に公開

🍀 Django REST framework

Django REST frameworkはPythonで動作するREST APIの作成ツールです
大元のWebアプリケーションフレームワークのDjangoを拡張したものになっています

// TODO : REST APIについての説明

🖥 開発環境

  • Macbook Pro (intel)
    • OSX 13.1
  • VS Code

📚 インストール

Pythonの仮想環境を作ってそこに、Djangoのアプリケーションを作成していきます

$ python -m venv env
$ source env/bin/activate

pipでDjangoとREST frameworkをインストール

$ pip install django
$ pip install djangorestframework

Djangoでプロジェクトとアプリケーションをセットアップします
[プロジェクト名][アプリケーション名]には任意の文字列を入れてください

$ django-admin startproject [プロジェクト名]
$ cd [プロジェクト名]
$ django-admin startapp [アプリケーション名]

そうしたら以下のようにファイルが生成されているはずです

./
├── db.sqlite3
├── manage.py
├── myproject
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-310.pyc
│   │   ├── settings.cpython-310.pyc
│   │   └── urls.cpython-310.pyc
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── myapp
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

このうちのsettings.pyを開いて、INSTALLED_APPS'rest_framework'を追加します

settings.py
 INSTALLED_APPS = [
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
+    'rest_framework',
 ]

これでDjango REST Framework のセットアップは完了です

Serializerの設定

Serializerとは、APIを通して入出力するデータを適切な形に整形するシステムのことです
送られるデータに関してはPythonのデータ型で、送るデータに関してはJSONやXMLなどのユーザーが扱いやすい形に変換します
Model(モデル)とよばれる、データの形に基づいてデータを適正に処理します

アプリケーションのディレクトリ内で適当にserializer.pyモジュールを作成します

serializer.py
from django.contrib.auth.models import User, Group
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']

とりあえず、標準で用意されているUserGroupモデルを利用してSerializerを作成しました
serializers.HyperlinkedModelSerializerではURLに紐づけられたSerializerを提供します
Metaでは定義したSerializerの情報を表記します
どのモデルを利用するのか、と必要なフィールド情報はどれなのか、などを定義します
この場合はfieldsに自身のURLを表すフィールドが必要です

表示の設定

利用者のブラウザ上での表示方法の設定を行います
REST Frameworkではviewsetという、標準の便利な表示方法があり、せっかくなのでこれを利用します

アプリケーションディレクトリのviews.pyを以下のように書き換えます

views.py
from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from rest_framework import permissions
from myproject.myapp.serializers import UserSerializer, GroupSerializer


class UserViewSet(viewsets.ModelViewSet):
    """
    ユーザ情報の表示・編集を行うAPIのエンドポイント
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer


class GroupViewSet(viewsets.ModelViewSet):
    """
    グループ情報の表示・編集を行うAPIのエンドポイント
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = GroupSerializer

クラス下の文字列は表示の際にドキュメントとして扱われます
markdownモジュールを導入していればマークダウン形式で表記を行うことが可能です

ルーティング

プロジェクトディレクトリ内のurls.pyでそれぞれのAPIへのURLを通します
rest_frameworkroutersで各APIへルーティングを行います

urls.py
from django.urls import include, path
from rest_framework import routers
from myapp import views

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

urlpatterns = [
    path('', include(router.urls)),
]

rest_frameworkの標準ルータはrest_framework.routers.DefaultRouter()もしくはrest_framework.routers.SimpleRouter()で実装することができます
SimpleRouterは基本的なCRUD機能のみを提供します
DefaultRouterではSimpleRouterの機能に加えて、自動生成されるAPIのリストビューを提供します
ルータで定義したURLはrouter.urlsで取得できるので、それをDjangoのpathで通します

サーバーを稼働してテストする

これで完成です
さっそく動かしてテストしてみます
先にデータベースを構築してから稼働させます

$ python manage.py migrate
$ python manage.py runserver

http://127.0.0.1:8000/users/ にアクセスすると、先ほど作ったAPIのリストビューが出力されます

Discussion