必要な環境
・Python 3
・pip
・git(※無くても良い)
イントロ
前回はPythonのフレームワークDjangoとDjango Rest Frameworkを使ってクラスベースとファンクションベースのView(views.py)でAPIを作りました。
前回カバーしたのはHTTPのGETリクエストに対してのレスポンスとしてデータを出力しただけです。
まずは、主なHTTPのリクエストを簡単に紹介します。
GETリクエスト➡データ取得
POSTリクエスト➡フォームのサブミット、ログイン、記事の投稿など
PUT➡データの更新、書き換え
DELETE➡既存のデータの削除
詳しくはこちらを参考にしてください。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
では、前回やったAPIViewでも同じようにそれぞれのHTTPでリクエストが来たときにどうやってDjango側がリクエストを扱うかコードで指示できます。
詳しくはこちらを参照。
https://www.django-rest-framework.org/api-guide/views/
しかし、DjangoのREST Frameworkでviewsetという全部のリクエストをカバーしたメソッドがあるのでそれを今日紹介していきます。
環境の設定
まずは下記のGitHubリポジトリからコードをダウンロードしてください。
https://github.com/TraitOtaku/djangoAPI.git
Gitを使ったことがない人はZIPファイルでもダンロードできます。
ではGitのコマンドです。
cdでファイルを作成したい所に行き、
git clone -b 2_Viewset https://github.com/TraitOtaku/djangoAPI.git
で、virtualenvが入っていない人はグローバルに入れます。
pip install virtualenv
virutalenv ENV ENV\Scripts\activate.bat
(ENV)でアクティベートされていることを確認して、requirements.txtnのパッケージを全部インストールします。
pip install -r requirements.txt pip list
python manage.py makemigrations python manage.py migrate python manage.py createsuperuser
VSCodeを使っている人はこれでテキストエディタを開きましょう。
code . python manage.py runserver
コンセプトの紹介
まずは、今日使用するアプリの例を紹介します。例として、コールセンターをイメージしましょう。
この画像のように、Djangoで3つアプリを別々に作成しました。
1.会社で従業員を管理するmembers app
2.顧客を管理するcustomers app
3.顧客からの問い合わせを管理するTicket app
Djangoの良いところはこのアプリを連携されてスケーリングが簡単にできることです。
ではこのアプリがどのように連携されるかデータベースのモデルを見てみましょう。
モデルの理解
members.models.py
従業員のデータモデルです。
Customers.models.py
顧客情報のモデルです。
Tickets.models.py
チケットのモデルです。
ForeignKeyで他のモデルのデータを参照していることに注目してください。
アドミンパネルでサンプルデータを作成
ではアドミンパネルで適当にデータを作成します。
データベースの中身を見る
では、DB Browserという無料のソフトウェアを使ってデータベースの中身を見てみましょう。
TicketのテーブルのForeignKeyで他のテーブルのIDを参照していることに注目してください。
ツールはここからダウンロードできます。
Serializerを見る
特に重要なのがこのForeingKeyをどうやってAPIで出力するかです。
もし、Readオンリーであればソース源をそのまま出力できますが、
CRUDオペレーションをしたい場合、(データの作成、読み込み、更新、削除)ちょっとした工夫が必要になりそうです。
Views.pyを見る
ここで今日の本題のviewsetの紹介に入ります。ViewsetはこのCRUDで使うAPIを全部セットで使えるようになった便利なメソッドの事です。これを使うことでいちいちGET、PUT、DELETE、POSTのコードを書かなくても良いようにあります。
もちろん、カスタマイズが必要な場日は、コードを上書きすることもできます。
では、viewsetを見てみます。
今回のアプリでは、membersとcustomersは会社のマネージャーがDjangoのアドミンパネル(サーバー側)から編集すると考えます。
それで、従業員がブラウザ上でチケットを管理するような流れです。
なので、membersとcustomersのデーターはReadOnlyModelViewSetはGETメソッドだけ用に絞ってクライアント側ではリードオンリーのデータした提供されません。
Router.pyを見る
今までのDjangoアプリはurls.pyでURLをそれぞれのアプリから提供していました。APIもこのやり方でも良いのですが、どんどなプリが増えてくるとどのURL(URI)がAPI化されているか煩雑になります。
そこで、プロジェクト側のディレクトリにrouter.pyファイルを作成してAPIのエンドポイントを一つにまとめます。このファイルはプロジェクト側のurls.pyから呼び出されていることを忘れずに。
APIを見てみよう。
では実際に提供されたAPIでCRUD操作ができるか試してみましょう。
次回
では、これで、従業員がAPIを使ってブラウザ側からDjangoアプリにデータをやり取りすることができました。しかし、このままだとAPIが垂れ流しでURL(URI)にアクセスで切る人が誰でもデータをみたり編集できてしましますね。
ですので次回はAuthentication(認証、ログイン)システムを使ってAPIのセキュリティ強化をしてみたいと思います。
ではお疲れさまでした。