Django REST frameworkで入力されたrequest.dataをバリデーションして、400レスポンスを返す楽な書き方
知っている人にとっては当然のことかもしれませんが、最近気づいたtipsです。
Django REST framework(以下DRF)で、入力されたJSONをデシリアライズ, is_valid()して、不適なJSONのときは400 Bad Requestを返すとき、こう書いていませんか?
class YourHandler(APIView):
post(self, request):
serializer = YourSerializer(request.data)
if serializer.is_valid():
# JSON入力がいい時の処理
return Response("OK")
else:
# JSON入力がvalidでないとき
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
私も今までこう書いていました。これでも動くしカスタマイズできていいのですが、if文で多少コードが見にくくなります。
DRFはこのよくあるニーズを解決してくれます。
class YourHandler(APIView):
post(self, request):
serializer = YourSerializer(request.data)
serializer.is_valid(raise_exception=True)
# JSON入力がいい時の処理
return Response("OK")
この4行目に注目すると、serializer.is_valid()にraise_exception=Trueがついています。
このraise_exception=Trueが肝で、これを入れることで、バリデーションをして400のResponseをreturnするということを裏でやってくれるのです。
リーダブルコードでいうところの「ガード節とアーリーリターン」にあたりますね。
以上最近のtipsでした。
ディスカッション
コメント一覧
まだ、コメントがありません