Search by

    Django REST Frameworkのチュートリアル(Tutorial 2 Requests and Responses)をやってみた

    Django REST Frameworkの公式チュートリアル(Tutorial 2 Requests and Responses)をやってみた時の不明点、気付きをまとめておく。

    Request objects

    REST frameworkでは、djangoが用意しているHttpRequestを拡張して、Requestを導入している。 Requestにはrequest.dataが用意されている。これはrequest.POSTに似ているけど、webAPIを扱うのにより便利なもの、らしい。

    例えば、HttpRequestだとformでしかデータを受けれないが、Requestならjsonのような色んなデータ形式を受けれるし、 それを意識しなくてもいい、ということだと思います。

    Response objects

    REST frameworkはResponseオブジェクトというものも持っている。 これはTemplateResponseの一種で、レンダリングされないcontextを受けたり、 コンテンツネゴシエーションを使用して、クライアントに返す正しいコンテンツタイプを決定する。

    ちょっと概念的過ぎてよくわからない。

    サフィックスのパラグラフを読むと少々理解出来た。 つまり、リクエストの仕様に応じて、レスポンスの仕方を変えることができるよってこと。 例えば、jsonで返すのか、htmlにフォーマットして返すのか、適宜判断させることができるということだと思う。 具体的な仕組みはおいおいわかってくると思われる。

    Status codes

    HTTP status codes、200とか500とかは、可読性が高いとは言い切れない。 なので、もっと明示的に示せるものが用意されている。 例えばHTTP_400_BAD_REQUESTとか。

    Wrapping API views

    APIを書く時に使えるラッパーが2つ用意されている。

    @api_viewデコレータは関数ベースビューで使う APIView classはクラスベースビューで使う

    このラッパーを使うと、関数やクラスはRequestオブジェクトを受け取り、 Responseオブジェクトを返すように出来る。

    想定していない方法でアクセスがあった場合に、405 Method Not Allowedを返すとか 想定していない形のデータが入力された時に、ParseErrorを吐いたり、ということが出来る。

    ラッパーを使うと、前章で問題になった問題に対処できるようになっているということですね。

    こんな感じのViewになる

    views.py
    from rest_framework import status
    from rest_framework.decorators import api_view
    from rest_framework.response import Response
    from snippets.models import Snippet
    from snippets.serializers import SnippetSerializer
    
    
    @api_view(['GET', 'POST'])
    def snippet_list(request, format=None):
        """
        List all code snippets, or create a new snippet.
        """
    
        # 読み取りの時はステータスは不要
        if rquest.method == 'GET':
            snippets = Snippet.object.all()
            serializer = SnippetSerializer(snippets, many=True)
            return Response(serializer.data)
        
        # 書き込みの時は成功したかどうか、ステータスを返信する必要
        if request.method == 'POST':
            serializer = SnippetSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                # statusコードを利用する。
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    URLsに追加のサフィックスをつける

    フォーマットサフィックスを使うことで、明示的にデータ形式を参照するURLが得られる。 URLはこんな感じになる。http://example.com/api/items/4.json.

    必ずしもこうする必要はないけど、ほしいデータ形式を明示出来るのが良い。

    動かしてみる

    http http://127.0.0.1:8000/snippets.json  # JSON suffix
    http http://127.0.0.1:8000/snippets.api   # Browsable API suffix
    # POST using form data
    http --form POST http://127.0.0.1:8000/snippets/ code="print(123)"
    # POST using JSON
    http --json POST http://127.0.0.1:8000/snippets/ code="print(456)"

    色んな方式でアクセスできる。 formを使ったpost、jsonを使ったpostとか。REST frameworkを使うことで、複数のデータ形式を扱うことが出来ることを確認出来る。

    ブラウザでAPIの結果を確認できることの利点

    リクエストによってコンテンツタイプを分けることができるので、 デフォルトではブラウザからアクセスされたら、HTMLにフォーマットしてレスポンスするようになっている。

    開発が楽になるし、他の人が調査したりするのも楽になる。

    前の記事
    次の記事

    参考