この記事は Django Advent Calendar 2021 の最終日の記事です。
はじめに
はじめまして。
普段から Django を使用してWebアプリを開発しています。
今年の Django Advent Calendar 2021 も楽しく拝見させて頂きました。
今年の Django Advent Calendar では
数年前に比べて Djangoそのもの だけではなく
Django REST Framework(DRF) について言及されている記事が増えた気がします。
そこで、今年はこの記事でも Django REST Framework について記載したいと思います。
この記事が Django のより一層の普及に少しでも貢献できれば幸いです。
目次
- Django とは?
- Django REST Framework とは?
- Django REST Framewrk の特徴
- Serializer とは?
- Models にデータを格納するときに Serializer を使う
- Views でリクエストを処理するときに Serializer を使う
Django とは?
一言で述べると、Python Web アプリケーションフレームワークです。
Django を使うことで Python で Web アプリケーションを簡単に作ることができます。
Django を使った Web アプリケーションを作成については以下の記事にまとめました。
現時点で、Django は Python Web アプリケーションフレームワーク の中で最も使われています。
Django REST Framework とは?
Django REST Framework (DRF) とは RESTful API 開発に特化した Django のフレームワークです。
DRF を使うことでより RESTful な Web アプリケーションを作成することができます。
なお、RESTful API とは
REST という原則を守っている HTTP 呼び出しインターフェースのことです。
「RESTful API とは?」や「REST とは?」については以下の記事が分かりやすいです。
Django REST Framewrk の特徴(Serializer)
では、そんな DRF の特徴とは何なのでしょうか?
全てを挙げ出すとキリがないのですが、
個人的に一番の特徴は Serializer にあると思います。
そこで、この記事では DRF の Serializer について解説していこうと思います。
Serializer とは?
Serializer とはざっくり説明すると、
さまざまなタイミングでデータの正当性をチェックできる機能です。
Web アプリケーションが動いている中で以下のタイミングでデータの中身を精査することができます。
- Models にデータを格納するとき
- Views でリクエストを処理するとき
それぞれのタイミングでの使い方を説明していきます。
Models にデータを格納するときに Serializer を使う
Django で作成したアプリケーションが動く中でデータベースに値を格納する場面は多いでしょう。
そのようなときに Serializer を使うことで、値の正当性をチェックすることができます。
Serializer 定義
from rest_framework import serializers
from api.models.user import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = (
'id',
'first_name',
'last_name',
'email',
'password',
)
このような Serializer を定義して値の格納時に呼び出すことで
必須フィールドの過不足をチェックして
おかしな値を格納することを防ぐことができます。
Serializer を使った値のバリデーション
user_serializer = UserSerializer(
data={
'first_name': 'hoge',
'last_name': 'fuga',
'email': 'test@example.com',
'password': 'XXX'
}
)
(おまけ)動的に作成したい値を定義する
serializers.SerializerMethodField()
を使うことで Models に定義した get_XXX をコールすることもできる
class UserSerializer(serializers.ModelSerializer):
full_name = serializers.SerializerMethodField()
class Meta:
model = User
fields = (
'id',
'name',
'email',
'password',
)
def get_value(self, obj):
return obj.hoge()
Views でリクエストを処理するときに Serializer を使う
アプリケーションの中でリクエストを受け取って処理することがあるでしょう。
Serializerを使うことで、その Request Body の中身を精査することができます。
Serializer 定義
from rest_framework import serializers
class LoginValidator(serializers.Serializer):
email = serializers.CharField()
password = serializers.CharField()
上記のように Serializer を定義して、これを View 関数で使用します。
Views で Serializer を使う
from rest_framework import status
from rest_framework.response import Response
from api.serializers.validators import LoginValidator
class EmailLogin:
def post(self, request, format=None):
if not login_serializer.is_valid():
return Response(
self.build_error_response('パラメータが不正です'),
status=status.HTTP_400_BAD_REQUEST
)
...
このようにすることで不正な Request を受け取ったときのアプリケーションの挙動を定義することができます。
なお、Serializer によってバリデーションした後のデータを参照することもできます。
validate 済みのデータを参照する
email = login_serializer.validated_data['email']
address = login_serializer.validated_data.get('address')
こうすることで、安全なデータをアプリケーションの中で使うことができます。
さいごに
最後まで読んで下さり、ありがとうございます。
Django REST Framework を使ってデータの正当性をチェックすることで
より堅牢で安全なアプリケーションを作成することができます。
アプリケーションさえ作ってしまえば、
サーバやドメインを用意して世界中にサービスとして公開することができます。
なお、Webサービスの作成については以下の記事にまとめています。
それでは 2022 年も良い Django ライフを!