PythonのWebアプリケーションフレームワーク「Django」でWeb APIを作成する

普段のお仕事に役立つ普遍的なプログラミングTIPSや、業界で注目度が高い最新情報をお届けする「編集部ピックアップ」。
今回はPythonのWebアプリケーションフレームワーク「Django」でWeb APIを作成する方法についてお届けします。

以前公開した記事では、PythonのWebアプリケーションフレームワーク「Django」の使用方法を解説しました。

今回はこのDjangoを使用して、弊社のJavaScriptライブラリを使用する上でも欠かせない、「Web API」を作成する方法について解説していきたいと思います。

プロジェクトとデータベースの作成

まずは以下のコマンドを実行して「testproject」という名前でDjangoのプロジェクトを作成します。

> django-admin startproject testproject

testprojectフォルダに移動し、Web API用のアプリを作成します。今回は「apiapp」という名前で作成します。

> cd testproject
> python manage.py startapp apiapp  

apiappが作成されたら、プロジェクト側でapiappを利用できるように、プロジェクト側の設定ファイル(testproject/settings.py)の「INSTALLED_APPS」にapiappを追加します。

・・・
(中略)
・・・
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    #apiappを追加
    'apiapp'    
]

さらに同ファイルを以下のように編集し、プロジェクトの日本語化を行います。

・・・
(中略)
・・・
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'

次にデータベースのテーブルやカラムを定義した「モデル」を作成します。今回は「GridItem」という名前のテーブルを以下のような設定で作成します。

項目名 フィールド型 説明
product 文字列 受注した製品名
date 日付 受注日
amount 数値 受注した数量

「apiapp/model.py」ファイルに定義します。

from django.db import models

# 以下を追加
class GridItem(models.Model):
    product = models.CharField(max_length=128)
    date = models.DateField()
    amount = models.IntegerField()

次にデータベースを作成するために以下のコマンドを実行します。今回はPythonに標準で組み込まれている「sqlite3」を利用します。

> python manage.py makemigrations

実行するとプロジェクトフォルダ内に「db.sqlite3」というファイルが生成されます。
次に以下のコマンドを実行して、先ほど定義したモデルの内容をデータベースに反映します。

> python manage.py migrate

次に「apiapp/admin.py」ファイルを以下のように編集し、定義したデータベースの値を閲覧・変更できるようにします。

from django.contrib import admin

# 以下を追加します。
from .models import GridItem
@admin.register(GridItem)
class GridItemAdmin(admin.ModelAdmin):
    pass

次に以下のコマンドを実行して、Djangoの管理者サイトにログインするための管理者ユーザーを作成します。

> python manage.py createsuperuser

このとき、ユーザ名、メールアドレス、パスワードの入力を求められるので任意の値を設定します。

ユーザー名 (leave blank to use '*******'): admin
メールアドレス: test@example.com
Password:
Password (again):
Superuser created successfully.

ここまで設定が完了したら、以下のコマンドでアプリを実行して管理者サイトにログインしてみます。

> python manage.py runserver

ブラウザで「http://127.0.0.1:8000/admin/ 」にアクセスするとログイン画面が開くので、先ほど作成したユーザー名とパスワードを入力してログインします。


管理者サイトのログイン画面

管理者サイトにログインすると、先ほどモデルに定義したテーブル名「GridItem」が表示されていることが分かります。

管理者サイトでテーブルの登録を確認

GridItemの「追加」をクリックするとデータの追加が可能です。このあとのWeb APIの作成に向けていくつかデータを追加しておきます。

Web APIの作成

データの追加が完了したら、DjangoでWeb APIを作成していきます。DjangoではWeb API作成用のライブラリとして「REST framework」が利用可能です。

以下のコマンドを実行してREST frameworkをインストールします。

> pip install djangorestframework

プロジェクト側の設定ファイル(testproject/settings.py)の「INSTALLED_APPS」にrest_frameworkを追加します。

・・・ (中略) ・・・
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'apiapp',
    #rest_frameworkを追加
    'rest_framework'
]

次にAPIの作成に必要な以下の3つの項目を設定していきます。

  • Serializer
    モデルのシリアライズ・デシリアライズを行います。モデルとデータベースとの橋渡しの役目を担っています
  • View
    対象となるモデルに対する処理を設定します(シリアライズやフィルタなど)
  • URL
    ルーティングを行い、Viewとの結びつきを設定します

「apiapp」フォルダに新しく「serializers.py」を追加し、以下のようにSerializerを定義します。

from rest_framework import serializers

from .models import GridItem
class GridItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = GridItem
        # 出力したいフィールド名をタプルで(括弧とカンマ)で定義します。
        fields = ('id', 'product', 'date', 'amount')

同じく「apiapp」フォルダの「views.py」の内容を以下のように追記し、Viewを定義します。

from django.shortcuts import render

from rest_framework import viewsets

from .models import GridItem
from .serializers import GridItemSerializer
class GridItemViewSet(viewsets.ModelViewSet):
    queryset = GridItem.objects.all()
    serializer_class = GridItemSerializer

最後にURLです。「apiapp」フォルダに新しく「urls.py」を追加し、以下のように定義します。

from rest_framework import routers
from .views import GridItemViewSet
router = routers.DefaultRouter()
#rを文字列の前に付与してエスケープシーケンスを無効化し、そのままの文字として扱う
router.register(r'griditem', GridItemViewSet)

また、アプリ側で設定したURLをプロジェクト側でも参照できるように「testproject/urls.py」も以下のように修正します。

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

from apiapp.urls import router as apiapp_router

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

以上でWeb APIの設定は完了です。以下のコマンドを実行してアプリを起動します。

> python manage.py runserver

「http://127.0.0.1:8000/api/」をブラウザで開くと、以下のような画面が表示されます。

ルート画面

さらに、「http://127.0.0.1:8000/api/griditem/」にアクセスすると、データベース設定時に登録していたデータを一覧で取得できます。

データの取得

また「http://127.0.0.1:8000/api/griditem/1/」のように、URLにidを追加することで、単体のデータを取得することができ、そちらで更新(PUT)や削除(Delete)なども可能です。

データの取得

以下のようにcurlコマンドを実行して、ブラウザを使用せずにデータを取得することも可能です。

> curl http://127.0.0.1:8000/api/griditem/
[{"id":1,"product":"だしこんぶ","date":"2021-03-08","amount":100},{"id":2,"product":"ピュアデミグラスソース","date":"2021-03-09","amount":80},{"id":3,"product":"ピリカラタバスコ","date":"2021-03-09","amount":30},{"id":4,"product":"なまわさび","date":"2021-03-10","amount":150}]

おわりに

以上がDjangoでWeb APIを作成する方法の解説でした。次回は弊社が提供するJavaScriptライブラリ「Wijmo(ウィジモ)」を使用して、クライアントアプリケーションから今回作成したWeb APIと連携する方法を解説したいと思います。