【Django入門15】APIエンドポイントの作成|REST APIでデータをやり取りしよう

REST APIとは?

RESTの基本概念

REST(Representational State Transfer)とは、Webサービスの設計に使われるアーキテクチャスタイルです。REST APIは、HTTPプロトコルを使ってクライアントとサーバー間でデータをやり取りするためのエンドポイントを提供します。

REST APIの特徴

  • HTTPメソッドを活用: GET、POST、PUT、DELETEなどのHTTPメソッドを利用してリソースの操作を行います。
  • ステートレス(Stateless): 各リクエストは独立しており、サーバー側にユーザーのセッション情報を保持しません。
  • リソース指向: リソースはURLで一意に識別され、データは主にJSON形式で送受信されます。

RESTの基本操作

HTTPメソッド操作説明
GET読み込み(Retrieve)データの取得
POST作成(Create)新しいリソースの作成
PUT更新(Update)既存のリソースの更新
DELETE削除(Delete)リソースの削除

例:

  • GET /api/posts/(すべての投稿を取得)
  • POST /api/posts/(新しい投稿を作成)
  • PUT /api/posts/1/(ID=1の投稿を更新)
  • DELETE /api/posts/1/(ID=1の投稿を削除)

DjangoでのREST APIのセットアップ

必要なパッケージのインストール

DjangoでREST APIを作成する際に便利なライブラリとして、Django REST framework(DRF)があります。

DRFのインストール:

pip install djangorestframework

settings.pyの設定

インストールしたら、INSTALLED_APPSrest_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',  # 追加
]

モデルの作成

モデルの基本定義

REST APIでデータを管理するためには、まずDjangoのモデルを定義します。ここでは、ブログ投稿(BlogPost)を例にします。

models.py:

from django.db import models

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

    def __str__(self):
        return self.title
  • title: 投稿のタイトルを保存するフィールド。
  • content: 投稿の内容を保存するフィールド。
  • created_at, updated_at: 自動で生成・更新される日時情報。

マイグレーションの適用

モデルを作成したら、データベースに反映するためにマイグレーションを実行します。

python manage.py makemigrations
python manage.py migrate

シリアライザの作成

シリアライザとは?

シリアライザは、データベースのモデルインスタンスをJSONなどのフォーマットに変換するためのものです。また、逆にJSONデータをモデルインスタンスに変換することも可能です。

serializers.py:

from rest_framework import serializers
from .models import BlogPost

class BlogPostSerializer(serializers.ModelSerializer):
    class Meta:
        model = BlogPost
        fields = ['id', 'title', 'content', 'created_at', 'updated_at']
  • ModelSerializer: モデルを元にシリアライザを自動生成する便利なクラスです。
  • fields: シリアライズ対象のフィールドを指定します。

APIビューの作成

関数ベースビュー(FBV)でのAPIエンドポイント

まずはシンプルな関数ベースビューを使ったAPIの例を見ていきます。

views.py:

from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from .models import BlogPost
from .serializers import BlogPostSerializer

@api_view(['GET', 'POST'])
def blog_post_list(request):
    if request.method == 'GET':
        posts = BlogPost.objects.all()
        serializer = BlogPostSerializer(posts, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = BlogPostSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
  • api_view: このデコレーターを使って、関数ベースビューをAPIエンドポイントにします。
  • GETリクエスト: すべてのブログ投稿を取得して返します。
  • POSTリクエスト: 新しい投稿を作成します。

クラスベースビュー(CBV)でのAPIエンドポイント

Django REST frameworkでは、より簡潔にAPIを定義できるクラスベースビューも用意されています。

views.py:

from rest_framework import generics
from .models import BlogPost
from .serializers import BlogPostSerializer

class BlogPostListCreateView(generics.ListCreateAPIView):
    queryset = BlogPost.objects.all()
    serializer_class = BlogPostSerializer
  • ListCreateAPIView: GETとPOSTの両方を処理するための汎用ビュークラスです。

URLの設定

ルーティングの追加

APIエンドポイントを設定するために、urls.pyにパスを追加します。

urls.py:

from django.urls import path
from .views import blog_post_list, BlogPostListCreateView

urlpatterns = [
    # 関数ベースビュー
    path('api/posts/', blog_post_list, name='blog_post_list'),

    # クラスベースビュー
    path('api/posts/cbv/', BlogPostListCreateView.as_view(), name='blog_post_cbv_list')
]

APIの動作確認

開発サーバの起動

次のコマンドで開発サーバを起動します。

python manage.py runserver

APIリクエストの送信

ブラウザまたはAPIクライアント(PostmanやcURLなど)を使用してエンドポイントにアクセスします。

  1. GETリクエスト(すべての投稿を取得): curl -X GET http://127.0.0.1:8000/api/posts/
  2. POSTリクエスト(新しい投稿を作成): curl -X POST http://127.0.0.1:8000/api/posts/ -H "Content-Type: application/json" -d '{"title": "新しい投稿", "content": "Django REST frameworkの学習中です。"}'

認証と認可の追加

認証の基本設定

Django REST frameworkには、さまざまな認証システムが組み込まれています。

例:基本認証の有効化 settings.py:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

これにより、認証されたユーザーのみがAPIにアクセスできます。

トークン認証の導入

トークン認証を使うことで、より安全な認証を実現できます。

pip install djangorestframework-simplejwt

まとめ

Django REST frameworkを使えば、簡単にAPIエンドポイントを構築することができます。シリアライザを使ったデータの変換、ビューによるリクエスト処理、認証の追加といった基本的な構成を理解すれば、REST APIの開発がスムーズに進みます。