【Django】REST Frameworkを利用したWeb APIの実装

時計 2021.09.15 / 時計

【Django】REST Frameworkを利用したWeb APIの実装

本記事ではDjangoにWeb APIを実装する方法について解説していきます。ここではREST APIを構築できる、Django REST Frameworkを利用します。

現代のAPI機能を持つWebアプリケーションの多くはREST APIを採用しており、DjangoにはこのREST APIを簡単に実装できるパッケージがあります。

APIをWebアプリケーションに実装できるようになると、作成できるアプリケーションの幅が非常に広がります。
ぜひAPIについて知識を広げて、Djangoでの利用・構築できるようになりましょう。

本記事を通して以下の知識を学べます。

学べる知識
  • APIについて
  • 設計モデルのRESTについて
  • Django REST Frameworkを利用したWeb APIの実装方法
  • APIからJSONデータの取得方法

APIとは

API(Application Programming Interface)とは、
Webアプリケーションのソフトフェアを外部に提供(共有)する仕組みのことです。

Webアプリケーションが一部の機能(ソフトウェア)を誰でも使えるように公開するということです。これにより、誰でも公開された機能を利用して、よりよいサービスを開発できるようになります。

例えば天気予報のAPIでは、郵便番号を指定することで、その土地の天気予報(最高・最低気温など)を返すものなどがあります。

このAPIを利用すれば、難しい機能を1から開発することなく、自分のWebサイトに天気予報を簡単に公開できます。

このようにAPIを活用することで、新しいサービスの開発や開発時間の短縮ができます。

APIが返すデータはJSON形式が主流です。JSONについては以下記事をご参照ください。

REST

RESTとは

REST(Representational State Transfer)とはWebサービスを構築する際の考え方や原則(ルールや性質)の集まりのことです。
Web制作のための設計モデルとも言えます。

IT用語の確認

Djangoの設計モデルはMTV(Model・Template・View)です

RESTの原則は、容易にデータへアクセスできることを目的としています。

RESTなWebアプリケーションでは、URIにHTTPメソッドでアクセスすることでデータの送受信ができます。

RESTの4原則

RESTに従って設計するということは、以下の4つの原則に準ずる必要があります。

この原則に準ずるものを「RESTfulである」といいます。

  • リソースはURIで公開
  • インターフェースの統一
  • ハイパーメディアの使用(JSON、HTML、XMLなど)
  • ステートレスな通信

上記の原則がありますが、SOAP(Simple Object Access Protocol)などよりも使いやすいです。RESTは高速かつ軽量であるため、スケーラビリティが向上するため、Webサービスやモバイルアプリに利用されます。

REST APIとは

Web APIの仕様として、有名なものにSOAPとRESTがあります。

RESTの制約に従って作成するAPIをREST API(またはRESTful API)と呼びます。
RESTはすでに解説しているように、全世界で共通しているルールの一つです。

このREST APIで公開されているサービスを、自分のシステムに組み合わせることによって、新たなサービスを開発することができます。

Django REST FrameworkによるWeb APIの実装

PythonのWebフレームワークDjangoにAPIを実装する方法について解説していきます。

本記事ではすでにDjango環境があることを前提としています。
まだDjangoを使ったことがない方は以下記事をご参照ください。

Web APIをDjangoに実装するために、Django REST Frameworkを利用します。
ここで利用するのはdjangorestframework 3.12.4のバージョンです。

必要要件
  • Python3.5以上
  • Django2.2以上

以下のパッケージはREST Frameworkに機能を追加する際によく使われるものです。

  • django-filter:フィルタリング機能
  • django-guardian:オブジェクトレベルの許可管理
  • PyYAML:スキーマの生成

DjangoにAPIを実装するために必要なことは以下の5つです。

  • モデルの定義
  • Django REST Frameworkのインストール
  • Serializerの作成
  • API用のViewの作成(ViewSets)
  • APIへのルーティングの追加(Router)

Djangoにおけるモデルの定義方法については以下記事をご参照ください。

本記事で利用するモデルはmodels.pyで定義している次のTemplateモデルです。

class Template(models.Model):
    template_name = models.CharField(max_length=255, unique=True)
    category = models.ForeignKey(Tempcategory, on_delete=models.CASCADE, related_name="tempcategory")
    def __str__(self):
        return self.template_name

Django REST Frameworkのインストール

Django REST Frameworkをpipを使ってインストールします。

pip install djangorestframework

次にDjango で利用できるように、プロジェクト内の設定ファイルsettings.pyのINSTALLED_APPSにrest_frameworkを追加します。

INSTALLED_APPS = [
    …
    'rest_framework',
]

Serializerの作成

rest_framework.serializersのSerializerクラスを使ったスクリプトを作成します。
ここではアプリケーションフォルダ内にserializers.pyとして作成しました。

Serializerはデータベースから取り出したモデルのデータをJSONにシリアライズ(serialize)する、データベースへのデータ追加・削除・更新、データのバリデーションなどに利用されます。

IT用語の確認

シリアライズ(serialize)とはデータをファイルとして保存したり、ネットワーク経由で送受信できるようにデータを変換すること

スクリプトではrest_framework.serializers.ModelSerializerを継承したクラスを作成します。

# serializers.py
from rest_framework import serializers
from .models import Template

class TemplateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Template
        fields = ('template_name', 'category',)

ここではモデルTemplateのSerializerを作成し、fieldsにtemplate_nameとcategoryを指定しています。

注意

バージョン3.3以降からはfields属性またはexclude属性を使用することが必須となりました

ViewSetsを使用したAPI用Viewの作成

ViewSetsというコンポーネントを利用したクラスベースビューを作成します。

API用のビュースクリプトをアプリケーションフォルダ内に作成します。
ここではアプリケーションフォルダ内にapi_views.pyとして作成しました。

作成したスクリプト内にはrest_framework.viewsets.ModelViewSetを継承したクラスを記述します。

これがAPIの本体になり、ここに機能を追加することで、外部に提供する機能が追加されていきます。

# api_views.py
from rest_framework import viewsets, filters
from .models import Template
from .serializers import TemplateSerializer

class TemplateViewSet(viewsets.ModelViewSet):
    queryset = Template.objects.all()
    serializer_class = TemplateSerializer

クエリセットにTemplateオブジェクトの全データ、シリアライザークラスにTemplateSerializerを指定しています。

urls.pyへの追記

APIのリソースにアクセスしたときに、上記で作成した機能が実行できるようにプロジェクトフォルダ内のurls.pyに追記を行います。

URLディスパッチャーにはRouterクラスを利用します。

from rest_framework import routers
from record import api_views as record_api_views

router = routers.DefaultRouter()
router.register('template', record_api_views.TemplateViewSet)

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

ブラウザからAPIのURLにアクセスすると、次のようにJSONのレスポンスがブラウザ用に見やすいページで閲覧できます。

http://127.0.0.1:8000/api/
Django:Django REST FrameworkによるAPI画面
http://127.0.0.1:8000/api/template/
Django:Django REST FrameworkによるAPI template画面

APIからJSON形式でデータを取得

APIへアクセスするURLに?format=jsonを末尾に追加することでJSON形式でデータを取得できます。

http://127.0.0.1:8000/api/template/?format=json
# [{"template_name":"office54","category":1},{"template_name":"python","category":3}]

外部からAPIにアクセスしてデータを取得する場合は、上記の方法でJSONデータを取得します。

まとめ

本記事「【Django】REST Frameworkを利用したWeb APIの実装」はいかがでしたか。

ぜひ作成するWebアプリケーションにAPIを実装して、仕事に活かせるようにしましょう。