Django REST Frameworkの基本構造とAPI設計

DRFの概要とセットアップ

djangorestframework(DRF)は、Django上で動作する追加アプリケーションです。Django固有の拡張であり、他のフレームワークでは直接利用できません。

インストール方法

  • pip経由:
    pip install djangorestframework
  • IDE支援:
    PyCharmなどのIDEでは、パッケージマネージャーから'djangorestframework'を検索・インストール可能です。
注意:インストール時にDjango本体が自動で最新版に更新される場合があります。

インストール後、settings.pyINSTALLED_APPS'rest_framework'を追加してください。

基本的な使用法

from rest_framework.views import APIView
from rest_framework.response import Response

class ArticleList(APIView):
    def get(self, request, *args, **kwargs):
        # クライアントのネゴシエーション結果に応じて、適切な形式(JSONなど)でデータを返却
        return Response({'articles': [...]})

ResponseはDjangoのJsonResponseと異なり、Acceptヘッダーベースのコンテンツネゴシエーションを自動で行い、返却形式を切り替えます。

RESTful API設計の原則

REST(Representational State Transfer)は、ネットワーク上のリソースをURIで識別し、その表層的な表現(representation)を取得・操作するアーキテクチャスタイルです。前后分離型アプリケーションで広く採用されています。

主な規約

  1. 階層設計:
    APIの基本エンドポイントは、常時/api/または/v{VERSION}などの明確なプレフィックスで識別します。 https://example.com/api/v1/posts/
  2. セキュリティ:
    データ転送にはHTTPSを強制します(特に個人情報や認証情報を取り扱う場合)。
  3. リソourn命名:
    URIは名詞(複数形推奨)で構成し、アクションを表す動詞は含めません。 例: /users/(×/getUser/
  4. HTTPメソッドによる操作分離:
    GETリソース一覧または個別取得
    POST新規リソース作成
    PUT全フィールド更新(置換)
    PATCH一部フィールド更新(パッチ)
    DELETEリソース削除
  5. フィルタリング・ pagging:
    検索条件やページ指定はクエリパラメータで渡します。 例: /products?category=books&limit=20
  6. レスポンス構造:
    返却結果には必ずHTTPステータスコードと、body内にサービス固有のコードを持つオブジェクトを含めます。 HTTP 200 OK / HTTP 404 Not Foundに加え、 { "code": 200, "message": "success", "data": [...] }
  7. プリンシパルな画像やファイル:
    返却データに相対/絶対URLを含めることで、クライアントがリソースを自主的に取得できるようにします。 例: "avatar": "https://cdn.example.com/avatar/123.jpg"

Requestオブジェクトの拡張

DRFのRequestはDjango標準のHttpRequestをラップし、豊富なメソッドを提供します。

  • request._request: 元のWSGIRequestへの参照
  • request.data: POST/PUT/PATCHリクエストのボディから解析されたデータ(JSON、 form-data、urlencodedを自動判別)
  • request.query_params: URLクエリの解析結果(Djangoのrequest.GETと同等ですが、REST準拠として明示的に区別)
  • request.user: 認証・認可済みのユーザー(可能性として匿名ユーザーを含み得る)
  • request.FILES: アップロードされたファイル群

Internally, request.__getattr___request オブジェクトの属性を proxy しており、既存のメソッドすべてに透過的にアクセス可能です。

def get(self, request):
    # 以下すべて可能:
    user = request.user
    raw_data = request._request.read()
    body_json = request.data
    get_params = request.query_params.get('q')

APIエンドポイントの実装例

APIエンドポイントとは、クライアントから指定された引数を渡すことで、特定の機能やデータにアクセスするための公開インタフェースです。

from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import ArticleSerializer
from .models import Article

class ArticleList(APIView):
    def get(self, request):
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return Response({
            'code': 200,
            'data': serializer.data
        })

    def post(self, request):
        serializer = ArticleSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response({
                'code': 201,
                'data': serializer.data
            }, status=201)
        return Response({
            'code': 400,
            'message': 'Invalid data',
            'errors': serializer.errors
        }, status=400)

このようにDRFでは、シリアライザーと組み合わせることで、入力検証・シリアライズ・バッチ生成を簡潔に定義できます。

タグ: Django-REST-Framework RESTful-API APIView Request serializers

5月18日 06:30 投稿