ミックスイン(Mixin)
ミックスイン(Mixin)
Djangoが提唱するViewの特徴にミックスイン(Mixin)というものがあります。
Mixinを使用することで作成したクラスビューに機能を付け加えることができます。
使用方法は簡単で、Mixinをインポートしてclassの引数に加えるだけです。
このドキュメントでは LoginRequiredMixin と UserPassesTestMixin という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が大きくなっていき、単純なリクエストを扱うのにも多くの時間とメモリを消費してしまう、なんてことにならないように注意をする必要があります。
必要に応じて、最適なコードを目指して開発していければ良いでしょう。
Just Python フリープラン
ジャスパイなら教材は全て無料!