こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!
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フレームワーク全体におけるアーキテクチャについては以下の記事で解説しています。是非併せてご覧ください。
【Django】MVC・MVTアーキテクチャ・モデル設計思考の解説|Python・Webアプリ開発#2
本記事ではDjangoを活用したWebアプリの設計概念理解が目的です。DjnagoはMVCアーキテクチャという考え方に基づいたMVTで設計されます。これらMVC・MVTアーキテクチャの概要を理解し、Webアプリの設計における全体像を掴みましょう。
【実践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の環境構築方法の解説は割愛しており、別途下記の記事で解説しています。環境構築が未済の方はまずこちらをご覧ください。
【Django】開発環境構築・プロジェクト開始チュートリアル|Python・Webアプリ作成入門#1
この記事は「Djangoフレームワークを活用したウェブアプリをゼロから開発したい方向け」です。事前に必要な環境設定方法や新規プロジェクト作成、簡易なWebアプリ作成に至るまでの流れを全て網羅した内容となっております。
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】モデルの操作・データベース作成・削除|PythonによるWebアプリ開発(models.py)#6
Djangoのモデルの構築方法を詳しく紹介します。モデルとは何か?という観点から、モデル構築手順に至るまで知ることができます。また、モデルからデータベースにテーブル登録した後の不具合対応として、データベースの削除方法にも言及します。
マイグレーション後は必要に応じてDjangoの管理画面を開き、データベースにレコードを追加しておくと良いでしょう。参考として管理画面経由でデータベースにデータを追加する方法を解説した記事も掲載します。
【Django】管理画面からデータベース操作・スーパーユーザー登録|PythonでWebアプリ開発(admin)#7
この記事は、Djangoフレームワークを活用するモデルの活用方法について触れます。特に、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メソッド | Get | Post | Put | Delete | 備考 |
---|---|---|---|---|---|
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に紐づくモデルインスタンスを出力・更新・削除 |
- 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番号)
【参考】Djangoの解説記事一覧
最後までご覧いただきありがとうございました。当サイトではDjangoフレームワークを用いた解説記事を多数取り扱っております。次のように体系的に整理しておりますため学習にお役立て下さい。
Django学習に最適!
当サイトが運営するDjango記事一覧
【参考】Pythonでできること・お仕事探し
最後に
お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら