(最終更新月:2022年3月)
✔このような方へ向けて書かれた記事となります
「Django REST frameworkのAPIViewってなに?」
「APIViewの書き方が知りたい!」
「やり方はわかったけど、実際のコードをみたい。実例は?」
✔当記事を通じてお伝えすること
- Django REST frameworkのAPIViewってなに?
- APIViewの書き方|覚えておきたい2つのメソッドについて
- APIViewの実例を見てみる
Django REST frameworkのAPIViewってなに?
Django REST frameworkとは?
Django REST frameworkとは、カンタンにWeb APIの構築ができるDjangoユーザーへ向けたPythonパッケージです。(公式ドキュメントはこちら※全て英語で記述)
詳しくはこちらでどうぞ↓
その中で基本的なビュークラスのうちの一つがAPIViewになります。
他のビューと並べて特長を見ていきます。
Django REST frameworkのAPIViewについて
そもそも、Django REST frameworkのviewは大きく2種類用意されています。
- データベースと連携なし|ファンクションビュー、クラスベースビュー
- データベースと連携あり|ジェネリックビュー、ビューセット
簡単にそれぞれ見ていきながら、APIViewについての理解を深めていきましょう。
データベースと連携なし|ファンクションビュー、クラスベースビュー
APIViewは、データベースと連携のないクラスベースビューに分類されます。
コードによって連携させることも可能で、自由度が高いというメリットがあります。
ファンクションビューでは、api_viewというデコレータを使うことで、シリアライズ化したデータを返すことが可能です。
データベースと連携あり|ジェネリックビュー、ビューセット
一般的なDjangoのクラスベースビューでも「CreateView」「UpdateView」などCRUDにまつわるクラスベースビューに近いビューがジェネリックビューになります。
データベースとの連携を前提としたジェネリックビューは下記の通りです。
- CreateAPIView
- ListAPIView
- RetrieveAPIView
- DestroyAPIView
- UpdateAPIView
- ListCreateAPIView
- RetrieveUpdateAPIView
- RetrieveDestroyAPIView
- RetrieveUpdateDestroyAPIView
また、こうしたCRUDにまつわるジェネリックビューをまとめた役割をもつViewsetsもデータベースと連携があるビューの一つと言えます。
APIViewの書き方|覚えておきたい2つのメソッドについて
APIViewの良いところは、自由度が高いところです。
主にはフロントエンド側からの①GETメソッド②POSTメソッドの2タイプのリクエストに対して何を返すかを指定することができます。
get関数
def get(self, request, format=None):
#何かしらの処理を記述します。
return Response("返したい値を記述")
GETメソッドによるアクセスの際に返す値をResponseコンストラクタで処理し返します。
post関数
def post(self, request, format=None):
#何かしらの処理を記述します。
return Response("返したい値を記述")
POSTメソッドによる送信が行われた際に特定の値を返します。
テンプレート
Responseの生成など、テンプレート化しておくと便利です。
下記をコピペし、不要なメソッドは削除、必要なメソッド内で適切な処理を記述することで簡単にAPIViewを使いこなせます。
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authentication, permissions
class ListUsers(APIView):
#認証システムを指定します。デフォルトの通りの場合は不要。
authentication_classes = [authentication.TokenAuthentication]
#アクセス制限を指定します。デフォルトの通りの場合は不要。
permission_classes = [permissions.IsAdminUser]
def get(self, request, format=None):
#こちらに処理を記述します。
return Response("戻り値")
def post(self, request, format=None):
#こちらに処理を記述します。
return Response("戻り値")
このテンプレートを使った具体的な例を見てみましょう。
APIViewの実例を見てみる
こちらの記事でもコードだけ紹介しています。
自作アプリ「QRコード作成アプリ」の実際のコードになります。
from rest_framework.response import Response
from rest_framework.views import APIView
from tools.models import QRcode
from django.conf import settings
from utils import domain_handler
import qrcode
class CreateQRView(APIView):
def post(self, request, format=None):
value = request.data["value"]
media_root = settings.MEDIA_ROOT
removed_text = value.replace("/", "").replace(":", "").replace("@", "")
file_path = str(media_root) + f"/qr/{removed_text}.png"
img = qrcode.make(value)
qr_img_path = img.save(file_path)
obj, created = QRcode.objects.get_or_create(value=value, image=file_path)
media_path = domain_handler.get_absolute_media_root()
path_ = media_path + f"qr/{removed_text}.png"
return Response({"filepath": path_})
ReactとDjango Rest Frameworkを使った「QRコードアプリ」のコードと詳しい解説が、こちらのnoteで480円にて販売中。
目次は無料でご覧いただけます。
こちらで実際に使用できます。
フロントエンドはReactで作りました。
Webデザインについてはよくわからないので、詳しい方がいましたら最下部のTwitterボタンよりご連絡お待ちしてます。
まとめ
当記事の内容をまとめます。
Django REST frameworkのビューには、大きく2タイプのビューが用意されています。
- データベースと連携なし|ファンクションビュー、クラスベースビュー
- データベースと連携あり|ジェネリックビュー
この中でも、APIViewはデータベースと連携がないクラスベースビューになります。。
自由度が高いメリットがあり、主なメソッドは下記の2つです。
- getメソッド
- postメソッド
それぞれ、フロントエンド側からどちらのリクエストを想定するかで必要な処理を記述します。
以上、Django REST frameworkのAPIViewについてでした。
「ビューセットについて詳しく知りたい」という方はこちらの記事もどうぞ↓