ミックスイン(Mixin)

ミックスイン(Mixin)

Djangoが提唱するViewの特徴にミックスイン(Mixin)というものがあります。
Mixinを使用することで作成したクラスビューに機能を付け加えることができます。

使用方法は簡単で、Mixinをインポートしてclassの引数に加えるだけです。

このドキュメントでは LoginRequiredMixinUserPassesTestMixin という2つの主要なMixinについて触れて、Mixinの使い方を説明していきます。

LoginRequiredMixin

LoginRequiredMixinとはその名の通り、Viewにログイン権限をかけることができるMixinです。
classの引数にこれを指定するだけで、ユーザーがログインしていない場合に自動的にログインURLに遷移させることができます。

views.py

from django.views.generic import TemplateView
from django.contrib.auth.mixins import LoginRequiredMixin

class IndexView(LoginRequiredMixin, TemplateView):

    template_name = 'index.html'

index = IndexView.as_view()

ここで行なっていることは、classの引数のTemplateViewの前にLoginRequiredMixinを指定しているだけです。
たったこれだけでViewにログイン権限をかけてくれるのがMixinの便利なところです。

UserPassesTestMixin

UserPassesTestMixinは、カスタム可能な権限(Authentication)を付与できるMixinです。
指定したViewにtest_funcという名前の関数を設置して、その返り値(return)がFalseの場合にステータスコードの403(Access Forbidden)を返してくれるMixinです。

views.py

from django.views.generic import TemplateView
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTextMixin

class IndexView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):

    template_name = 'index.html'

    def test_func(self):
        user = self.request.user
        return user.is_staff    

index = IndexView.as_view()

ここでは先ほどのLoginRequiredMixinを使用していますが、これに加えて、UserPassesTextMixinを使用して、test_funcを導入しています。

return で user.is_staffとなっています。
もしアクセスしているユーザーがスタッフ権限を持っていない場合はFalseが返り、ユーザーには403のアクセス禁止がレスポンスとして与えられます。
これにより スタッフ権限を持っているユーザーしかこのページにアクセスできなくなります。

さいごに

Mixinは便利な機能ですが、時に諸刃の剣となります。
Djangoには様々なMixinがデフォルトで用意されています。(自作のMixinを作成することも可能です。)

どんなMixinがあるかは公式ドキュメントを参照してみてください。

加えることが簡単な分、どんどん加えていくとclassが大きくなっていき、単純なリクエストを扱うのにも多くの時間とメモリを消費してしまう、なんてことにならないように注意をする必要があります。
必要に応じて、最適なコードを目指して開発していければ良いでしょう。