Python Django 入門トップページ


Django REST Framework による API 開発

  1. API とプロジェクトの概要
  2. Django REST Frameworkのインストール
  3. プロジェクトの作成
  4. 基本設定
  5. アプリケーションの作成と登録
  6. モデルの作成とマイグレーション
  7. テストデータの設定
  8. コメント一覧を出力する API
  9. コメント詳細情報を出力する API
  10. 新規投稿と更新・削除の API
  11. ページネーション
  12. 入力内容の検証(バリデーション)
  13. テストの自動化
  14. Shell でのユーザ登録
  15. Fixtures でのユーザ登録
  16. ユーザ認証を必須にする
  17. コメントにオーナ情報を追加
  18. 権限の設定:Case #1
  19. 権限の設定:Case #2
  20. Python から API への接続
  21. React アプリケーションからの API 接続と CORS エラーの回避

Django REST Framework による API 開発

Python から API への接続

これまでの作業でコメントの閲覧や投稿などが可能な API を作成することができました.このページでは Python プログラムから API にリクエストを送信して,得られた結果を取得する方法を示します.なお,API の権限の設定は Case #1 の状態にしています.

まずは API について Web サーバを起動しておきます.

...\django_comment_api>python manage.py runserver ⏎
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
November 28, 2023 - 13:10:12
Django version 4.2.7, using settings 'django_comment_api.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

目次に戻る

Requests を使ってみる

Python から Web サイトにアクセスする方法の一つとして Requests を利用する方法があります.Juypter Lab などを使ってまずは requests をインポートします.

import requests

API にアクセスしてコメントの一覧を取得してみます.次のコードではレスポンスステータスコードが得られました.なお,GET メソッドは認証なしで利用できる状態にしてあることに注意してください.

url = "http://127.0.0.1:8000/comments/"
r = requests.get(url)
print(r)
<Response [200]>

結果をテキスト形式で取得するには次のようにします.

url = "http://127.0.0.1:8000/comments/"
r = requests.get(url)
print(r.text)
{"count":10,"next":"http://127.0.0.1:8000/comments/?page=2","previous":null,"results":[{"id":9,"owner_id":1,"title":"9個目のコメント","body":"コメントの本文9","updated_at":"2023-11-23T11:20:00"},{"id":10,"owner_id":2,"title":"10個目のコメント","body":"コメントの本文10","updated_at":"2023-11-23T11:10:00"}]}

結果を JSON 形式で取得してみます.

url = "http://127.0.0.1:8000/comments/"
r = requests.get(url)
results_json = r.json()
print(results_json)
{'count': 10, 'next': 'http://127.0.0.1:8000/comments/?page=2', 'previous': None, 'results': [{'id': 9, 'owner_id': 1, 'title': '9個目のコメント', 'body': 'コメントの本文9', 'updated_at': '2023-11-23T11:20:00'}, {'id': 10, 'owner_id': 2, 'title': '10個目のコメント', 'body': 'コメントの本文10', 'updated_at': '2023-11-23T11:10:00'}]}

JSON で得られた結果をループで取得してみます.コメント一覧のキーは "results" であることがわかります.

url = "http://127.0.0.1:8000/comments/"
r = requests.get(url)
results_json = r.json()
for key, value in results_json.items():
    print(key, value)
count 10
next http://127.0.0.1:8000/comments/?page=2
previous None
results [{'id': 9, 'owner_id': 1, 'title': '9個目のコメント', 'body': 'コメントの本文9', 'updated_at': '2023-11-23T11:20:00'}, {'id': 10, 'owner_id': 2, 'title': '10個目のコメント', 'body': 'コメントの本文10', 'updated_at': '2023-11-23T11:10:00'}]

目次に戻る

一覧を取得する

上の結果から,コメントの一覧はキーに "results" を指定すれば良いことがわかったので,そのまま一覧で出力してみます.

url = "http://127.0.0.1:8000/comments/"
r = requests.get(url)
results_json = r.json()
print(results_json["results"])
[{'id': 9, 'owner_id': 1, 'title': '9個目のコメント', 'body': 'コメントの本文9', 'updated_at': '2023-11-23T11:20:00'}, {'id': 10, 'owner_id': 2, 'title': '10個目のコメント', 'body': 'コメントの本文10', 'updated_at': '2023-11-23T11:10:00'}]

繰り返し処理を行うことで一件ずつ取得することも可能です.

url = "http://127.0.0.1:8000/comments/"
r = requests.get(url)
results_json = r.json()
for comment in results_json["results"]:
    print(comment)
{'id': 9, 'owner_id': 1, 'title': '9個目のコメント', 'body': 'コメントの本文9', 'updated_at': '2023-11-23T11:20:00'}
{'id': 10, 'owner_id': 2, 'title': '10個目のコメント', 'body': 'コメントの本文10', 'updated_at': '2023-11-23T11:10:00'}

目次に戻る

詳細情報を取得する

詳細情報は JSON 形式に変換するだけで取得できます.

url = "http://127.0.0.1:8000/comments/1/"
r = requests.get(url)
comment = r.json()
print(comment)
{'id': 1, 'owner_id': 1, 'title': '最初のコメント', 'body': 'コメントの本文', 'updated_at': '2023-11-23T11:01:00'}

目次に戻る

認証情報を付与する

認証情報はユーザ名とパスワード情報からなるタプル形式のデータを準備し,これを auth 引数に渡します.まずコメントの一覧を取得します.

url = "http://127.0.0.1:8000/comments/"
auth_tuple = ("user_a", "password")
r = requests.get(url, auth=auth_tuple)
results_json = r.json()
print(results_json["results"])
[{'id': 9, 'owner_id': 1, 'title': '9個目のコメント', 'body': 'コメントの本文9', 'updated_at': '2023-11-23T11:20:00'}, {'id': 10, 'owner_id': 2, 'title': '10個目のコメント', 'body': 'コメントの本文10', 'updated_at': '2023-11-23T11:10:00'}]

もちろんコメントの詳細情報も取得可能です.

url = "http://127.0.0.1:8000/comments/1/"
auth_tuple = ("user_a", "password")
r = requests.get(url, auth=auth_tuple)
comment = r.json()
print(comment)
{'id': 1, 'owner_id': 1, 'title': '最初のコメント', 'body': 'コメントの本文', 'updated_at': '2023-11-23T11:01:00'}

目次に戻る

POST メソッド

POST メソッドでデータを送信するには送信したいデータをタプルのリスト形式で準備します.これを data 引数に渡します.これでコメントの新規投稿が可能です.

url = "http://127.0.0.1:8000/comments/"
auth_tuple = ("user_a", "password")
payload_tuples = [("title", "タイトル"), ("body", "コメントの本文です")]
r = requests.post(url, auth=auth_tuple, data=payload_tuples)
print(r.text)
{"id":11,"owner_id":1,"title":"タイトル","body":"コメントの本文です","updated_at":"2023-11-28T13:25:48.061897"}

目次に戻る

PUT メソッド

PUT メソッドでコメントを編集する場合も送信したいデータをタプルのリストとして準備します.

url = "http://127.0.0.1:8000/comments/1/"
auth_tuple = ("user_a", "password")
payload_tuples = [("title", "タイトル編集"), ("body", "コメントの本文も編集します")]
r = requests.put(url, auth=auth_tuple, data=payload_tuples)
print(r.text)
{"id":1,"owner_id":1,"title":"タイトル編集","body":"コメントの本文も編集します","updated_at":"2023-11-28T13:27:38.637892"}

目次に戻る

DELETE メソッド

DELETE メソッドでコメントを削除するには,URL と認証情報を指定するだけです.

url = "http://127.0.0.1:8000/comments/11/"
auth_tuple = ("user_a", "password")
r = requests.delete(url, auth=auth_tuple)
print(r)
<Response [204]>

目次に戻る