はじめに
今回はDjangoのREST frameworkを書いていきたいと思います。
1,REST frameworkとは
簡潔に書くと、APIを構築したりするためのものです。REST frameworkの似たようなものとして、REST APIというものがありますがREST frameworkはそれの一種です。
2,REST frameworkの導入
2.1REST frameworkのインストール
以下のコマンドを入力してください。
$pip install djangorestframework
3,APIを作ってみよう
次にAPIを作ってみましょう。
以下のコマンドを入力して、新しいプロジェクトを立ち上げましょう
$django-admin startproject <プロジェクト名>
次に以下のコードを指定の場所に書いていきましょう。
from rest_framework.views import APIView
from rest_framework.response import Response
class TestView(APIView):#TestViewにAPIViewを継承している
def get(self,requset, *args, **kwargs):#getメソッドの時の処理を定義
data = {#getメソッドが来た時にdataに以下のものを入れて
'username':'admin',
'years_active':10,
}
return Response(data)#ここでdataを返している、
以上のコードは端的に申すとHTTPレスポンスが来たら既定の(今回だとdata)をJSON形式で返すというAPIを実装しています。
次に欠かせないurlルーティングを行っていきましょう。
from django.contrib import admin
from django.urls import path
from .views import TestView
urlpatterns = [
path('admin/', admin.site.urls),
path('api-auth/',include('rest_framework.urls')),#api-authというurlルーティングから'rest_framework.url'を埋め込む
path('',TestView.as_view(),name='test')#.as_view()というのは,汎用viewを認識するためのものという認識。TestViewではAPIViewというものをimportして継承しているため。
]
以上のように書き込んでください。
次にsettings.pyにrest_frameworkを書き込みましょう
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
]
これで
$python manage.py runserver
4,seliarizerの定義
次に、シリアライザーを定義するためにプロジェクトの中にアプリを作っていきましょう。
その前にシリアライザーとは何なのかを書いていきたいと思います。
シリアライザーとは
端的に言うとmodelと入出力の橋渡しを行います。違うところから入力があったらそれをmodelのフォームに落とし込んだり、その逆を行ったりします。詳しいことは以下のリンクから
[Django REST Framework] Serializerの使い方
それでは行っていきましょう。
$python manage.py startapp <アプリ名>
以上のコマンドでシリアライザーに必要なアプリを作っていきます。
そうしましたら、以下のようにファイルを作成してください。
プロジェクト名
├── プロジェクト名
├── アプリ名
│ └── serializer.py
└── manage.py
次にmodelを作っていきましょう。アプリ名フォルダの中にあるmodels.pyを以下のように書きましょう。
from django.db import models
# Create your models here.
class Student(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
description = models.TextField()
data_enrolled = models.DateTimeField(auto_now=True)
def __str__(self):#管理画面での判別が可能になる。詳細は以下のリンク。
return self.name
Serializerとmodelの使い方について(def__str__)
次に、settings.pyでアプリ名フォルダを読み込ませてみましょう。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'drfapp',#←ここが変わった。
]
そうしましたらmigrationしていきましょう
$python manage.py makemigrations
$python manage.py migrate
以下のようにserializers.pyに書き込んでください。
from rest_framework import serializers
from .models import Student
class StudentSerializer(serializers.ModelSerializer):
class Meta:#シリアライズの設定を行う
model = Student
field = (
'name','age'
)#指定したカラムを表示するためのもの
次にプロジェクト名フォルダのviews.pyにシリアライザーの設定をimportoしていきます。以下のようにコードを書き加えてください。
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from drfapp.serializers import StudentSerializer#アプリ名/serializersからStudentSerializerをimport
from drfapp.models import Student#アプリ名/modelsからStudentをimport
class TestView(APIView):
def get(self,requset, *args, **kwargs):
data = {
'username':'admin',
'years_active':10,
}
return Response(data)
def post(self,request,*args,**kargs):#postメソッドの時の定義
serializer = StudentSerializer(data=request.data)#送ってきたデータ(request.data)をdata(StudentSerializerの引数)に入れて行いserializer変数に入れる
if serializer.is_valid():#バリデーションチェック。バリデーションとはmodelの値の型が同じかどうかだったりデータが足りるかを判定する。これ以降のコードはしっかりバリデーションチェックOKだった場合に行う
serializer.save()
return Response(serializer.data)
return Response(serializer.errors)
5,PostManの使用
次にし はじめに
今回はDjangoのREST frameworkを書いていきたいと思います。
1,REST frameworkとは
簡潔に書くと、APIを構築したりするためのものです。REST frameworkの似たようなものとして、REST APIというものがありますがREST frameworkはそれの一種です。
2,REST frameworkの導入
2.1REST frameworkのインストール
以下のコマンドを入力してください。
$pip install djangorestframework
3,APIを作ってみよう
次にAPIを作ってみましょう。
以下のコマンドを入力して、新しいプロジェクトを立ち上げましょう
$django-admin startproject <プロジェクト名>
次に以下のコードを指定の場所に書いていきましょう。
from rest_framework.views import APIView
from rest_framework.response import Response
class TestView(APIView):#TestViewにAPIViewを継承している
def get(self,requset, *args, **kwargs):#getメソッドの時の処理を定義
data = {#getメソッドが来た時にdataに以下のものを入れて
'username':'admin',
'years_active':10,
}
return Response(data)#ここでdataを返している、
以上のコードは端的に申すとHTTPレスポンスが来たら既定の(今回だとdata)をJSON形式で返すというAPIを実装しています。
次に欠かせないurlルーティングを行っていきましょう。
from django.contrib import admin
from django.urls import path
from .views import TestView
urlpatterns = [
path('admin/', admin.site.urls),
path('api-auth/',include('rest_framework.urls')),#api-authというurlルーティングから'rest_framework.url'を埋め込む
path('',TestView.as_view(),name='test')#.as_view()というのは,汎用viewを認識するためのものという認識。TestViewではAPIViewというものをimportして継承しているため。
]
以上のように書き込んでください。
次にsettings.pyにrest_frameworkを書き込みましょう
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
]
これで
$python manage.py runserver
4,seliarizerの定義
次に、シリアライザーを定義するためにプロジェクトの中にアプリを作っていきましょう。
その前にシリアライザーとは何なのかを書いていきたいと思います。
シリアライザーとは
端的に言うとmodelと入出力の橋渡しを行います。違うところから入力があったらそれをmodelのフォームに落とし込んだり、その逆を行ったりします。詳しいことは以下のリンクから
[Django REST Framework] Serializerの使い方
それでは行っていきましょう。
$python manage.py startapp <アプリ名>
以上のコマンドでシリアライザーに必要なアプリを作っていきます。
そうしましたら、以下のようにファイルを作成してください。
プロジェクト名
├── プロジェクト名
├── アプリ名
│ └── serializer.py
└── manage.py
次にmodelを作っていきましょう。アプリ名フォルダの中にあるmodels.pyを以下のように書きましょう。
from django.db import models
# Create your models here.
class Student(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
description = models.TextField()
data_enrolled = models.DateTimeField(auto_now=True)
def __str__(self):#管理画面での判別が可能になる。詳細は以下のリンク。
return self.name
Serializerとmodelの使い方について(def__str__)
次に、settings.pyでアプリ名フォルダを読み込ませてみましょう。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'drfapp',#←ここが変わった。
]
そうしましたらmigrationしていきましょう
$python manage.py makemigrations
$python manage.py migrate
以下のようにserializers.pyに書き込んでください。
from rest_framework import serializers
from .models import Student
class StudentSerializer(serializers.ModelSerializer):
class Meta:#シリアライズの設定を行う
model = Student
field = (
'name','age'
)#指定したカラムを表示するためのもの
次にプロジェクト名フォルダのviews.pyにシリアライザーの設定をimportoしていきます。以下のようにコードを書き加えてください。
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from drfapp.serializers import StudentSerializer#アプリ名/serializersからStudentSerializerをimport
from drfapp.models import Student#アプリ名/modelsからStudentをimport
class TestView(APIView):
def get(self,requset, *args, **kwargs):
data = {
'username':'admin',
'years_active':10,
}
return Response(data)
def post(self,request,*args,**kargs):#postメソッドの時の定義
serializer = StudentSerializer(data=request.data)#送ってきたデータ(request.data)をdata(StudentSerializerの引数)に入れて行いserializer変数に入れる
if serializer.is_valid():#バリデーションチェック。バリデーションとはmodelの値の型が同じかどうかだったりデータが足りるかを判定する。これ以降のコードはしっかりバリデーションチェックOKだった場合に行う
serializer.save()
return Response(serializer.data)
return Response(serializer.errors)
5,Postmanの使用
次にAPIがしっかり動くかどうかを確認するためにPostmanを活用していきます。以下からPostmanをダウンロードするかwebサイトからPostmanを使用してください。
Postman
いかの画面の通りに進めてください



プラスボタンをクリック

ここのurlにdjangoのローカルurlを張り付ける(runserverしてね)

bodyとform-dataに移動します。

これができましたら、次は実際にデータベースに入っているか見てみましょう。
以下の場所にコードを書きましょう
from django.contrib import admin
from .models import Student
# Register your models here.
admin.site.register(Student)
そうしましたら、
$python manage.py createsuperuser
これでadminpパネルを開いてみましょう


こうなっていたら大成功です。
最後にgetメソッドの際に今あるStudentオブジェクトをすべてJSON形式で返すプログラムに書き換えます
class TestView(APIView):
def get(self,requset, *args, **kwargs):
qs = Student.objects.all()
serializer = StudentSerializer(qs,many = True)#ここでのmany = True は複数のオブジェクトをシリアライズしていいということです。
return Response(serializer.data)
以上のようにget関数を書き換えてください。書き換えられましたら実際にPostmanで実験してみましょう。

以上のようになれば成功です。いまはひとつですが、ここにgetで追加するごとに増えていきます。
Authenticateについて
次に今回作ったAPIをいちいちログインに認証するのは手間なのでトークンを発行していちいちログインするのを楽にしていこうとおもいます。
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated#認証済みの人をAPIしよう可にするためのライブラリをimport
from drfapp.serializers import StudentSerializer
from drfapp.models import Student
class TestView(APIView):
permission_classes = (IsAuthenticated,)#このAPIビューはログイン済みユーザーだけがアクセスできる」 という制限をかけるための設定
def get(self,requset, *args, **kwargs):
qs = Student.objects.all()
serializer = StudentSerializer(qs,many = True)
return Response(serializer.data)
def post(self,request,*args,**kwargs):
serializer = StudentSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors)
#を付けたところが書き換えた場所とその解説です。
次にsettings.pyをいじっていきます
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'rest_framework.authtoken',#認証トークンの発行アプリをインストール
'drfapp',
]
-------------------------------------------------------------
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
REST_FRAMEWORK = {#これは、APIにアクセスする際の「認証方法(Authentication)」をトークン方式にするという設定です。
'DEFAULT_AUTHENTICATION_CLASSES':[
'rest_framework.authentication.TokenAuthentication'
]
}
そうしたらmigrateしていきましょう
$python manage.py makemigrations
$python manage.py migrate
次に一度DBを初期化して違いを見てみましょう
以下初期化コマンド
$python manage.py flush
次にsuperuserも初期化してしまったのでそれらを再び作成しましょう。
$python manage.py createsuperuser
そうしましたら次はsuperuserのAPI認証用のトークンを発行していきましょう。以下のコマンドです
$python manage.py drf_create_token <スーパーユーザー名>
できましたら、adminパネルを開いて確認してみましょう。そこにあるトークンをコピーして(先ほどのコマンドの後にも表示されます)

実際にAPIを使えるかどうかをPostmanで確認してみましょう
注 APIキーの前に'Token 'をつけましょう
そしたら以下の画面のように何も返されなければ成功です。

最後に以上で作ったAPIキーを取得できるようにurlルーティングしていきましょう。urls.pyに以下のコードを追加してください。
from django.contrib import admin
from django.urls import path, include
from .views import TestView
from rest_framework.authtoken.views import obtain_auth_token#ここ
urlpatterns = [
path('admin/', admin.site.urls),
path('api-auth/',include('rest_framework.urls')),
path('',TestView.as_view(),name='test'),
path('api/token/',obtain_auth_token,name='obtain')#ここ
]

