DjangoでAPIをつくろう

知っておくべきこと

・Djangoの基本は説明しませんので別の動画/記事で先に理解しておくこと

・Pythonの基本

・APIの意味

今回使用するもの

・Windows10(OSはあまり関係ありません)

・Python3

・pip

・Django REST framework

Django REST Frameworkってなに?

Django自体はバックエンドのフレームワークの中でもスピーディに開発でき、セキュリティも設定されてるいてくる優れモノです。

他にはPHPのLaravelとか、nodeJSのExpressJSとかが近いもので存在します。

詳しくはDjangoの公式ドキュメンテーションを見てください。

https://www.djangoproject.com/

しかし!実際の開発の現場では、Djangoだけの仕事っていうのはあまりありません。DjangoにAPIを組み込んでマルチプラットフォーム(Web、モバイルアプリ、exeファイル)からデータにアクセスさせるというやり方の方が良いです。

これでDjangoの良さを活かしつつ、ユーザー側にはreact、vue、Anguler等のJSフレームワークでフルスタックにする方がスケールもしやすく、デバッグも楽になります。

では、前置きはこれくらいにして早速Django RESTFramework(DRF)を触っていきましょう。

DRFが提供するAPIの種類

APIでは、JSONファイルのデータを公開したり、アプリのデータを発信、受け取る際に使います。例えば天気の情報をAPIで受け取り、自分のサイトに表示するとかですね。

serializerを理解する

Djangoは通常PostgreSQLなどのデータベースと接続されています。デフォルトでは、SQLiteというポータブルのDB(データベース)がついてきますが、セキュリティのこともあり、デプロイする際には使いません。

DRFのSerializerはこのデータベースのデータをシリアル化することによってDjangoアプリからデータをAPIとして公開する役目を持ちます。

views.pyを理解する

ではこのシリアル化されたデータをDjangoのViews.pyというファイルの中でどのように扱うか指示をしてあげます。ここでフィルターをしたり、順番を変えたりもできます。

urls.pyを理解する

最後にどのURLでクライアント(ユーザー側)がアクセスできるかを指示します。

セットアップ

Pythonが入っていることを確認してください。

python –version

python3 —version

仮想環境を使ってホストターミナル(つまりは私のWIndowsPC)から独立した環境を作ります。必要ない人は飛ばしてください。(OSによってコマンドが異なります。)

環境を作りたいファイルパスで下記のコマンド

ENVは私がつけた名前なのでなんでもいいです。

pip install virtualenv

Virtualenv ENV

ENV\Scripts\activate.bat

Djangoのインストール

pip install django
pip list

プロジェクトの作成

Djangoがインストールできたら下記のコマンドでdjangoのプロジェクトを作成します。

django-admin startproject djangoapi

#djangoapiの部分は自分で分かりやすいものにしてください。

で、新しいプロジェクト名のディレクトリができました。

次にDjangoのRESTフレームワークをインストールします。

pip install djangorestframework

pip list

アプリの追加

今できたプロジェクトファイルとは別にアプリケーションごとのディレクトリを作成します。

まずはmasnage.pyのある場所に移動します。

cd djangoapi

python manage.py startapp apiapp

settings.pyを設定

ではテキストエディタでメインのプロジェクトファイルのsettings.pyを開き、

INSTALLED_APPS にrest_frameworkを追加します。

あとさっき作ったapiappも登録します。

INSTALLED_APPS = [

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    'rest_framework',

    'apiapp',

]

プロジェクトのurls.pyを設定

これもdjangoの設定なので詳しくは説明しません。

apiappのurls.pyに転送します。

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


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

アプリの方にurls.pyを作成しておく。

from django.urls import path

urlpatterns = [
]

アプリ側のviews.pyの設定

データベースに接続する前に簡単なテキストデータが出力できるか試します。

ここでapiの設定の仕方でファンクションベースとクラスベースの設定の仕方があります。

ファンクションベースは細かい設定がしやすいですが、行が長くなりがちで、クラスベースはコードの数が少ないと違いと考えておいて問題ないと思います。

from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.decorators import api_view



@api_view(['GET'])
def getData(request):
  person = {'name':'Shiro', 'age':31}
  return Response(person)

さっきのurls.pyにエンドポイントを作成

from django.urls import path
from .views import getData

urlpatterns = [
    path('api/', ('apiapp.urls')),
    path('', getData),
]

テストラン

python manage.py makemigrations

Python manage.py migrate

python manage.py runserver

http://127.0.0.1:8000/をブラウザで開く。

これでAPIのエンドポイントが設定できましたね。

では、実際のデータを参照するように設定します。l

メンバーアプリを作成する。

では、同じ要領でメンバーのデータを参照するAPIを作成していきます。

python manage.py startapp members

settings.pyにアプリを登録

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    # Installed app
    'apiapp',
    'members'
]

モデルの登録

モデルはデータベースの方のようなもので、Django側でデータベースで受け入れるデータの種類やデータの長さを規制しておくことができます。

では、models.pyで下記のように例としてモデルを登録します。

from django.db import models

class Members(models.Model):
  name = models.CharField(max_length=30)
  email = models.EmailField(max_length=60)
  phone = models.IntegerField()
  date = models.DateTimeField(auto_now_add=True)

  #auto_now_addはレコードの作成した日と時間のみ記録する

モデルをシリアル化する

では、このmembersモデルをAPIにするための作業を行います。

Membersディレクトリ内にserializers.pyを作成します。

from rest_framework import serializers
from .models import Members




class MembersSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=30)
    email = serializers.EmailField(max_length=60)
    phone = serializers.IntegerField()
    date = serializers.DateTimeField()



    class Meta:
        model = Members
        # fields = ['name', 'email', 'phone', 'date']
        fields = '__all__'

Viewsの登録

今回はクラスベースでAPIにしてみましょう。

クラスベースの中でもいくつか方法があります。

まずは基本となるAPIviewを使ったやり方を紹介しますが、Viewsetという.CRUDの全部がセットになったものもあります。(CRUDはクリエイト、リード、アップデート、デリートpの略)

from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Members
from .serializers import MembersSerializer




class MemberList(APIView):
    def get(self, request, format=None):
        members = Members.objects.all()
        serializer = MembersSerializer(members, many=True)
        return Response(serializer.data)




Urls.pyの設定

プロジェクト側のurls.pyをアプリ側に転送して、アプリ側のurls.pyでclassのMemberListのエンドポイントを作成します。

#djagoapi/urls.py

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



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

#members.urls.py

from django.urls import path
from .views import MemberList

urlpatterns = [
    path('', MemberList.as_view()),
]

DBをマイグレーション

では、実際にAPIができたかを確認する前に、models.pyのDBの枠組みを流し込みます。

python manage.py makemigrations

python manage.py migrate

python manage.py runserver

テストデータの作成

ではデータが空っぽなのでテスト用に入れていきます。

python manage.py createsuperuser

アドミンパネルにアクセスする前にDBモデルを登録して表示できるようにします。

#members/admin.py

from django.contrib import admin
from .models import Members
# Register your models here.
admin.site.register(Members)

ウェブサーバーを実行してURLからアドミンパネルにアクセスします。

http://127.0.0.1:8000/admin/

Djangoが勝手にmembersにsをつけたのでmodels.pyで変更します。

from django.db import models


class Members(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField(max_length=60)
    phone = models.IntegerField()
    date = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = 'Members'


    def __str__(self):
        return self.name

Pluralは複数形のことです。

あと、__str__の所で、どのように表示したいか教えてあげます。この場合はメンバーのnameのデータを返してあげるようにします。

では、データ登録してみましょう。

では、これでAPIのエンドポイントに行ってみるとAPIが出力されていることが分かりますね!

では、次回はこのDjango RESTFrameworkのAPIでPOSTリクエストやDELETEのリクエストを送ってユーザー側から記事の投稿や削除ができるようにします。

お楽しみに。