Django Rest FrameworkでAPIサーバーを実装

前提

Pythonの実行環境を構築した上で、Djangoをインストールしておきましょう。

「Windows」キー+「R」で出てきたウィンドウに「cmd」と入力→エンターして出てきたプロンプトで以下を実行。

pip install django

プロジェクトの立ち上げ→アプリ作成→アプリ側のurls.py作成

作業用のディレクトリを作り、その場所でコマンドを開きます。それから以下のコマンドを実行していきます。

1.プロジェクト立ち上げ

python -m django startproject project

※django-adminコマンドではありません。

2.ディレクトリを変更

cd project

3.アプリを作成

python manage.py startapp app

4./project/appディレクトリ内にurls.pyを作成(空ファイルでOK)

5./project/project/settings.py内のINSTALLED_APPSの部分に’app’を追加

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化する

DjangoをAPIサーバー化します。

1.Django Rest Frameworkをインストール

「Windows」キー+「R」で出てきたウィンドウに「cmd」と入力→エンターして出てきたプロンプトで以下を実行。

pip install djangorestframework

2.settings.pyのINSTALLED_APPSに追加

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',
    'rest_framework', #追加
]

デモアプリ作成その1

本のタイトルと本の著者名を返却するデモアプリを作成してみます。

DBのテーブルを定義(models.py)

/project/app/models.pyを編集してデータベースを定義します。

本のタイトルと著者名を格納するために、2つのテーブルを作ります。

・booksテーブル

カラム名idtitleauthorcreated_atupdated_at
説明主キー・一意性を保つため本のタイトル本の著者(authorテーブルの外部キーを格納)レコードの登録日レコードの更新日
データを必須とするか必須必須必須必須任意

・authorsテーブル

カラム名idnamecreated_atupdated_at
説明主キー・一意性を保つため著者名レコードの登録日レコードの更新日
データを必須とするか必須必須必須任意

上のような仕様に基づいてmodels.pyを定義します。

書く際の注意点として、モデルに外部キーを指定したい場合、参照先のテーブルの定義を先に記述する必要があります。ここではbooksテーブルのauthorカラムがauthorsテーブルの外部キーになっているので、authorsクラスをbooksクラスの前に記述します。(逆だとマイグレーション時にエラーが出ます。)

from django.db import models

class authors(models.Model):
    id = models.AutoField(primary_key=True) #primary_key=Trueで主キーに指定
    name = models.CharField(max_length=255) #max_length=255はおまじない
    created_at = models.DateTimeField(auto_now_add=True) #おまじない
    updated_at = models.DateTimeField(auto_now=True) #おまじない

    #おまじないstart
    class Meta:
        verbose_name_plural = 'authors' #Djangoの管理サイトでのテーブルの表示名を設定(ここではauthor)
    def __str__(self):
        return self.name #Djangoの管理サイトのレコード一覧で表示するレコード名の設定(ここではname)
    #おまじないend


class books(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=255)
    author = models.ForeignKey(authors, on_delete=models.CASCADE) #外部キーのカラムとして指定(紐付け先クラス名,紐付け先が消されたときにどうするか)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name_plural = 'books'
    def __str__(self):
        return self.title

models.pyの編集が終わったら、マイグレーションとマイグレートをしてmodels.pyで定義したとおりにDBを自動構築してもらいます。

python manage.py makemigrations

python manage.py migrate

管理サイトでテーブルを管理できるようにする(admin.py)

/project/app/admin.pyを編集します。

from django.contrib import admin
from . models import *

admin.site.register(authors)
admin.site.register(books)

管理サイトを使えるようにする

スーパーユーザー(adminアカウント)をコマンドで作ります。

ユーザー名は「admin」、パスワードは「password」です。(実運用ではNG!)

python manage.py createsuperuser
    Username (leave blank to use 'theguest'): admin
    Email address:
    Password:
    Password (again):
    This password is too common.
    Bypass password validation and create user anyway? [y/N]: y
    Superuser created successfully.

管理サイトに入る

以下コマンドでサーバーを実行。

python manage.py runserver

起動したらブラウザのURLバーにて「localhost:8000」と入力するとトップページに(現時点ではデフォルトページが表示されます)、「localhost:8000/admin」と入力すると管理サイトへ行けます。ログイン画面が出るので、先ほど設定したユーザー名とパスワードを入力します。

作成したテーブルが表示されるかや、レコードの追加などをやってみてください。

ここまでは通常のDjangoアプリの作成と同様でした。

デモアプリ作成2

ここからいよいよREST APIの構築に入ります。

REST APIには以下の3要素が必ず必要です。順に作っていきます。

・Serializer – Modelをどのようにシリアライズ(・デシリアライズ)するかを決めるためのもの

・ViewSet – APIのクエリーをどう解釈するかを決めるためのもの

・URL pattern – DjangoにURLのパターンを教えるためのもの

引用:https://qiita.com/kimihiro_n/items/86e0a9e619720e57ecd8

Serializerの定義(serializer.py)

/project/app/serializer.pyを新規作成して、以下のように記述します。

from rest_framework import serializers
from .models import *

class AuthorSerializer(serializers.ModelSerializer): #○○Serializerとい名前をつける
    class Meta:
        model = authors #models.pyのクラス名で指定
        fields = [ #ここでAPIで返却したいカラムを指定する
            'id',
            'name',
        ]

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = books
        fields = [
            'id',
            'title',
            'author',
            'created_at',
            'updated_at',
        ]

ViewSetの定義(views.py)

/project/app/views.pyを編集します。

from django.shortcuts import render
from rest_framework import viewsets
from .serializer import *

class AuthorViewSet(viewsets.ModelViewSet): #○○ViewSetという名前を付ける
    queryset = authors.objects.all() #models.pyのクラス名で指定
    serializer_class = AuthorSerializer

class BookViewSet(viewsets.ModelViewSet):
    queryset = books.objects.all()
    serializer_class = BookSerializer

URL patternの定義(プロジェクトのurls.pyとアプリのurls.py)

プロジェクト側のurls.pyである/project/project/urls.pyを編集します。

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

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

次に、アプリ側のurls.pyである/project/app/urls.pyを編集します。

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import *

router = DefaultRouter()
router.register(r'author', AuthorViewSet)
router.register(r'book', BookViewSet)

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

以上で完成です。

サーバーを実行し、「localhost:8000/api/」にアクセスすると、GUIでjsonデータを確認することができます。