LoginSignup
1
0

More than 1 year has passed since last update.

メモ〜LoginRequiredMixinの使い方

Posted at

今回のお題

今回は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を用いてテンプレートに機能を追加していきます。

myapp/models.html
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の使い方になります。

ログイン状態の有無で処理を分けたい時は結構あるので、うまく使いこなしていきたいですね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0