今回のお題
今回はdjangoのLoginRequeiredMixin
についてまとめます。
LoginRequiredMixin
を用いることで、ログインしていないユーザーを特定のページにリダイレクトするという仕様を簡単に実装できるようになります。
目次
- Mixinとは
- LoginRequiredMixinとは
- 実装例
- 注意点
Mixinとは
Mixinとはdjangoのクラスベースビューに搭載されている機能の一つで、ビューに特定の機能(例えばログインしていない状態でそのページに遷移しようとするとログインページにリダイレクトされる、など)を付け加える際に使用される。
Mixinの実態はAcccessMixin
というスーパークラス及びそのサブクラスであり、テンプレートビュークラスを定義する際にMixinを継承させることで継承元のMixinの持つ機能をビューに付加することができる。
ちなみに、CreateView
などのいわゆる汎用ビューもMixinを継承して定義されています。
class CreateView(SingleObjectTemplateResponseMixin, BaseCreateView):
"""
View for creating a new object, with a response rendered by a template.
"""
template_name_suffix = '_form'
LoginRequiredMixinとは
LoginRequiredMixin
はMixinの一つであり、このMixinを継承することでログインしていないユーザーを特定のページに遷移させる
という機能を実装することができるようになります。
遷移先のurlは、login_url
という属性値を用いて指定します。
実装例
では、Mixinについてわかったところで今回のお題であるLoginRequiredMinin
を用いてテンプレートに機能を追加していきます。
class IndexView(LoginRequiredMixin, TemplateView):
template_name = "myapp/index.html"
login_url = reverse_lazy("account_login") # リダイレクト先の指定
login_url
という変数を用いてリダイレクト先のurlを指定しています。
また、今回のように継承元が複数ある場合には、Mixinが先
でTemplateViewが後
になるので注意してください。
注意点
今回は遷移先のurlを、reverse_lazy
を用いて以下のように定義しました。
login_url = reverse_lazy("account_login")
ルーティングnameからurlを逆引きするだけであれば他にreverse
もありますが、こちらを使うとエラーになります。
この理由に関しては、
テンプレートビュークラスに属性値がセットされる段階では
urls.py
はまだ呼び出されていない(=プロジェクト側がルーティングnameを把握してない)ので、その段階でreverse
を用いてルーティングnameを参照しようとするとエラーになる。
しかし
reverse_lazy
関数であればurls.pyが読み込まれるまで処理を遅延させることができるので、クラスの属性値としてルーティングnameを参照してもエラーにならない。
ちなみにクラスに定義した関数やメソッドが呼ばれる際にはurls.pyの読み込みは完了しているので、reverseを用いても問題はない。
とのことです。
終わりに
以上がLoginRequiredMixinの使い方になります。
ログイン状態の有無で処理を分けたい時は結構あるので、うまく使いこなしていきたいですね。