【ITニュース解説】Building a Blog API with Django REST Framework
2025年09月29日に「Dev.to」が公開したITニュース「Building a Blog API with Django REST Framework」について初心者にもわかりやすく解説しています。
ITニュース概要
Django REST Framework (DRF) でブログAPIを構築するチュートリアル。独自のユーザー情報 (カスタムユーザーモデル) を用い、アカウントと投稿管理の2アプリで記事の作成・読込・更新・削除 (CRUD) が可能なAPIを作る。環境構築から実装、テストまでを解説する。
ITニュース解説
今回のニュース記事は、現代のアプリケーション開発に不可欠なAPI(アプリケーション・プログラミング・インターフェース)を、PythonのWebフレームワークであるDjangoと、API開発用の拡張であるDjango REST Framework (DRF) を使って構築する手順について解説している。具体的には、ブログサービスを想定し、ユーザー管理と記事管理の機能を備えたAPIを作る方法を示している。
まず、APIとは何かを理解することが重要だ。APIは、異なるソフトウェアやサービスが互いに情報をやり取りするための約束事や仕組みのことで、Webサービスやスマートフォンのアプリが裏側で連携するために広く利用されている。例えば、天気アプリが気象情報サービスから最新の天気予報を取得する際などにAPIが使われている。Django REST Frameworkは、Djangoの持つ強力な機能と組み合わせることで、効率的に堅牢なAPIを構築できるツール群だ。
このブログAPIの構築では、大きく分けて二つのアプリケーション(Djangoでは「アプリ」と呼ぶ)を作成する。「accounts」アプリは、ユーザーの登録やログインといった認証機能、およびユーザー情報の管理を担当する。一方、「posts」アプリは、ブログ記事の作成、一覧表示、詳細表示、更新、削除といった、ブログの中核となる機能を提供する。
開発を始めるにあたり、プロジェクトの初期設定を行う。Python開発では、プロジェクトごとに独立した環境を作る「仮想環境」を使うのが一般的だ。これにより、異なるプロジェクト間でライブラリのバージョンが衝突するのを防ぐ。コマンドラインでプロジェクトフォルダを作成し、venvコマンドで仮想環境を構築、アクティベートする。その後、pip installコマンドでDjango、djangorestframework、およびdjango-cors-headersといった必要なライブラリをインストールする。django-cors-headersは、Webブラウザのセキュリティ機能であるCORS(クロスオリジンリソース共有)に対応するためのもので、異なるWebサイト(例えば、APIを使うフロントエンドのWebアプリケーション)からのアクセスを許可するために使われる。
次に、django-admin startprojectコマンドで「django_project」という名のメインプロジェクトを作成し、python manage.py startappコマンドで「accounts」と「posts」の二つのアプリをプロジェクトに追加する。作成したアプリやインストールしたライブラリは、プロジェクトの主要な設定ファイルであるdjango_project/settings.pyのINSTALLED_APPSリストに追記する必要がある。これにより、Djangoがそれらを認識し、プロジェクトの一部として利用できるようになる。また、MIDDLEWAREリストにcorsheaders.middleware.CorsMiddlewareを追加し、CORS_ALLOWED_ORIGINSにAPIへのアクセスを許可するWebサイトのURLを設定することで、CORSに対応する。
このブログAPIでは、Djangoの標準ユーザーモデルではなく、「カスタムユーザーモデル」を導入する。これは、将来的にユーザーに「名前」などの追加情報を柔軟に持たせたい場合に備えるためだ。accounts/models.pyにAbstractUserを継承したCustomUserモデルを定義し、ここにnameフィールドを追加する。そして、settings.pyでAUTH_USER_MODEL = "accounts.CustomUser"と設定することで、プロジェクト全体でこのカスタムユーザーモデルを利用するようDjangoに指示する。
カスタムユーザーモデルをDjangoの管理画面(admin)でも適切に扱えるように設定する。accounts/forms.pyにUserCreationFormとUserChangeFormを継承したカスタムフォームを作成し、nameフィールドが管理画面で入力・編集できるようにする。その後、accounts/admin.pyでCustomUserAdminクラスを定義し、これらのカスタムフォームを使ってCustomUserモデルを管理画面に登録する。これにより、管理者はDjangoの管理画面を通じて、nameフィールドを含むユーザー情報を簡単に管理できる。
次に、ブログ記事の機能を「posts」アプリに実装する。posts/models.pyにPostモデルを定義し、ブログ記事に必要な情報、例えばtitle(タイトル)、content(本文)、author(作成者)、created_at(作成日時)、updated_at(更新日時)などのフィールドを持たせる。authorフィールドは、先ほど作成したCustomUserモデルとの間に「外部キー(ForeignKey)」というリレーションシップを設定する。これにより、どのユーザーがどの記事を書いたかをデータベースで管理できるようになる。
APIでデータをやり取りする際には、Pythonのオブジェクト(例えば、Postモデルのインスタンス)をWebで扱いやすいJSON形式などに変換する必要がある。この変換処理を「シリアライザー」と呼ぶ。posts/serializers.pyにPostSerializerを定義し、PostモデルのどのフィールドをAPI経由で公開するかを指定する。
APIのリクエストを処理する「ビュー」は、posts/views.pyに記述する。DRFはgenericsモジュールを通じて、API開発でよく使われる機能(一覧表示、詳細表示、作成、更新、削除など)を汎用的なクラスとして提供している。記事の一覧取得と新規作成のためにはgenerics.ListCreateAPIViewを継承したPostListビューを、特定の記事の詳細取得、更新、削除のためにはgenerics.RetrieveUpdateDestroyAPIViewを継承したPostDetailビューを利用する。これにより、少ないコード量で強力なAPI機能を実装できる。
これらのビューにアクセスするためのURLパターンを定義する。posts/urls.pyで、"posts/"パスをPostListビューに、"posts/<int:pk>/"パス(<int:pk>は記事のIDをURLに含めるためのもの)をPostDetailビューに関連付ける。そして、プロジェクト全体のdjango_project/urls.pyで、"api/"というパス配下にposts.urlsの定義を組み込むことで、/api/posts/や/api/posts/1/といったURLでブログAPIにアクセスできるようになる。
すべての設定とコードが完了したら、データベースに変更を適用する。python manage.py makemigrationsでモデル定義からデータベースの変更履歴ファイルを作成し、python manage.py migrateでその変更をデータベースに適用する。次に、管理画面にログインするための管理者ユーザー(スーパーユーザー)をpython manage.py createsuperuserコマンドで作成する。この際、カスタムユーザーモデルに追加したnameフィールドの入力も求められる。
最後に、python manage.py runserverコマンドで開発サーバーを起動する。これにより、http://127.0.0.1:8000/api/から構築したAPIにアクセスしたり、http://127.0.0.1:8000/admin/からDjango管理画面にログインしてユーザーや記事の情報を管理したりできる。APIの動作確認には、curlコマンドやPostmanといったAPIテストツールが便利だ。例えば、curl -X POSTコマンドを使ってJSON形式のデータを送り、新しいブログ記事をAPI経由で作成できる。
開発したAPIが正しく機能するかを検証するために、「単体テスト」を作成することも推奨される。posts/tests.pyにTestCaseクラスを継承したテストクラスを定義し、テスト用のユーザーや記事データを用意する。そして、モデルのフィールドが期待通りに動作するかを検証するメソッドを記述する。これらのテストはpython manage.py testコマンドで実行できる。
このプロジェクトで構築されたブログAPIは、カスタムユーザーモデル、ブログ記事のCRUD(作成・読み取り・更新・削除)操作、そして整理されたコード構造を備えた、完全に機能するAPIとなっている。これは、より複雑なWebアプリケーションを開発する上での強固な基盤となり、Django REST Frameworkのさらなる学習へと繋がる重要なステップだ。今後は、APIの認証機能(例:JWTやセッションベースの認証)、ユーザーごとの投稿・編集権限の管理、本番環境へのデプロイ、APIドキュメントの自動生成、そしてReactやVueなどのフロントエンドフレームワークとの連携といった機能を追加して、より完全なWebサービスへと発展させることができるだろう。