DEV Community

kaede
kaede

Posted on

Django REST FRAMEWORK Tutorial 7 -- snippet_list の GET/POST を APIView で扱う

前回の復習

前回の記事で sinppets/views.py で
@csrf_exempt で JSON レスポンスを通して GET と POST を実装した

APIView で GET/POST を確認

https://www.django-rest-framework.org/tutorial/2-requests-and-responses/#wrapping-api-views

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
Enter fullscreen mode Exit fullscreen mode

status コードの 200 ~ 500 を使うために status
@api_view を使うために api_view
Response として返すために Response

これらをインポート

@api_view(['GET', 'POST'])
def snippet_list(request):
Enter fullscreen mode Exit fullscreen mode

@api_view で GET, POST を受けることを snippet_list の上に記載

AssertionError at /snippets/
@api_view missing list of allowed HTTP methods
Enter fullscreen mode Exit fullscreen mode

@api_view のみだと、HTTP メソッドの許可がないエラーになる。


GET

snippet_list の中にかく

    if request.method == 'GET':
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        return Response(serializer.data)
Enter fullscreen mode Exit fullscreen mode

GET は前回と大きくは変わらない。
JsonResponse を Response に変更して safety=false がなくなったくらい。


POST

    elif request.method == 'POST':
        serializer = SnippetSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Enter fullscreen mode Exit fullscreen mode

POST は大きく変わった。
JSON parser を使わず、request.data から直接シリアライズし

JsonResponse を使えわず、Response で
status.HTTP_201_CREATEDstatus.HTTP_400_BAD_REQUEST
をステータスとして返すようにする


ブラウザで REST FRAMEWORK の API View を試す

上記のメソッドをちゃんと記載していれば

Image description

API View を使って、REST FRAMEWORK の UI で綺麗にレスポンスが見れる。

Image description

Image description

POST /snippets/
HTTP 201 Created
Allow: OPTIONS, POST, GET
Content-Type: application/json
Vary: Accept

{
    "id": 8,
    "title": "from REST API VIEW",
    "code": "print(\"updated\")",
    "linenos": false,
    "language": "python",
    "style": "friendly"
}
Enter fullscreen mode Exit fullscreen mode

Postman と同じように POST も JSON データを送れる。


まとめ

@api_view(['GET', 'POST']) と定義して関数を書くと
ブラウザで Django REST framework の API View の形で
GET, POST を扱える。

Top comments (0)