実践DRF:Django REST Frameworkを使ったREST APIの基礎
やりたいこと
RESTAPIの基礎を学んで、DRFを使用して簡単なRESTAPIの作成!
1. REST APIの基本概要
REST API(Representational State Transfer API)は、Webサービス間でデータをやり取りするための設計スタイルのこと。
以下のような原則を持つことで、シンプルかつスケーラブルなシステム設計を実現する。
リソース指向
:すべてのデータは「リソース」として扱われ、URLを通じてアクセスされる。
例えば、/users
や /posts
のように、それぞれのエンティティがリソースとして定義される。
HTTPメソッドの活用
:操作の種類に応じてHTTPメソッドを使い分ける。
- GET: リソースの取得
- POST: リソースの新規作成
- PUT/PATCH: リソースの更新
- DELETE: リソースの削除
ステートレス性
:サーバーはリクエスト間で状態を持たず、すべての情報はリクエストに含まれる。
これにより、スケーラビリティが向上する。
なぜステートレスにするのか
昔の情報をとっておいたままにするとその分管理コストがかかる。
ステートレスにすることでよりシンプルな設計にすることができる!
2. Django REST Framework (DRF)の概要
Django REST Framework(DRF)は、DjangoでREST APIを構築するためのライブラリ。
Djangoと統合しやすく、シリアライザーやビューセットなど、API開発を効率化するための多くの機能を提供。
シリアライザー(Serializers)
:データの入力と出力をシリアル化(JSONなどの形式に変換)するための機能。
DjangoモデルのデータをJSONに変換したり、逆にJSONをDjangoモデルに変換したりすることが可能。
ビューセット(ViewSets)
:CRUD操作を自動的に実装するためのビュークラスのセット。
ビューセットを使用すると、GET /users/
や POST /users/
などのエンドポイントを簡単に作成可能に。
ルーティング(Routers)
:ビューセットとシリアライザーをまとめ、エンドポイントへのルーティングを簡潔に設定できる機能。
3. 基本的なDRFの実装例
DRFの実装を通して具体的なコードを紹介。ここでは、簡単な「記事管理API」を作成する。
1.モデルの作成
まず、Post
モデルを作成し、記事のタイトルや内容、作成日を保持。
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)
def __str__(self):
return self.title
シリアライザーの作成
次に、PostSerializer
を作成し、Post
モデルのデータをJSONにシリアライズします。
from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = '__all__'
ビューセットの作成
Post
モデルのCRUD操作を行うビューセットを作成します。
from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
ルーティングの設定
ルーターを用いてURLを設定します。urls.py
ファイルに以下を記述する。
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import PostViewSet
router = DefaultRouter()
router.register(r'posts', PostViewSet)
urlpatterns = [
path('', include(router.urls)),
]
/postsでAPIリクエスト送ると、postテーブルへのCRUD操作が可能に!
4. DRFの便利機能の紹介
DRFには、便利な追加機能が多くある。いくつかの実用例を以下に紹介。
- 認証と認可:JWT(JSON Web Token)を使ったトークン認証や、OAuth2認証といったさまざまな認証方式に対応。
- APIドキュメント生成:DRFはSwaggerやRedocを使ってAPIドキュメントを自動生成する機能をサポートしています。これにより、APIのエンドポイントやパラメーターの詳細が一目でわかる。
- フィルタリングと検索:
DjangoFilterBackend
を使ってリソースのフィルタリングや検索が可能。例えば、GET /posts?title=example
でタイトルに「example」が含まれる記事を取得可能に。 - ページネーション:リソースをページ単位で取得するためのページネーションも簡単に実装可能。リクエストURLに
?page=2
といったパラメーターを付けるだけで、2ページ目のデータが取得できる。
5. REST APIとDRFの実用例
実際にREST APIとDRFが利用されるケースや、導入のメリットについて触れると読者の理解が深まります。
フロントエンドとの連携
:REST APIはReactやVue.jsなどのフロントエンドフレームワークと相性が良く、データを効率的にやり取りできます。例えば、Reactを用いたシングルページアプリケーション(SPA)のバックエンドとしてDRFを使用するケースが一般的。
モバイルアプリのバックエンド
:REST APIは、AndroidやiOSアプリのバックエンドとしても適しています。スマートフォンアプリからのリクエストをDRFが処理し、データベースから必要なデータを取得して返す流れが一般的です。
マイクロサービス
:REST APIはマイクロサービスアーキテクチャにも有効で、各サービスが独立したAPIを持つことで、システム全体のスケーラビリティやメンテナンス性が向上します。