7_Django REST framework入門 ~UserProfileAPIの作成~

Django REST framework
とんぺい
とんぺい

師匠こんにちは〜!

今日もDjango REST frameworkの続きを勉強しに来たブゥよぉ〜!

師匠
師匠

とんぺいくん、こんにちは。前回はViewsetsについて学習したね。今回は、今まで学習したAPI作成のヘルパー関数を用いて実際にユーザに関するAPIを作成してみよう。

とんぺい
とんぺい

早速実践だブゥね!楽しみだブゥ!

今日もよろしくお願いします!

注意

  • コード中に[という文字列がありますが、これは [ が文字化けしたものです。
  • 今後修正法が判明次第修正いたします。

Django REST framework入門一覧

ソースコード

Serializerの作成

師匠
師匠

それでは、Userに関するAPIを作成していこう。まずはUserAPI用のSerializerを作成するよ。profile_apiserializers.pyを開こう。

とんぺい
とんぺい

ModelSerializerは初めて見たブゥ!

これはどんな種類のSerializar何だブゥ?

師匠
師匠

ModelSerializerはDjangoのmodelのみに紐付けることのできるSerializarだよ。class Meta:の中に紐付けるmodelを設定することで、自動的にSerializerのfieldを定義してくれるんだ。

とんぺい
とんぺい

ほぅほぅ。modelを定義している場合は、ModelSerializerを使ったほうが、楽に記述できるんだブゥね!create()update()はなんでオーバーライドしたブゥか?

師匠
師匠

create()update()に関しては、実はModelSerializerにデフォルトで用意されているんだ。しかしデフォルトのまま使うと、ユーザが入力したパスワードがハッシュ化されず、セキュリティ上危険なんだ。

とんぺい
とんぺい

なるほど!パスワードがハッシュ化されないと、ユーザのパスワードがそのままDBに保存されて、万一流出したときに危ないブゥね!

師匠
師匠

パスワードが流出したときの損害は計り知れないので、システム側でこのように対策をしておくことが大切だ。ではSerializerの実装が完了したら次はViewSetの作成に進もう。

ViewSetの作成

師匠
師匠

ここでは、ModelViewSetを用いてViewを作成しよう。

ModelViewSetを用いてViewを作成することで、自動的にDBの更新に必要なメソッドを実装してくれるので、コードの記述量を減らすことができるよ。

とんぺい
とんぺい

それは便利だブゥ!たしかに前回作成したHelloViewSet(viewsets.ViewSet)ではlist(), create(), retrieve()...を実装したけど、今回は必要ないんだブゥね!

師匠
師匠

その通り。フレームワークは本当に便利だね。

では、Viewを記述したら次はURLの設定を行おう。

URLの設定

とんぺい
とんぺい

Viewsetを使った場合は、routerでURLの設定をするんだったブゥね!

ぶぶぅ!今回はbasenameの設定がないブゥ!

師匠
師匠

Viewでquerysetを記述している場合は、そのquerysetを元に自動的にbasenameが設定されるから、自分で記述する必要はないんだ。オーバーライドしたい場合は設定することもあるよ。

とんぺい
とんぺい

なるほど!modelに紐付いた物を作る時は、色々と省略できたて便利だブゥね!省略されすぎると、初心者的には困惑するところもあるけど、なんとか覚えていくブゥ…

師匠
師匠

そうだよね。そこは実装の経験を積んで少しずつ慣れていこう。

ではterminalにdocker-compose upと入力して、http://localhost:8000/api/profile/にアクセスしてみよう。

とんぺい
とんぺい

以前に作成した管理ユーザがきちんと表示されているブゥ!

師匠
師匠

うん。うまくいっているようだね。

試しに新しいユーザも作ってみようか。

とんぺい
とんぺい

ユーザの追加も無事に成功したブゥ!

師匠
師匠

いい感じだ。では、個別のユーザ情報が取得できるかhttp://localhost:8000/api/profile/2/などにアクセスして確認してみよう。

とんぺい
とんぺい

個別ユーザの取得も大丈夫そうだブゥ!

これでUserAPIは完璧だブゥね!

師匠
師匠

いや、いっけん完璧に見えるが、このまま本番リリースしてしまうとサービスとして成り立たなくなってしまうよ。というのも、今のままでは他ユーザのプロフィールを勝手に書き換えることができてしまうんだ。

とんぺい
とんぺい

それは大変だブゥ!言われてみれば、僕がこのまま師匠のメールアドレス、パスワード、名前を変更することができそうだブゥ!!

師匠
師匠

このバクを解決するためにもPermission(許可)を導入しよう。profiles_apiの中に新しくpermissions.pyを作成するよ。

Permission(許可)の導入

とんぺい
とんぺい

コードを見た感じ、変更を加えようとしているオブジェクト(User)とリクエストを送ってきているUserのidが一致していればTrueを返すというロジックだブゥね!

permissions.SAFE_METHODSはどういったものなんだブゥ?

師匠
師匠

permissions.SAFE_METHODSは、主にGETメソッドのことを指すね。ユーザ情報の読み取りだけなら誰でもできるようにしているよ。詳しくは公式を参照してくれ。

とんぺい
とんぺい

ほぅほぅ!確かにSNSとかでも、他人のプロフィール詳細の閲覧のみなら、特に許可はいらないブゥね!

師匠
師匠

その通り。

では、次は作成したPermissionをViewで読み込もう。

とんぺい
とんぺい

適用したいViewの中でpermission_classesを記述すれば、viewにアクセスしたときにPermissionが適用されるということだブゥね!

師匠
師匠

そうだね。Viewファイルの編集が終わったら、terminalでdocker-compose upと入力してhttp://localhost:8000/api/profile/2/にアクセスしてみよう。

とんぺい
とんぺい

あっ!

前回表示されていた、DELETEメソッドやPUTメソッドが消えているブゥ!

師匠
師匠

うまくPermission(許可)が適用されているようだね。このようにWebサービスを作成する際には、Permissionを追加してユーザごとにできるアクションを制限することが大切だよ。

とんぺい
とんぺい

なるほどぉ!僕の場合だと、機能を作ることに夢中になって、Permissionをついつけ忘れてしまうかもしれないから意識していきたいブゥ!

師匠
師匠

うん。その意識はすごく大切なことだ。

では、最後におまけでユーザの検索機能を実装しよう。

profiles_apiviews.pyを編集するよ。

ユーザ検索機能の追加

とんぺい
とんぺい

filtersrest_frameworkからimportして適用したいViewの中でfilter_backendsfilterの種類を定義して、search_fieldsで検索対象の項目を設定してるブゥね!

師匠
師匠

その通りだ。とんぺいくんもコードを見ただけで、ロジックがわかるようになってきたね。では、terminalでdocker-compose upと入力してhttp://localhost:8000/api/profile/にアクセスしてみよう。

とんぺい
とんぺい

OPTIONSの隣に、新しくFiltersが作成されているブゥ!

早速Filterを使ってみるブゥ!

師匠
師匠

無事に検索ができたようだね。

このようにDjango REST frameworkでは、Filterを使えば簡単に検索機能を実装できるんだ。

とんぺい
とんぺい

本当に便利な世の中になったブゥ!

こう思うと、プログラミングも段々と簡単になってきているんだブゥね!

まとめ

師匠
師匠

本日は以下のことに関して学習したね。

  • ModelSerializer
  • ModelViewSet
  • Permission
  • Filter
とんぺい
とんぺい

うん!

modelを定義している場合に、そのmodelに紐付いたAPIを効率よく作成できる方法が学べたブゥ!

師匠
師匠

それは、よかった。

では次回は、自分が作成したユーザの情報を変更できるようにAuthentication (認証)とログインAPIを作成していこう。

とんぺい
とんぺい

それはすごく楽しみだブゥ!

今日もありがとうございました!

それでは、また次回だブゥ!

参考

コメント

  1. […] 7_Django REST framework入門 ~UserProfileAPIの作成~ (5/31公開) […]

タイトルとURLをコピーしました