5_Django REST framework入門 ~APIViewの理解~

Django REST framework
とんぺい
とんぺい

師匠こんばんは〜!

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

師匠
師匠

とんぺいくん、こんばんは。

前回はUser modelのカスタマイズについて学習したね。

今回はDjango REST frameworkにおけるViewについて理解しよう。

とんぺい
とんぺい

了解だブゥ!

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

注意

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

Django REST framework入門一覧

ソースコード

Viewとは?

師匠
師匠

まずはDjango REST frameworkにおけるViewの役割について説明しよう。Viewはユーザからのリクエストを元に、どのAPIを提供するか決定する処理をしているんだ。

とんぺい
とんぺい

ほぅほぅ。ユーザのリクエストに応じて、どのような処理をするか決定している…人間の脳みたいなもんだブゥね!

師匠
師匠

そうだね。Django REST frameworkには、APIを作成するために、複数のヘルプ関数が用意されているが、本日の講義ではAPIViewについて解説していくよ。

とんぺい
とんぺい

1から自分で関数を作るのではなく、Viewを作成するための原型となるものがDjango REST framework側ですでに用意されているんだブゥね!それぞれ説明をお願いします!

APIViewとは

師匠
師匠

APIViewは最も一般的なタイプのViewで、以下のときに使われるんだ。

  • 複雑なAPIロジックを作成したい場合
  • 外部のAPIを呼びだす場合
  • localのファイルを扱う場合
とんぺい
とんぺい

ほぅほぅ。外部APIと連携したり、複雑なAPIロジックを実装したい場合には、このAPIViewを使用すれば良いんだブゥね!

師匠
師匠

その通り。APIViewは、そのロジックを最大限に制御できることが大きなメリットだね。では、実際にAPIViewのサンプルを書いてみようか。profile_apiviews.pyを開こう。

GETメソッドの作成

とんぺい
とんぺい

うん!できたブゥ!

これは見た感じ、getメソッドに関してのロジックを書いているブゥね!

師匠
師匠

そうだね。APIViewを用いる場合は、クラス内のメソッドはそのままHTTPメソッドに対応させる必要があるよ。また、データはResponseを用いて返却するよ。

とんぺい
とんぺい

ふんふん。ということは、今後この続きでpost, patch,put,deleteメソッドも実装するということだブゥね!

師匠
師匠

その通り。しかし、まずはこのgetメソッドがうまく動作するか確認するために、このviewに対応するURLを作成しよう。

profile_apiに新しくurls.pyを作成し、profiles_projecturls.pyを編集するよ。

とんぺい
とんぺい

うん。それぞれのディレクトリのurls.pyを実装することができたブゥ!この中で一番気になったのはas_view()なんだけどこれはどういう役割を持っているんだブゥ?

師匠
師匠

as_view は 自ら(=cls) をインスタンス化して dispatchメソッドを実行するような関数(=view)を生成して return するといった役割があるよ。

とんぺい
とんぺい

ほぅほぅ。なんで dispatchメソッドを実行するような関数(=view)を生成する必要があるんだブゥか?

師匠
師匠

dispatchメソッドは、リクエストメソッドに応じてクラス内の適切なメソッドを自動的に実行する機能を持っているからだよ。今回の例で言えば、リクエストメソッドがGETなら、dispatchメソッドが自動的にHelloAPIView.get()を実行してくれるんだ。

とんぺい
とんぺい

なるほどぉ!この機能があるおかげで、リクエストメソッドに応じた条件分岐を自分で記述する必要がなくなって、コードがスッキリするんだブゥね!

師匠
師匠

そうだね。コードの見通しの良さは開発ではとても大切だね。

では、ここまで実装できたら、terminalでdocker-compose upと入力してhttp://localhost:8000/api/hello-viewにアクセスしよう。

とんぺい
とんぺい

ぶぶぅ!!

ブラウザにHello Apiが映っているブゥ!

この画面が出ればGETメソッドは成功しているんだブゥか?

師匠
師匠

うん。うまく言っているようだね。Django REST frameworkでは他のツールを用いなくても、このようにブラウザでAPIの確認を行うことができるんだ。

とんぺい
とんぺい

他のツールを使わないで、Django REST framework内で全て完結するのは便利だブゥね!

Serializerの作成

師匠
師匠

では、残りのPOSTメソッド等を作成する前に、Serializerというものを作成していこう。Serializerとはデータ の入出力を扱い、モデルへの橋渡しをするクラスのことを言うんだ。

とんぺい
とんぺい

ふんふん。

具体的にはどういった役割があるんだブゥか?

師匠
師匠

具体的には、「複雑な入力値をモデルに合わせてバリデーションしてレコードに伝える(入力:シリアライズ)」、「Model(レコード)を適切な形式にフォーマットしてPythonで扱えるようにする(出力:デシリアライズ)」といった役割を持っているよ。

とんぺい
とんぺい

なるほどぉ〜! Modelとデータをやり取りする際に、データを変換する必要があって、Serializerを通すことで、それぞれの場所において適切な形でデータを扱えるということだブゥね!

師匠
師匠

その通りだ。では、実際にSerializerを作成していこう。

profile_apiに新しくserializers.pyを作成しよう。

とんぺい
とんぺい

Serializerの記述ができたよ〜!

師匠
師匠

いいね。

ではprofile_apiviews.pyに戻って、serializers.pyの読み込みを行い、POSTメソッドなどを作成していこう。

POST, PUT, PATCH,DELETEメソッドの作成

とんぺい
とんぺい

views.pyの編集が終わったよ!

serializerの読み込みについて詳しく教えてほしいブゥ!

師匠
師匠

わかった。まずはfrom profiles_api import serializersで先程作成したHelloSerializersを読み込もう。そしてHelloAPIViewクラス内でserializer_class=serializers.HelloSerializersと記述し、クラス内で使用するSerializerを定義しよう。

とんぺい
とんぺい

まずは、Serializerモジュールを読みこんで、読み込んだモジュールを元に、クラス内で使用するSerializerを定義するんだブゥね!

師匠
師匠

その通り。そして、それぞれの関数においてrequestで受け取ったデータをSerializerに通すことでバリデーションチェックを行い、その結果によりその後の処理を分岐させているよ。

とんぺい
とんぺい

ほぅほぅ。ユーザが入力した値を一旦Serializerを通すことで、そのrequestが正しいrequestなのかDBに保存する前に、チェックできるということだブゥね!

師匠
師匠

そうだね。ここではひとまず、POSTメソッドについてのみSerializerを組み込んだ例を紹介したよ。では、terminalでdocker-compose upと入力して、http://localhost:8000/api/hello-viewにアクセスしよう。

ブラウザで確認

とんぺい
とんぺい

おぉ!

POST, PUT, DELETEメソッドを試すボタンが追加されているブゥ!

師匠
師匠

うん、いい感じだ。それでは、Nameの欄に適当な名前を入力して正しくレスポンスが返ってくることを確認しよう。

とんぺい
とんぺい

10文字以内で入力した場合はrequestが成功して、10文字を超えて入力した場合はちゃんとrequestが失敗しているブゥ!

Serializerが効いている証拠だブゥね!

師匠
師匠

うまくいったようだね。他のメソッドに関しては、設定したメッセージが返却されるか、各自確認してくれ。

まとめ

師匠
師匠

本日は以下の点について学習したね。

  • Viewとは
  • APIView
  • Serializer
とんぺい
とんぺい

うん。

日に日に成長している実感があってすごく楽しいブゥ!

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

師匠
師匠

今日もお疲れ様。

次回はAPIを作成する際もう一つのヘルプ関数である「Viewsets」に関して学習をしていくよ。それでは、また次回。

参考

コメント

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