DRFの概要とセットアップ
djangorestframework(DRF)は、Django上で動作する追加アプリケーションです。Django固有の拡張であり、他のフレームワークでは直接利用できません。
インストール方法
- pip経由:
pip install djangorestframework - IDE支援:
PyCharmなどのIDEでは、パッケージマネージャーから'djangorestframework'を検索・インストール可能です。
インストール後、settings.pyのINSTALLED_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)を取得・操作するアーキテクチャスタイルです。前后分離型アプリケーションで広く採用されています。
主な規約
- 階層設計:
APIの基本エンドポイントは、常時/api/または/v{VERSION}などの明確なプレフィックスで識別します。https://example.com/api/v1/posts/ - セキュリティ:
データ転送にはHTTPSを強制します(特に個人情報や認証情報を取り扱う場合)。 - リソourn命名:
URIは名詞(複数形推奨)で構成し、アクションを表す動詞は含めません。 例:/users/(×/getUser/) - HTTPメソッドによる操作分離:
GET リソース一覧または個別取得 POST 新規リソース作成 PUT 全フィールド更新(置換) PATCH 一部フィールド更新(パッチ) DELETE リソース削除 - フィルタリング・ pagging:
検索条件やページ指定はクエリパラメータで渡します。 例:/products?category=books&limit=20 - レスポンス構造:
返却結果には必ずHTTPステータスコードと、body内にサービス固有のコードを持つオブジェクトを含めます。HTTP 200 OK/HTTP 404 Not Foundに加え、{ "code": 200, "message": "success", "data": [...] } - プリンシパルな画像やファイル:
返却データに相対/絶対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では、シリアライザーと組み合わせることで、入力検証・シリアライズ・バッチ生成を簡潔に定義できます。