これまでの作業でコメントの閲覧や投稿などが可能な 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.
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 メソッドでデータを送信するには送信したいデータをタプルのリスト形式で準備します.これを 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 メソッドでコメントを編集する場合も送信したいデータをタプルのリストとして準備します.
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 メソッドでコメントを削除するには,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]>