Django REST Frameworkでアプリケーション開発 ~ Media / Filter API~

こんにちは。KOUKIです。

前回は、Blog APIを作成しました。

今回は、Media/Filter APIを作成します。

記事まとめ

STATIC設定

settings.pyに下記の追加をします。

STATIC系の設定は、JavaScriptやCSSなどの静的ファイルの設定、MEDIA系は画像ファイルの設定をそれぞれ扱います。

例えば、STATIC_URLは、ブラウザを介してstaticディレクトリにアクセスするための参照先を記述します。

STATIC_ROOTは、staticファイルがサーバー上のどこに保存されるのかについて記述します。保存先はDockerfileにて作成していますので、そのパスを参照しています。

続いて、appディレクトリ配下のurls.pyを修正します。

urls.pyに画像ファイルへのパスを追加しました。

imageフィールドの追加とテスト

Media APIは、画像をアップロード機能を提供します。

そのため、先ほど作成したMEDIA設定にて、画像が取り扱えるようにしました。

既存のモデルにimageフィールドを追加したいと思います。

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

画像をアップロードしたら一意のID(uuid)を画像に付与する予定です。

uuidは、pythonの組み込みモジュールであるuuidを使って生成します。

これにより、画像を一意に識別できるわけです。

また、テスト時には実際にファイルをアップロードするわけにはいかないので、mockを利用しています。

「@patch(‘uuid.uuid4’)」では、mockしたい関数を指定しています。そして、「mock_uuid.return_value = uuid」にて戻り値を明示的に指定しています。

これでuuid.uuid4の実行結果が、常に「test-uuid」になります。

テストを実行します。

「blog_image_file_path」が存在しないとエラーがでました。

blogアプリのmodels.pyに次の処理を追加します。

マイグレーションを実行しましょう。

blog/tests/test_models.pyにblog_image_file_path関数をインポートします。

テストを実行しましょう。

Upload imageテスト

画像アップロードテストを行います。

正しい引数とともにファイルをアップロードし、成功したら200, 失敗したら400のエラーメッセージを返す仕様にしています。

tempfileモジュールをインポートしましたが、これは便利です。

一時ファイルを作成してくれるモジュールで、プログラム実行後に自動で作成したファイルを削除してくれます。

ここでは、PILモジュールのImage関数を使ってJPEGを作成しています。

テストを実行しましょう。

「blog-upload-image」がないと怒られましたね。

views.pyのBlogViewSetにupload_image関数を追加すると解決できます。

テストを実行します。

シリアライズクラスを追加します。

テストを実行します。

テストがパスしました。

Filter機能とテスト

Filter APIは、タグやコメントを使ったフィルタリング機能を提供します。

まずはテストコードからです。

テストを実行します。

今は、タグやコメントでフィルタをかけていないので、当然エラーがでます。

views.pyに次の処理を追加します。

テストを実行します。

test_tags_api.py及びtest_comments_api.pyにもそれぞれテストを追加します。

テストを実行します。

当然エラーになりますよね。

blogアプリのviews.pyのTagViewSet及びCommentViewSetを修正します。

テストを実行します。

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

おわりに

Django REST Frameworkは、機能がたくさんあり使いこなすのが難しそうですね。

関連記事

基礎編はこちらです。

コメントを残す