DjangoでクラスベースでのViewを解説していく

スポンサーリンク

この記事では、Django REST API で Django Class-Based Views を使用する方法を学び、その後、関数ベースのビューを Class-Based ビューに変更します。

スポンサーリンク

クラスベース・ビューと関数ベース・ビューの違い

先ほどの記事では、Rest API全体のWebページを関数ベースのビューで作成しました。

関数ベースのビューを使うと、ビューでできる機能を拡張することができません。

そこで、クラスベースのビューの出番です。

この記事では、これらの機能を使い、前回の記事よりもコードをシンプルにすることを学びます。

views.py でクラスベースのビューを作成する

クラスベースViewsの基本的な構文は以下の通りです。

class Name(APIView):
 
    def GET(self,request):
        ''' Code'''
        return response
     
    def POST(self,request):
        '''code'''
        return response

ここで、すべてのHTTPメソッドは、特定のクラス内のクラスメソッドとして動作します。

これは、Pythonのオブジェクト指向プログラミングを学んでいれば、簡単に理解できます。

それでは、Webページ上のアイテムのリストを表示するItemsViewクラスを作成しましょう。

また、リストから特定のアイテムを表示、編集、削除することができるItemViewを作成することで、さらに知識を広げます。

from rest_framework.views import APIView
from rest_framework import status


クラスベースのビューを使用するために必要な上記2つのライブラリをインポートし、以下のコードを記述します。

class ItemsView(APIView):
    def get(self,request,format =None):
        items = ItemsModel.objects.all()
        serializer = ItemSerializer(items, many =True)
        return JsonResponse(serializer.data, safe =False)
 
    def post(self,request,format =None):
        data = JSONParser().parse(request)
        serializer =ItemSerializer(data = data)
 
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data,status = status.HTTP_201_CREATED)
        return JsonResponse(serializer.errors,status = status.HTTP_400_BAD_REQUEST)

ここで

  • 関数型Viewsに慣れている場合、Webページのフォーム偽造を防ぐために@csrf_exemptトークンを使用したことでしょう。しかし、クラスベースのビューを使用すると、APIViewの内部にすでに含まれているため、別途追加する必要はありません。
  • ここで、各クラスメソッドの引数として request を与える必要があります。
  • HTTPメソッドは、クラスメソッドとして記述します。
  • get()クラスメソッド内では、DBに存在する全てのオブジェクトをitems変数に格納しています。
  • 次に、シリアライザーを使って、itemsリストに格納されている特定の情報をJSON形式に変換しています。 DBからすべてのオブジェクトを取得したので、manyをTRUEに設定します。
  • 情報がJSONに変換されたら、適切なJSONレスポンスを返します。
  • post()クラスのメソッド内部では、リクエストの中でユーザーからを受け取ります。
  • そのため、postクラスメソッドに引数としてを渡す必要があります。
  • ユーザーが送る情報は JSON 形式なので、正しい Python-Django の読みやすい構文に変換する必要があります。
  • そこで、JSONParser を使ってリクエストを解析し、新しいアイテムに関連するデータを取得し、変数 data に格納します。
  • そして、シリアライザーを使って、リクエストから得たパースされた JSON テキストを Python で読める構文に変換します。
  • 解析されたシリアライズデータが有効であれば、それを保存し、そうでなければ、エラーメッセージを表示します。
  • Django rest_framework は、上にあげたような HTTP ステータスを提供してくれま す。ですから、それらを直接使用することができます。

Django Rest_Framework – ステータスライブラリ

Django rest_framework は、多くの HTTP ステータスをプリインストールしてくれますが、そのうちのいくつかを紹介します。

  • status 201: この属性は、新しいオブジェクトが作成されたときに使用されます。
status = status.HTTP_201_CREATED
  • ステータス 400: この属性は、ユーザが不正なリクエストをしたときに使用されます。
status = status.HTTP_400_BAD_REQUEST
  • ステータス404 この属性は、ユーザーが要求した特定の情報がサーバーに存在しない場合に使用されます。
status = status.HTTP_404_NOT_FOUND
  • ステータス200:この属性は、すべてが予想通りに行われたときに使用されます。つまり、処理が「OK」であった場合です。
status =status.HTTP_200_OK

同様に、ItemViewも作成します。

class ItemView(APIView):
     
    def get_objects(self,nm):
        try:
            return ItemsModel.objects.get(id = nm)
        except ItemsModel.DoesNotExist:
            raise Http404('Not found')
 
    def get(self,request,nm,format =None):
        item = self.get_objects(nm)
        serializer = ItemSerializer(item)
        return JsonResponse(serializer.data)
 
    def put(self,request,nm,format =None):
        item = self.get_objects(nm)
        data = JSONParser().parse(request)
        serializer = ItemSerializer(item,data = data)
 
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status = status.HTTP_400_BAD_REQUEST)
 
    def delete(self,request,nm,format=None):
        item = self.get_objects(nm)
        item.delete()
        return HttpResponse(status =status.HTTP_204_NO_CONTENT)

ここで

  • APIViewに含まれているため、@csrf_exemptは必要ありません。
  • try-exceptブロックは、ユーザーが要求したオブジェクトを取得するために存在します。
  • ここでは、try-except ブロックで、項目の id を関数に渡すと、データベースから項目を取得しようとします。もし、アイテムが存在すれば、それをアイテム変数に格納し、そうでなければ、HTTP 404 エラーを発生させます。
  • HTTPのメソッドはクラスメソッドとして存在しています。
  • HTTPメソッドはクラスメソッドとして存在します。
  • ここでは、特定のアイテムを削除するために新しい DELETE メソッドを追加します。
  • Django rest_framework は、上にあげたような HTTP ステータスを提供してくれま す。ですから、先ほどのものをこれに置き換えてください。

これで、クラスベースのビューがいかにシンプルで構造化されているか、おわかりいただけたと思います。

クラスベースのビューのためのURLマッピング

ビューが関数ベースでなくなったので、ViewをURLにリンクする方法も変更されます。

クラスベースのViewには組み込みの関数.as_view()があり、これを使用してViewを直接インクルードすることができます

urls.py では、以下のように .as_view() を使用します。

urlpatterns = [
    path('items/', ItemsView.as_view()),
    path('item/<int:nm>/', ItemView.as_view()),
]

.as_view()の使い方も非常に簡単です。

前回は、シリアライザーファイル、モデルファイル、ItemModelの作成について詳しく学びました。

まだ確認していない方は、こちらにもコードを載せておきますのでご安心ください。

モデル.py

Models
Models

シリアライザー.py

Serializers
Serializers

以上で、サーバを再実行し、POSTMANで確認すると、前回の記事と同じ出力が得られるはずです。

POSTMANでサーバを起動する

チェックのために、POSTMANが必要になります。

POSTMANについてもっと知りたい方は、公式ページで確認することができます

1. GET /items

検索ボタンにエンドポイントを入力し、送信を押してください。

ここで、アイテムのリストが表示されることを確認してください。

GET Items
GET Items

2. POST /items

ここで、エンドポイントはそのままに、メソッドをPOSTに変更します。

先ほどと同じ出力が得られます。

POST Items
POST Items

3. GET /item/

エンドポイントを上記のように変更し、GETメソッドを選択します。

そして、送信を押してください。

ここでも、先ほどと同じように動作します。

GET Item
GET Item

4. PUT /item/とします。

同様に、エンドポイントはそのままに、HTTPメソッドをPOSTに変更し、送信を押してください。

PUT Item
PUT Item

5. DELETE /item/を削除します。

これで、特定のオブジェクトを削除するには、エンドポイントにidを入力し、DELETEメソッドを選択して、送信を押してください。

アイテムは前と同じように削除されます。

DELETE Item
DELETE Item

まとめ

以上です! Django のクラスベースのビューのチュートリアルは以上です。

Django のクラスベースの Views の基本的な使い方と、その使い方をすべて理解していただけたでしょうか。

また、 Django REST Framework について、公式ドキュメントからさらに学ぶことができます。

Django のトピックに関するより高度なチュートリアルにご期待ください!

</d

タイトルとURLをコピーしました