DjangoはPythonによるWebアプリケーションのためのフレームワークです。Djangoは元々要求(Request)を元に画面を作ってそれをResponseとして返す機能を持っていますが、本書で扱っている事例では、画面はブラウザ側で生成するSPAシステムなので、バックエンドは画面からの要求に応じてデータを返すRest APIを提供する役割が求められます。DjangoにこのようなAPI機能を提供するのが、Django Rest framework(以下DRFと呼びます)というフレームワークです。

7.0 とりあえず動かしてみる

 まずは、非常に簡単なアプリケーションプログラムを作って動かしてみます。なぜこれで動くものができるのかは7.1章以降で説明しますので、

7.0.1 準備 (アプリケーションフォルダーを作って登録)

まず、最初に「drf_sample」という名前のアプリケーションフォルダを作ります。Djangoに登録しておきます。

settings.pyを編集して、作ったアプリケーションをDjangoに登録しておきます。

7.0.2 プログラムを作る

drf_sample/models.pyを編集

drf_sample/serilizers.pyを追加

drf_sample/views.pyを編集

7.0.3 URLディスパッチャーに登録

drf_sample/urls.pyを作成

(backend)/urls.pyを編集

7.0.4 データベースに反映

データベースにモデルの定義を反映します。makemigrationsmigrateを実行します。

7.0.5 テスト

データベースにテスト用のデータを登録します。プロジェクトフォルダに、次のようなJSON形式で記述したファイルを作り、これをデータベースに読み込みます。

djangoのユーティリティツールmanage.pyを使って、ファイルに記述した内容をデータベースにロードします。


開発用のサーバーを起動しておきます。

この状態で、作ったプログラムをテストするのですが、この際「curl」というコマンドを使います。curlはコマンドラインからHTTPリクエストを送信するためのツールです。URLを指定してデータを取得したり、データを送信したりすることができます。(Macではデフォルトで搭載されています。)

(1)GETリクエストを送信し、データの一覧を取得する

(2)POSTリクエストを送信し、データを追加する

(3)PUTリクエストを送信し、データを更新する

(4)DELETEリクエストを送信し、データを削除する

注意:

 上記のように単純にcurlでPOST, PUT, DELETEをテストすると "403 Forbidden" のエラーが返ってくるかもしれません。(多分そうなります)

Djangoのデフォルト設定では、リクエストのヘッダに有効な CSRFトークン が含まれているかを厳格にチェックしており、これが原因でForbiddenとなります。CSRFトークンはWebサイトへの不正な書き込みや操作(CSRF攻撃)を防ぐための仕組みなのですが、curlで機能を確認する際には、以下のように「一時的に」クラスの前に@method_decoratorを記載して、CSRF攻撃防止機能をオフにしてください。

もちろんこれは、開発中のみの措置であり、本番システムでは使ってはいけません。

 

7.1 Django +DRFの仕組み ~どんな風に動くのか~

 以下、Django+DRFでどのようにRest APIを提供するWebアプリケーションが動作するかを詳しく見ていきます。

DjangoはWebサーバを介してブラウザーからのRequestを受け取り、それに応じた処理を行なって、データをResponseとして返します。

Django + DRF の動作

(1) ミドルウェア

 渡されたRequestはまずミドルウェアによって処理されます。ミドルウェアは受け取ったRequestやResponseに対し、情報を追加したり加工したりするなどの処理を行います。複数のミドルウェアを登録することができ、例えば元々組み込まれているミドルウェアには以下のようなものがあります。

  • SecurityMiddleware : HTTP による要求であった場合 HTTPS へのリダイレクトを要求するレスポンスを返したり、応答にセキュリティ関連の情報 を追加します。
  • SessionMiddleware : ユーザーを管理するためなどの「セッション」を使う際に、リクエストやレスポンスにセッションデータを追加します。
  • CommonMiddleware : URL リダイレクト (「www」プレフィックスの追加/削除)などURLに対する処理を行います。
  • CsrfViewMiddleware : クロスサイト リクエスト フォージェリ (CSRF) 攻撃に対する保護のためCSRF トークンの追加や検証を行います。
  • AuthenticationMiddleware : 現在ログインしているユーザーの情報をリクエストに追加します。

これらは、ユーザ管理やセキュリティ対策に関連していますので、詳しくは後の「マルチテナント化」「セキュリティ対策」でも説明します。

(2)URLディスパッチャ

 渡されたリクエストのURLを解析して、どの処理にリクエストを渡すのかを決めるのがURLディスパッチャです。urls.pyというファイルに解析方法を記載しておくことで、指定されたURLに対応するdjangoにおけるviewが呼び出されます。

urlpatternsの最初の行では、Sample/'というURLにHTTPリクエストが送られると、SampleView という名前のViewが呼び出され、リクエストが渡されます。

次の行の場合は、URLの中の<pk>のところににキー値がセットされたHTTPリクエストが送られると、SamleViewという名前のViewが呼び出されます。この時、プライマリーキー「pk」の値も、併せて、Viewに伝えられます。例えば URLが HTTP://woo.foo.com/DetailedSample/1/“ だった場合、DetailedSampleViewのクラスメソッドas_view()が呼び出され、as_viewの引数であるkwargsに{‘pk’ : ‘1’}がセットされます。

(3)View

 DjangoにおけるViewは、何らかの処理を行なってその結果を返すアプリケーションプログラムです。ViewはRequestを受け取り、処理(データの取得、データの変更・削除、取得したデータの加工など)を行なった結果をResponseとして返します。

このアプリケーション用のViewのプログラミングが開発の肝で、Djangoでのソフトウェア開発のほとんどを占めます。DjangoやDRFは、非常に少ないコード量でこの Viewプログラミングを行う仕組みを提供してくれます。


次のセクション: 7.2 Viewを作るための仕組み ~なぜDjango+DRFではコーディングが簡単なのか?~