【Django REST framework】REST APIを開発する方法

  • Django を使って REST API を開発したい!

このような疑問にお答えします。

Django では “Django REST framework”(以下、「DRF」とします) というフレームワークを使うことで、REST API を開発することができます。

最初に Django をインストールした上で、さらに DRF をインストールする流れです。

本記事では以下の内容をお伝えします。

  • API 開発に DRF を採用するメリット
  • DRF を使った API 開発の流れ
  • DRF をさらに使いこなす実装例

この記事さえご覧いただければ DRF の全体像を掴んでいただけるよう、内容を網羅して解説していきます。

ただし分量が膨大になってしまう関係で、細かいトピックは別記事を用意しています。関連記事も併せてご覧いただくことで、より DRF を使いこなすことができるようになるはずです。

ここでは「REST API がどのようなものか?」といったものは解説しません。

DRFの主な機能

まずは DRF がどのようなフレームワークかを解説します。

API 開発のためのフレームワークには Python でいえば Flask, FastAPI などが、他の言語であれば NestJS, Spring Boot, Ruby on Rails などがあります。

その中でも DRF を利用するメリットなどを理解して、技術選定の一助としてみてください。

ここでは簡単に DRF で実装できる機能と、簡単な説明をしていきます。

  • シリアライゼーション
  • ビューセットとルーター
  • 認証と権限付与
  • ページネーションとフィルタリング
  • ブラウザブルAPI
  • バージョニング
  • セキュリティ

それぞれ、掘り下げて解説します。

シリアライゼーション

Django 内部で処理された Python オブジェクトを、JSON や XML などのフロントエンドで解釈がしやすい形式に変換することができます。

この変換機能を「シリアライズ」と呼び、これが DRF の代表的な機能の一つになります。

ビューセットとルーター

API のアクセス先となるエンドポイントを決定することができます。

大元のフレームワークは Django を利用しているので、ビューとルーターはそれぞれ “views.py” と “urls.py” で制御することになります。

認証と権限付与

Basic 認証、セッション認証、トークン認証を標準でサポートしています。

また、”REST framework api key” などのサードパーティライブラリを使うことで、API Key 認証機能なども実装することができます。

ページネーションとフィルタリング

大量のデータを小分けできる「ページネーション」が実装できます。

これにより、レスポンス速度が向上したり、ユーザーがデータを簡単に見つけやすくできます。

DRF では以下のようなページネーション種類を提供しています。

  • LimitOffsetPagination
  • PageNumberPagination
  • CursorPagination

settings.py に記述すれば全体にページネーションを反映させることができますし、ビューごとにページネーションを個別設定することも可能です。

また、特定のキーワードで検索したりといった「フィルタリング」も簡単に実装できます。

フィルタリングバックエンドとしては、以下のようなものがあります。

  • DjangoFilterBackend
  • SearchFilter
  • OrderingFilter

これらの詳細は、別記事で解説する予定です。

ブラウザブルAPI

ブラウザから直接 API を閲覧できる機能です。

これにより API の挙動を簡単に確認できるので、フロントエンド開発者や API 利用者にとっても理解しやすくなります。

ブラウザブルAPIはデフォルト機能ですが、うまく動作しない場合には settings.py の DEFAULT_RENDERER_CLASSES に BrowsableAPIRenderer あるか確認してください。

バージョニング

urls.py でバージョンごとにエンドポイントを切り替えることで、バージョンごとの管理が簡単に行えます。

Python
from django.urls import path, include

urlpatterns = [
    path('api/v1/', include('app_v1.urls')),  # v1のAPI
    path('api/v2/', include('app_v2.urls')),  # v2のAPI
]

バージョニング方法は、後日別記事で詳しく紹介する予定です。

セキュリティ

CSRF 保護や CORS ヘッダーの管理など、セキュリティ対策が組み込まれています。

DRFを採用するメリット

DRF を採用することで、以下のメリットが得られます。

  • Django と統合している
  • 高度なシリアライゼーションが可能
  • 細かく認証設定ができる

Django と統合している

すでに Python や Django を使い慣れている方には、学習コストを抑えて導入ができます。

また、Djangoのモデル、ユーザー認証、管理画面などがそのまま使えることも大きなメリットの一つです。

高度なシリアライゼーションが可能

Django モデルから API に簡単に変換できる仕組みが備わっています。

他のフレームワークでは、モデルの変換・複雑なデータモデルのサポート・フィールドレベルのカスタマイズなどが煩雑になりがちですが、Django を使うことでシンプルに記述できるようになります。

細かく認証設定ができる

DRF では標準で「基本認証」「トークン認証」「OAuth」などをサポートしています。

さらに、Django 標準で搭載されている「セッション管理」「CSRF」などのセキュリティ機能とも連動。

ビューごとに異なる認証方法を採用したり、ユーザーやグループごとに認証方式を変えることもでき、柔軟性の高さが魅力です。

DRFを使ったAPI開発の流れ

ここからは実際に DRF を使った API 開発の流れをお伝えします。

基本的な流れとして、以下の流れで説明します。

  • プロジェクトのセットアップ
  • モデルの定義
  • シリアライザの作成
  • ビューの作成
  • ルーティングの設定
  • 認証と権限の設定
  • テスト

① プロジェクトのセットアップ

Django を開発環境にインストールします。

Bash
pip install django

続いて Django のプロジェクトをセットアップを行いましょう。

Bash
django-admin startproject projectname

アプリケーションの作成を行いましょう。

Bash
cd projectname
python manage.py startapp api

さらに、DRF を使用するため以下のコマンドを実行します。

Bash
pip install djangorestframework

settings.py に以下を追記して、DRF を使える状態にしましょう。

Python
INSTALLED_APPS = [
    ...
    'rest_framework',
    'api',
    ...
]

これでセットアップは完了です。

② モデルの定義

一般的な Django プロジェクトと同様、models.py に以下のような形で記載します。

Python
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

これをデータベースに適用するため、以下のコマンドを実行してマイグレーションを行いましょう。

Bash
python manage.py makemigrations
python manage.py migrate

③ シリアライザの作成

続いてレスポンスとして JSON などを返せるよう、アプリディレクトリ内に serializers.py を作成して以下のように記述しましょう。

Python
from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['id', 'title', 'content', 'created_at', 'updated_at']

④ ビューの作成

先ほど作成したシリアライザを “views.py” 内で指定して、JSON 形式でレスポンスを行うように指定します。一覧表示用のPostListViewと、詳細表示用のPostDetailViewを両方作成します。

Python
from rest_framework.generics import ListAPIView, RetrieveAPIView
from .models import Post
from .serializers import PostSerializer

class PostListView(ListAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

class PostDetailView(RetrieveAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

⑤ ルーティングの設定

さらに、エンドポイントの定義を行います。

Python
from django.urls import path
from .views import PostDetailView, PostListView

urlpatterns = [
    path('posts/', PostListView.as_view(), name='post-list'),
    path('posts/<int:pk>/', PostDetailView.as_view(), name='post-detail'),
]

⑥ 認証と権限の設定

settings.py に以下のような追記を行います。

Python
INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework.authtoken',
    ...
]

さらに、urls.py にトークン認証のエンドポイントを追加。

Python
from django.urls import path
from rest_framework.authtoken.views import obtain_auth_token

urlpatterns = [
    ...
    path('api-token-auth/', obtain_auth_token, name='api_token_auth'),
    ...
]

そして認証の詳細を定義するため、以下のコードを追記します。

Python
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework.response import Response

class ExampleView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request, format=None):
        content = {
            'message': 'Hello, World!'
        }
        return Response(content)

IsAuthenticated を指定することで、トークン認証を有効化することができます。

⑦ テスト

最後に test.py などに以下のようなテストコードを記載します。

Python
from rest_framework.test import APITestCase
from rest_framework import status
from django.urls import reverse
from .models import Post

class PostAPITest(APITestCase):
    def setUp(self):
        # テスト用のデータを準備
        Post.objects.create(title='Test Post 1', content='Test Content 1')
        Post.objects.create(title='Test Post 2', content='Test Content 2')

    def test_view_posts(self):
        url = reverse('post-list')
        response = self.client.get(url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data), 2)

これで基本的な API 作成は完了です。

DRFをさらに使いこなす実装例

次のような DRF の標準機能を拡張する方法をお伝えします。

  • CORS ヘッダーを付与する
  • API Key 認証を追加する
  • 画像アップロード機能を実装する

CORSヘッダーを付与する

フロントエンドとして React などの JavaScript フレームワークを使う場合には、 CORS 対策を行うことがあります。

以下の記事では、”django-cors-headers” を利用した実装方法をご紹介しています。

API Key認証を追加する

サードパーティライブラリ “restframework-api-key” を使えば、 API Key 認証機能を追加することができます。

詳しい実装方法は、後日別記事で解説する予定です。

画像アップロード機能を実装する

API に画像アップロード機能を実装するには、少し工夫が必要です。

以下の記事で詳細を解説しましたので、ご覧ください。

まとめ

Python で API 開発をする場合、真っ先に候補に上がるのが DRF になると思います。

本記事では DRF の全体像をざっと見渡してきました。

本ブログでは Python を中心としてプログラミングに関する情報を発信しています。

ぜひ、他の記事にも目を通してみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

普段は主にPython開発をしています。
最近はAI駆動開発にも関わっています。

コメント

コメントする