Django REST frameworkでアプリケーション開発 ~UserAPI~

こんにちは。KOUKIです。

前回は、Djangoのマネジメントコマンドを作成しました。

今回からDjango REST frameworkを使って、API開発をしていきます。

最初に作成するAPIは、UserAPIです。

このAPIは、ユーザーの作成や認証をしてくれます。

以前作成したaccountアプリケーションにそのまま実装していきます。

記事まとめ

事前準備

まずは、settings.pyに次の設定を追加してください。

次にテストコード追加用のフォルダとファイルを作成してください。 

UserAPI – CREATE – の実装

最初にテストコードを書きます。

先ほど追加したtest_users.api.pyに次のテストコードを書いてください。

「CREATE_USER_URL = reverse(‘account:create’)」は、これから作成するUserAPIのリクエスト先です。

テストについては、次の意味があります。

  • 1 -> ユーザー作成テスト
  • 2 -> 同一ユーザーが作成されないかのテスト
  • 3 -> パスワードの文字数テスト(最低5文字以上)

それでは、テストを実行してみましょう。

このエラーは、「CREATE_USER_URL = reverse(‘account:create’)」で出ていますね。

accountアプリケーション配下に「urls.py」を作成してください。

ここにUserAPIへのリクエスト先を記載します。

テストを実行します。

まだ同じエラーがでます。実は、urls.pyには2種類あって、appプロジェクト配下のurls.pyにもパスを指定する必要があります。

テストを実行します。

エラーが変わりましたね。いい感じです。

次は、accountのviews.pyにCreateUserViewを追加しましょう。

テストを実行します。

これは、Serializerクラスが定義されていないことに対するエラーですね。

Django REST frameworkでは、データ変換時の処理にSerializerクラスを使用します。

ざっくり言うと、Django のモデルデータを JSON形式に変換して処理できるようにします。

参考

accountアプリケーション配下に次のファイルを追加してください。

このファイルの中にUserSerializerクラスを作成します。

accountモデルのフィールド「’email’, ‘password’, ‘name’」をシリアライズします。

その際にオプションとして、書き込みOKと最小文字数を5に設定しています。

create関数の”validated_data”には、シリアライズ後の有効データが入ります。

views.pyにこのシリアライズクラスを追加しましょう。

テストを実行します。

UserAPI – AUTHENTICATION – の実装

続いて、ユーザー認証を実装します。

まずは、テストコードを追加します。

URLパスとして「TOKEN_URL = reverse(‘account:token’)」を追加しました。

それぞれのテストの意味については、以下に記載します。

  • 1 -> ユーザー作成後Tokenが取得できること
  • 2 -> 認証情報に誤りがあった場合、Tokenが取得できないこと
  • 3 -> ユーザーが作成されていない状態の場合、400エラーが返却されること
  • 4 -> email, passwordに誤りがある場合、400エラーが返却されること

テストを実行します。

「TOKEN_URL = reverse(‘account:token’)」でエラーが発生していますね。

accountのurls.pyに以下のパスを追加してみましょう。

テストを実行します。

views.pyに’CreateTokenView’を追加します。

テストを実行します。

“token”が生成されていないようですね。

認証用のシリアライザを実装します。

続いて、views.pyにAuthTokenSerializerを実装します。

テストを実行します。

テストがパスしましたね。

UserAPI – Endpoint作成 –

ユーザー情報をアップデートする関数を作成します。

最初にテストコードを書きます。

「ME_URL = reverse(‘account:me’)」を新たに追加しました。

まだ、urls.pyに登録していないパスなので、これでエラーがでますね。

そして、「 self.client.force_authenticate(user=self.user)」では、ユーザーを強制的にログイン済みにできます。

テストについては、次の通りです。

  • # 1 -> 未ログイン時のレスポンスが401かチェック
  • # 2 -> ログイン時のレスポンスが200かチェック
  • # 3 -> POSTが許可されていないかチェック(GETを使用する)
  • # 4 -> User Profileの更新チェック

テストを実行します。

予想通りのエラーですね。

account配下のurls.pyにパスを追加します。

テストを実行します。

views.pyにManageUserView関数を追加します。

Update用のRetrieveUpdateAPIViewを継承したクラスを作成しました。

続いてserializers.pyにupdate関数を追加します。

テストを実行します。

テストがパスしましたね。

長くなってきましたので、ここで一旦終わりにしましょう。

次回

次回は、Tag APIの実装していきます。

関連記事

基礎編はこちらです。

Djangoおすすめ書籍

Djangoを学ぶなら以下の書籍がオススメです。

緑 -> 赤 -> 紫の順でやればOKです。読みやすい英語で書かれているので、英語力もついでに上がるかもしれません^^

コメントを残す