- Django を使って REST API を開発したい!
このような疑問にお答えします。
Django では “Django REST framework”(以下、「DRF」とします) というフレームワークを使うことで、REST API を開発することができます。
最初に Django をインストールした上で、さらに DRF をインストールする流れです。
本記事では以下の内容をお伝えします。
- API 開発に DRF を採用するメリット
- DRF を使った API 開発の流れ
- DRF をさらに使いこなす実装例
この記事さえご覧いただければ DRF の全体像を掴んでいただけるよう、内容を網羅して解説していきます。
ただし分量が膨大になってしまう関係で、細かいトピックは別記事を用意しています。関連記事も併せてご覧いただくことで、より DRF を使いこなすことができるようになるはずです。
DRF でできること(機能)と採用するメリット
まずは DRF がどのようなフレームワークかを解説します。
API 開発のためのフレームワークには Python でいえば Flask, FastAPI などが、他の言語であれば NestJS, Spring Boot, Ruby on Rails などがあります。
その中でも DRF を利用するメリットなどを理解して、技術選定の一助としてみてください。
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 利用者にとっても理解しやすくなります。
バージョニング
urls.py でバージョンごとにエンドポイントを切り替えることで、バージョンごとの管理が簡単に行えます。
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 を開発環境にインストールします。
pip install django
続いて Django のプロジェクトをセットアップを行いましょう。
django-admin startproject projectname
アプリケーションの作成を行いましょう。
cd projectname
python manage.py startapp api
さらに、DRF を使用するため以下のコマンドを実行します。
pip install djangorestframework
settings.py に以下を追記して、DRF を使える状態にしましょう。
INSTALLED_APPS = [
...
'rest_framework',
'api',
...
]
これでセットアップは完了です。
モデルの定義
一般的な Django プロジェクトと同様、models.py に以下のような形で記載します。
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
これをデータベースに適用するため、以下のコマンドを実行してマイグレーションを行いましょう。
python manage.py makemigrations
python manage.py migrate
シリアライザの作成
続いてレスポンスとして JSON などを返せるよう、アプリディレクトリ内に serializers.py を作成して以下のように記述しましょう。
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 形式でレスポンスを行うように指定します。
from rest_framework.generics import RetrieveAPIView
from .models import Post
from .serializers import PostSerializer
class PostDetailView(RetrieveAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
ルーティングの設定
さらに、エンドポイントの定義を行います。
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 に以下のような追記を行います。
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework.authtoken',
...
]
さらに、urls.py にトークン認証のエンドポイントを追加。
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'),
...
]
そして認証の詳細を定義するため、以下のコードを追記します。
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
class ExampleView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, format=None):
content = {
'message': 'Hello, World!'
}
return Response(content)
IsAuthenticated を指定することで、トークン認証を有効化することができます。
テスト
最後に test.py などに以下のようなテストコードを記載します。
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 を中心としてプログラミングに関する情報を発信しています。
ぜひ、他の記事にも目を通してみてください。
コメント