0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Djangoメモ -REST frameworkについて-

0
Last updated at Posted at 2025-10-21

はじめに

今回は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 <プロジェクト名>

次に以下のコードを指定の場所に書いていきましょう。

プロジェクト名/veiws.py
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ルーティングを行っていきましょう。

プロジェクト名/urls.py
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を書き込みましょう

プロジェクト名/settings.py
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

を行い、以下のページに遷移することができれば成功です。
image.png

4,seliarizerの定義

次に、シリアライザーを定義するためにプロジェクトの中にアプリを作っていきましょう。
その前にシリアライザーとは何なのかを書いていきたいと思います。

シリアライザーとは

端的に言うとmodelと入出力の橋渡しを行います。違うところから入力があったらそれをmodelのフォームに落とし込んだり、その逆を行ったりします。詳しいことは以下のリンクから
[Django REST Framework] Serializerの使い方

それでは行っていきましょう。

$python manage.py startapp <アプリ名>

以上のコマンドでシリアライザーに必要なアプリを作っていきます。
そうしましたら、以下のようにファイルを作成してください。

プロジェクト名
├── プロジェクト名
├── アプリ名
│   └── serializer.py
└── manage.py

次にmodelを作っていきましょう。アプリ名フォルダの中にあるmodels.pyを以下のように書きましょう。

アプリ名/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でアプリ名フォルダを読み込ませてみましょう。

プロジェクト名/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に書き込んでください。

アプリ名/sirializers.py
from rest_framework import serializers
from .models import Student

class StudentSerializer(serializers.ModelSerializer):
    class Meta:#シリアライズの設定を行う
        model = Student
        field = (
            'name','age'
        )#指定したカラムを表示するためのもの

次にプロジェクト名フォルダのviews.pyにシリアライザーの設定をimportoしていきます。以下のようにコードを書き加えてください。

プロジェクト名/views.py
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 <プロジェクト名>

次に以下のコードを指定の場所に書いていきましょう。

プロジェクト名/veiws.py
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ルーティングを行っていきましょう。

プロジェクト名/urls.py
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を書き込みましょう

プロジェクト名/settings.py
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

を行い、以下のページに遷移することができれば成功です。
image.png

4,seliarizerの定義

次に、シリアライザーを定義するためにプロジェクトの中にアプリを作っていきましょう。
その前にシリアライザーとは何なのかを書いていきたいと思います。

シリアライザーとは

端的に言うとmodelと入出力の橋渡しを行います。違うところから入力があったらそれをmodelのフォームに落とし込んだり、その逆を行ったりします。詳しいことは以下のリンクから
[Django REST Framework] Serializerの使い方

それでは行っていきましょう。

$python manage.py startapp <アプリ名>

以上のコマンドでシリアライザーに必要なアプリを作っていきます。
そうしましたら、以下のようにファイルを作成してください。

プロジェクト名
├── プロジェクト名
├── アプリ名
│   └── serializer.py
└── manage.py

次にmodelを作っていきましょう。アプリ名フォルダの中にあるmodels.pyを以下のように書きましょう。

アプリ名/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でアプリ名フォルダを読み込ませてみましょう。

プロジェクト名/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に書き込んでください。

アプリ名/sirializers.py
from rest_framework import serializers
from .models import Student

class StudentSerializer(serializers.ModelSerializer):
    class Meta:#シリアライズの設定を行う
        model = Student
        field = (
            'name','age'
        )#指定したカラムを表示するためのもの

次にプロジェクト名フォルダのviews.pyにシリアライザーの設定をimportoしていきます。以下のようにコードを書き加えてください。

プロジェクト名/views.py
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
いかの画面の通りに進めてください
image.png
image.png
image.png
プラスボタンをクリック
image.png
ここのurlにdjangoのローカルurlを張り付ける(runserverしてね)
image.png
bodyとform-dataに移動します。
image.png
これができましたら、次は実際にデータベースに入っているか見てみましょう。
以下の場所にコードを書きましょう

プロジェクト名/admin.py
from django.contrib import admin
from .models import Student

# Register your models here.
admin.site.register(Student)

そうしましたら、

$python manage.py createsuperuser

これでadminpパネルを開いてみましょう
image.png
image.png
こうなっていたら大成功です。
最後にgetメソッドの際に今あるStudentオブジェクトをすべてJSON形式で返すプログラムに書き換えます

プロジェクト名/views.py
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で実験してみましょう。
image.png
以上のようになれば成功です。いまはひとつですが、ここにgetで追加するごとに増えていきます。

Authenticateについて

次に今回作ったAPIをいちいちログインに認証するのは手間なのでトークンを発行していちいちログインするのを楽にしていこうとおもいます。

プロジェクト名/views.py
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をいじっていきます

プロジェクト名/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パネルを開いて確認してみましょう。そこにあるトークンをコピーして(先ほどのコマンドの後にも表示されます)
image.png
実際にAPIを使えるかどうかをPostmanで確認してみましょう
注 APIキーの前に'Token 'をつけましょう
そしたら以下の画面のように何も返されなければ成功です。
image.png
最後に以上で作ったAPIキーを取得できるようにurlルーティングしていきましょう。urls.pyに以下のコードを追加してください。

プロジェクト名/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')#ここ
]

最後にこれでしっかりとトークンを取得できるかPostmanで見てみましょう
image.png
以上の画面になれば大成功です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?