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 開発

新規投稿と更新・削除の API

REST Framework の generic ビューを用いると,非常に短いコードでコメント一覧の出力や詳細情報の出力ができました.しかし現時点では新規投稿などはできません.

...\django_comment_api>curl -X POST -d "title=API" -d "body=test" http://127.0.0.1:8000/comments/ ⏎
{"detail":"メソッド \"POST\" は許されていません。"}
...\django_comment_api>

これは,次の通り views.py でどちらも読み取り専用 (read-only) である ListAPIViewRetrieveAPIView を継承していたためです.

comments\views.py(抜粋)class CommentList(generics.ListAPIView):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer

class CommentDetail(generics.RetrieveAPIView):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer

これらを read-write や read-write-delete である ListCreateAPIViewRetrieveUpdateDestroyAPIView に変更するだけで新規投稿と更新・削除ができるようになります.他にも様々な組み合わせがあるので,詳細はこちらで確認してください.

comments\views.py(抜粋)class CommentList(generics.ListCreateAPIView):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer

class CommentDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer

実際に新規投稿ができるか curl コマンドで実験します.一覧の取得では標準の GET リクエストでしたが,新規投稿では POST リクエストを利用するので,-X POST オプションを追加します.また,投稿内容は -d オプションによって titlebody をそれぞれ指定します.このコマンドを実行すると,新たなコメントが投稿され,その結果が出力されました.その後,一覧表示にも含まれていることを確認しています.

...\django_comment_api>curl -X POST -d "title=API" -d "body=test" http://127.0.0.1:8000/comments/ ⏎
{"id":11,"title":"API","body":"test","updated_at":"2023-11-23T15:08:23.900953"}
...\django_comment_api>curl http://127.0.0.1:8000/comments/ ⏎
[{"id":11,"title":"API","body":"test","updated_at":"2023-11-23T15:08:23.900953"},{"id":9,"title":"9個目のコメント","body":"コメントの本文9","updated_at":"2023-11-23T11:20:00"},{"id":10,"title":"10個目のコメント","body":"コメントの本文10","updated_at":"2023-11-23T11:10:00"},{"id":8,"title":"8個目のコメント","body":"コメントの本文8","updated_at":"2023-11-23T11:08:00"},{"id":7,"title":"7個目のコメント","body":"コメントの本文7","updated_at":"2023-11-23T11:07:00"},{"id":6,"title":"6個目のコメント","body":"コメントの本文6","updated_at":"2023-11-23T11:06:00"},{"id":5,"title":"5個目のコメント","body":"コメントの本文5","updated_at":"2023-11-23T11:05:00"},{"id":4,"title":"4個目のコメント","body":"コメントの本文4","updated_at":"2023-11-23T11:04:00"},{"id":3,"title":"<3個目>のコメント","body":"<h1>コメントの本文3</h1>","updated_at":"2023-11-23T11:03:00"},{"id":2,"title":"2個目のコメント","body":"コメントの本文2","updated_at":"2023-11-23T11:02:00"},{"id":1,"title":"最初のコメント","body":"コメントの本文","updated_at":"2023-11-23T11:01:00"}]
...\django_comment_api>

続いて Web ブラウザでも確認すると一覧表示の最下部に投稿フォームが表示されました.これは ListCreateAPIView を継承したためです.このフォームにタイトルと本文を入力して「POST」ボタンを押すと API を通じて POST リクエストが送信され投稿が完了します.

django-api-2023-05

投稿が完了すると次の画面に移行しました.HTTP のレスポンスステータスコードが 201 番になっていることにも注意してください.

django-api-2023-06

一覧表示に戻ると curl コマンドと Web ブラウザから投稿した内容を確認できます.

django-api-2023-07

続いて,curl コマンドでコメントの更新と削除を続けて行います.いずれの場合も URL に ID を含めることに注意してください.また,更新には PUT メソッド,削除には DELETE メソッドを指定します.

...\django_comment_api>curl -X PUT -d "title=API edit" -d "body=edit test" http://127.0.0.1:8000/comments/11/ ⏎ # (1) 更新
{"id":11,"title":"API edit","body":"edit test","updated_at":"2023-11-23T15:13:46.721981"}
...\django_comment_api>curl http://127.0.0.1:8000/comments/11/ ⏎ # (2) 確認
{"id":11,"title":"API edit","body":"edit test","updated_at":"2023-11-23T15:13:46.721981"}
...\django_comment_api>curl -X DELETE http://127.0.0.1:8000/comments/11/ ⏎ # (3) 削除

...\django_comment_api>curl http://127.0.0.1:8000/comments/11/ ⏎ # (4) 確認
{"detail":"見つかりませんでした。"}
...\django_comment_api>

さらに Web ブラウザからも更新と削除の作業を実験します.まず,ID=12の詳細ページを開きます.すると,最下部には編集・更新のためのフォームと,上部には削除のボタンが現れました.タイトルと本文を編集して「PUT」ボタンを押します.

django-api-2023-08

更新されました.続いて「DELETE」ボタンを押します.

django-api-2023-09

確認画面が表示されたので,「Delete」を押します.

django-api-2023-10

コメントを削除することができました.

django-api-2023-11

一覧表示に戻ると2つのコメントが削除されていることが確認できます.

django-api-2023-12

目次に戻る