【Python】Web APIをDjango REST frameworkを用いて実装する方法

こんにちは、Kosei(@kay_diacc2)です!

サマリー

PythonベースのDjango REST frameworkを用いてWeb APIを開発する方法を解説します。

目次

Django REST frameworkとは

Django REST frameworkとは、PythonベースのDjangoフレームワークを用いてをRESTfulなWeb APIを開発することができるライブラリです。

Django REST frameworkで実現できること

APIを実装することで、複数システム・アプリケーション間でのデータ連携が容易に実現できるようになります。

例えば、フロントエンドはWebやモバイルのフレームワーク、バックエンドはPythonベースのDjangoで開発され、その中にDjango REST frameworkを適用した場合、Django REST frameworkはフロントエンドとのデータ連携の役割を担います。

DjangoとDjango REST frameworkにおけるアーキテクチャの違い

Django REST frameworkは、Djangoフレームワークで用いられるAPI構築用ライブラリであると前述しました。ここで、Djangoとは一般的にアプリ開発に用いるフレームワークです。そのため、APIの実装とアプリ開発では目的が異なるため、設計・開発する上で描くアーキテクチャに違いが表れます。

上図に「Django REST frameworkを用いたAPI開発」と「DjangoでのWebアプリを開発」におけるアーキテクチャの違いを示します。

どちらのアーキテクチャも同じ設計思想ですが、Django REST frameworkを用いたAPI開発の場合、データ形式変換(Serializers)という処理を適用するのが特徴的です。

データベース内のデータをAPI経由でクライアントに渡す場合、一般的にデータの出力形式はJSONかXMLです。このようなデータ形式でクライアントにデータを届けるためには、バックエンド側にAPIの出力に沿ったデータ変換の仕組み構築が必要になります。そして、その仕組みとなるのがSerializersというわけです。

Djangoフレームワーク全体におけるアーキテクチャについては以下の記事で解説しています。是非併せてご覧ください。

【実践1】Django REST frameworkを用いて簡単なWeb APIを実装

それでは実際にDjango REST frameworkを用いてAPIを実装してみましょう。作業イメージの全体像を下記表に示します。

スクロールできます
作業・ファイル名作業内容
(1)事前準備・Django RestFrameworkをインストール
・Django環境構築
(2)settings.py・APIの初期設定
(3)models.py・APIから呼び出すテーブル定義
(4)urls.py・API呼出における表示設定
(5)apis.py・API仕様の定義
(6)serializers.py・モデルからAPIにデータを送る際、JSON形式にデータ変換する処理追加
(7)動作確認・ブラウザを開いてAPIが動作するか確認

それでは1つずつ見ていきましょう!

【事前準備】モジュールインストール

Django Rest Frameworkのライブラリをインストールします。ターミナルを開き、下記のように実行しましょう。

pip install djangorestframework

【事前準備】Django環境構築

今回開発するWeb APIはDjangoフレームワークに準拠し作成します。そのため、上図のようなフォルダ構成で後述のAPI実装を進めていきたいと考えます。また、上記赤字ファイルが今回編集対象です。

本記事ではDjangoの環境構築方法の解説は割愛しており、別途下記の記事で解説しています。環境構築が未済の方はまずこちらをご覧ください。

settings.py

Django REST frameworkのライブラリをDjangoフレームワーク上で活用できるようにするために、settings.pyを開き、INDTALLED_APPS部分に下記を追記します。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'App',               # Django環境構築時に作成したアプリケーションフォルダ名を追加
    'rest_framework',    # Django REST frameworkをアクティブ化するために追加
]

models.py

Web APIが提供するデータ項目をモデルに定義します。models.pyを開き下記を記載しましょう。今回はサンプルとして、タイトル(Title)・概要(Description)という非常にシンプルなデータ項目を準備します。

from django.db import models

class SampleModel(models.Model):
    title = models.CharField(max_length = 100)
    description = models.CharField(max_length = 300)

    def __str__(self):
        return self.title

上記記載できましたらマイグレーションを行います。マイグレーション方法は下記の記事にて解説しています。

マイグレーション後は必要に応じてDjangoの管理画面を開き、データベースにレコードを追加しておくと良いでしょう。参考として管理画面経由でデータベースにデータを追加する方法を解説した記事も掲載します。

urls.py

続いてAPIのURL設定です。URL設定は、前述のディレクトリ構成図で説明した「プロジェクトフォルダ(API)内のurls.py」と「アプリケーションフォルダ内(App)のurls.py」を紐付けた形式として設定します。それぞれのファイルを開き、下記のように記載しましょう。

プロジェクトフォルダ(API)のurls.py

from django.contrib import admin
from django.urls import path
from django.urls import include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('App.urls')),
]

アプリケーションフォルダ(App)のurls.py

アプリケーションフォルダ内(App)のurls.pyはDjango環境構築時デフォルトで作成されていないため、まずファイル作成から行いましょう!そして、下記の内容を記載します。

from django.urls import path
from . import apis

urlpatterns = [
    path('api/', apis.api.as_view(), name = "api")
]

apis.py

続いて、DjangoフレームワークViewクラスに該当する部分を作成していきます。今回はAPIを実装するため、直接的にviews.pyにコードを記載せず、アプリケーションフォルダ内に「apis.py」というAPI専用ファイルを作成することとします。

下記のようにコードを記載しましょう。

from .models import SampleModel                          # モデル呼出
from rest_framework.generics import ListCreateAPIView    # API
from .serializers import SampleSerializer                # APIで渡すデータをJSON,XML変換

class api(ListCreateAPIView):
    # 対象とするモデルのオブジェクトを定義
    queryset = SampleModel.objects.all()

    # APIがデータを返すためのデータ変換ロジックを定義
    serializer_class = SampleSerializer

    # 認証
    permission_classes = []

API実装に用いるメソッド

今回はREST frameworkのListCreateAPIViewというメソッドを用いてAPIを構築する例を示しました。その他にもDjango REST frameworkには、用途に応じて柔軟に使い分け可能なAPIメソッドが多数用意されています。

スクロールできます
APIメソッドGetPostPutDelete備考
CreateAPIView×××・Create専用のエンドポイントに使用
ListAPIView×××・Read-Onlyのエンドポイントに使用
・モデルインスタンスをコレクションを出力
RetrieveAPIView×××・Read-Onlyのエンドポイントに使用
・Keyを渡す必要あり
・Keyに紐づくモデルインスタンスを出力
DestroyAPIView×××・Delete専用のエンドポイントに使用
・Keyを渡す必要あり
・Keyに紐づくモデルインスタンスを削除
UpdateAPIView×××・Update専用のエンドポイントに使用
・Keyを渡す必要あり
・Keyに紐づくモデルインスタンスを更新
ListCreateAPIView××・Read/Createのエンドポイントに使用
・モデルインスタンスをコレクションを出力
RetrieveUpdateAPIView××・Read/Updateのエンドポイントに使用
・Keyを渡す必要あり
・Keyに紐づくモデルインスタンスを出力・更新
RetrieveDestroyAPIView××・Read/Deleteのエンドポイントに使用
・Keyを渡す必要あり
・Keyに紐づくモデルインスタンスを出力・更新
RetrieveUpdateDestroyAPIView×・Read/Update/Deleteのエンドポイントに使用
・Keyを渡す必要あり
・Keyに紐づくモデルインスタンスを出力・更新・削除
【参考】APIとのHTTP通信メソッド
  • GET:データ参照(READ)
  • POST:データ作成(CREATE)
  • PUT:データ更新(UPDATE)
  • Delete:データ削除(Destroy)

APIにアクセス権を付与したい場合

今回は記載しておりませんが、APIのアクセス権を細かく設定したい場合、APIクラス内のpermission_classesリスト内にその旨を記載すると良いです。

permission_classes = ["ここに追加したい認証機能を書き込む"]

例えばよく使うアクセス権として認証機能があります。必要に応じて追記しましょう。

""" 認証済みの場合アクセスを許可 """

# 読み込むメソッド
from rest_framework.permissions import IsAuthenticated

# permission_classesの書き換え
permission_classes = [IsAuthenticated]

serializers.py

データベースのデータをJSON形式に変換する処理について記載します。まず、アプリケーションフォルダ(App)内に「serializers.py」というファイルを作成します。そして下記のようにコードを記載しましょう。

#  APIの出力をJSON,XMLデータに変換
from rest_framework import serializers
from .models import SampleModel

class SampleSerializer(serializers.ModelSerializer):
    class Meta:
        model = SampleModel                     # 呼び出すモデル
        fields = ["id","title", "description"]  # API上に表示するモデルのデータ項目

動作確認

これで単純なAPIを実装することができました!ローカルで動作確認するために、下記を実行して画面を開きます。APIの対象画面を開くと、あらかじめデータベースに登録されていた全てのレコード情報がJSON形式で表示されていることが確認できます。

# ターミナルで実行
python manage.py runserver
# ブラウザ上で下記URL開く
http://127.0.0.1:8000/api/

【実践2】キー情報をもとに特定のデータを出力できるWeb APIを実装する

前述で実装したAPIは、モデルのインスタンスを全て出力するようなAPI仕様となっておりました。後述では「APIに必要なキー情報を渡し、キー情報に該当するデータのみを出力できるAPI」を実装したいと考えます。

APIに渡すキー情報は、データベースのテーブルに用いられるプライマリーキー(今回の場合はid)を用います。

以下、実施する作業の全体像を下記表に示します。赤字以外は前述の作業と重複するため割愛し、赤字部分を中心に解説します。

作業・ファイル名作業内容
事前準備・Django RestFrameworkをインストール
・Django環境構築
settings.py・APIの初期設定
models.py・APIから呼び出すテーブル定義
urls.py・API呼出における表示設定変更
apis.py・API仕様の定義変更
serializers.py・モデルからAPIにデータを送る際、JSON形式にデータ変換する処理記載
動作確認・ブラウザを開き、APIが動作するか確認

urls.py

アプリケーションフォルダ(App)内のurls.pyを下記のように修正します。URLにプライマリーキー(PK)を指定できるようにしたのが主な変更点です。

from django.urls import path
from . import apis

urlpatterns = [
    path('api/<int:pk>', apis.api.as_view(), name = "api")
]

apis.py

続いてapis.pyを下記のように編集します。変更ポイントはrest_framework.genericsクラスから呼び出していたAPIメソッドです。今回は「RetriveAPIView」を用いることとします。

from .models import SampleModel                          # モデル呼出
from rest_framework.generics import RetrieveAPIView      # API(変更)
from .serializers import SampleSerializer                # APIで渡すデータをJSON,XML変換

class api(RetrieveAPIView):
    # 対象とするモデルのオブジェクトを定義
    queryset = SampleModel.objects.all()

    # APIがデータを返すためのデータ変換ロジックを定義
    serializer_class = SampleSerializer

    # 認証
    permission_classes = []

動作確認

最後に動作確認をしてみましょう。ローカルサーバーを立ち上げ、ブラウザ上で下記のurlを与えてAPIから正常に出力が得られているか確認しましょう!(URL上でidを渡すことを忘れないようにしましょう!)

http://127.0.0.1:8000/api/(id番号)

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
URLをコピーする
URLをコピーしました!
目次
閉じる