知っておくべきこと
・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のリクエストを送ってユーザー側から記事の投稿や削除ができるようにします。
お楽しみに。