この記事では、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
シリアライザー.py
以上で、サーバを再実行し、POSTMANで確認すると、前回の記事と同じ出力が得られるはずです。
POSTMANでサーバを起動する
チェックのために、POSTMANが必要になります。
POSTMANについてもっと知りたい方は、公式ページで確認することができます。
1. GET /items
検索ボタンにエンドポイントを入力し、送信を押してください。
ここで、アイテムのリストが表示されることを確認してください。
2. POST /items
ここで、エンドポイントはそのままに、メソッドをPOSTに変更します。
先ほどと同じ出力が得られます。
3. GET /item/
エンドポイントを上記のように変更し、GETメソッドを選択します。
そして、送信を押してください。
ここでも、先ほどと同じように動作します。
4. PUT /item/とします。
同様に、エンドポイントはそのままに、HTTPメソッドをPOSTに変更し、送信を押してください。
5. DELETE /item/を削除します。
これで、特定のオブジェクトを削除するには、エンドポイントにidを入力し、DELETEメソッドを選択して、送信を押してください。
アイテムは前と同じように削除されます。
まとめ
以上です! Django のクラスベースのビューのチュートリアルは以上です。
Django のクラスベースの Views の基本的な使い方と、その使い方をすべて理解していただけたでしょうか。
また、 Django REST Framework について、公式ドキュメントからさらに学ぶことができます。
Django のトピックに関するより高度なチュートリアルにご期待ください!
</d