【Django】LogoutViewの使い方(クラスベースビューでのログアウトの実現)

LogoutViewの使い方の解説ページアイキャッチ

このページにはプロモーションが含まれています

このページでは LogoutView の使い方について説明していきます。

この LogoutViewView というクラスのサブクラスの1つであり、ビューをクラスベースで作成する際に利用するクラスとなります。この View のサブクラス を継承し、さらにクラス変数を定義したりメソッドをオーバーライドすることで、あなたが開発したいアプリに応じたビューを作成することが可能となります。

この辺りのクラスベースビューやクラスベースビューの作り方については下記ページで解説していますので、詳しくはこちらをご参照ください。

クラスベースビューの解説ページアイキャッチ 【Django入門14】クラスベースビューの基本

そして、名前の通り LogoutView はログアウトを実現するための View のサブクラス となります。そもそもログアウトはログイン状態のユーザーが行うもので有り、ログインを実現するのは LoginView の役割となります。この LoginView に関しては下記ページで解説していますので、LoginView に関しては下記ページを参照していただければと思います。

LoginViewの使い方の解説ページアイキャッチ 【Django】LoginViewの使い方(クラスベースビューでのログインの実現)

このページで目指すことは、LogoutView を利用し、ログアウトをクラスベースビューで実現していくことになります。また、このページでは LogoutView の使用例は示さず、先ほど紹介した上記の LoginView でまとめて示すようにしています。そのため、LogoutView の使用例に関しては上記ページの LoginView の利用例 を別途参照していただければと思います。

LogoutView

まずは、LogoutView がどういったクラスであるのかについて解説していきたいと思います。

名前の通り、LogoutViewログアウトを行うビューを実現するクラスとなります。

auth アプリから提供されるクラス

このサイトでは今まで View のサブクラス として CreateViewUpdateView を紹介してきましたが、これらは django.views.generic から提供されるクラスでした。そのため、これらは django.views.generic から import して利用する必要がありました。

それに対し、LogoutView に関してはは LoginView と同様に django.contrib.auth.views から import して利用することになります。

LogoutViewのimport
from django.contrib.auth.views import LogoutView

LogoutViewauth というアプリで定義されるクラスとなりますので、上記のように import の仕方が他の View のサブクラス とは異なる点に注意してください。

また、auth アプリでは、下記のようにログアウトを実現するための関数が定義されています(ログインを実現するためのクラスや関数も多数定義されています)。

  • ユーザーを管理するモデルクラス;User
  • ログアウトを行う関数:logiout

そして、今回扱う LogoutView では、ここで紹介した関数を利用してログアウトを実現するビューとなります。

スポンサーリンク

LogoutView の処理の流れ

続いて LogoutView の処理の流れについて説明しておきます。

まず、LogoutView は GET メソッドと POST メソッドのリクエストに対応するビューとなりますが、基本的に実行される処理は同じとなります。

そして、LogoutView はリクエストを受け取るとログアウト処理を行うようになっています。そのため、ユーザーが LogoutView に紐づけられる URL ヘアクセスするとログアウト状態(非ログイン状態)となります。そして、このログアウト処理は先ほども紹介した  logout 関数の実行によって行われることになります。

LogoutViewの動作の説明図

さらに、ログアウト処理が実行された後は “特定の URL へのリダイレクトレスポンスの返却” or “ページを表示するための HTML の生成とレスポンスの返却” のどちらか一方が行われることになります。

リダイレクトレスポンスの返却が行われるのはリダイレクト先の設定が行われている時のみで、このログアウト後のリダイレクト先の設定に関しては次の LogoutView でのクラスベースビューの作り方 で説明します。

LogoutView に関してのポイントはこれくらいで、ログアウト処理は非常に簡単に実現することができます。後は、ログアウト後にリダイレクトを行うのかページの表示を行うのかの設定が必要になるくらいで、この辺りは LoginView および他の View のサブクラス を使ったことがあれば簡単に理解できると思います。

LogoutView でのクラスベースビューの作り方

では、次は LogoutView でクラスベースビューを作成する手順について説明していきます。

LogoutView でのクラスベースビューの作り方に関しても他の View のサブクラス と同様となります。

つまり、views.py に LogoutView を継承するクラス(サブクラス)を定義し、views.py に定義したクラスにクラス変数やメソッドを定義することで LogoutView で定義されているクラス変数の上書きメソッドのオーバーライドを行なっていきます。これにより、LogoutView の特徴を活かしながら自身のウェブアプリに応じたビューにカスタマイズしていくことが可能となります。

クラスベースビューの作り方の説明図

また、リクエストを受け取った際に LogoutView で最初に実行されるメソッドは dispatch であり、このメソッドの中でログアウト処理が行われることになります。そして、リダイレクト先の URL が設定されている場合はリダイレクトレスポンスが返却され、設定されていない場合はテンプレートファイルから HTML を生成してそれをレスポンスとして返却するようになっています。

さらに、LogoutView ではリクエストの内容や設定に応じて dispatch メソッドで処理が振り分けられることになります。

まず、リダイレクト先の URL が設定されている場合は、その URL へのリダイレクトレスポンスが返却されることになります。

リダイレク先のURLが設定されている場合にLogoutViewがリダイレクトレスポンスを返却する様子

それ以外の場合、リクエストのメソッドが GET であれば get が、メソッドが POST であれば post が呼び出されるようになっています。が、post では get を呼び出す処理のみが行われるため、リクエストのメソッドに関わらず処理内容は同じで、結局はリダイレクト先の URL が設定される場合とそれ以外の場合とで処理が振り分けられることになると考えて良いです。そして、リダイレクト先の URL が設定されていない場合はテンプレートファイルから HTML を生成してそれをレスポンスとして返却するようになっています。

リダイレク先のURLが設定されていない場合にLogoutViewがテンプレートファイルから生成したHTMLを返却する様子

したがって、LogoutView のサブクラスにおいては、リダイレクト先の URL の設定や、使用するテンプレートファイルやテンプレートファイルから参照するコンテキストに対するカスタマイズなどが必要になります。

ログイン後のリダイレクト先の設定

このリダイレクト先の URL は、LogoutView のサブクラスでクラス変数を定義する or プロジェクトの設定ファイルでリダイレクト先を指定することで設定することが可能です。

クラス変数を定義する

前者の方法においては、LogoutView のサブクラスでクラス変数 next_page を定義することでリダイレクト先の URL の設定を実現することができます。

クラス変数 next_page を定義していた場合、LogoutView のサブクラスがリクエストを受け取った際に、その next_page に対応する URL へのリダイレクトレスポンスが返却されるようになります。

next_page には URL を表す文字列だけでなく、urls.py で設定する URL の名前等も指定可能です。

例えば下記のように LogoutView のサブクラスとして UserLogout を定義した場合、この UserLogout がリクエストを受け取ってログアウトが実行された後には、URL の名前が 'login' に設定されている URL へのリダイレクトレスポンスが返却されることになります。

next_pageの定義例
class UserLogout(LogoutView):
    next_page = 'login'

プロジェクトでリダイレクト先を設定する

また、プロジェクトの設定ファイルである settings.py でログアウト後のリダイレクト先を設定することも可能です。この settings.pyLOGOUT_REDIRECT_URL を定義することで、ログアウト後のリダイレクト先を設定することができます。

例えば下記のように settings.py に対して LOGOUT_REDIRECT_URL の定義を追加しておけば、ログアウト後に /accounts/login/ をリダイレクト先とするリダイレクトレスポンスが返却されるようになります。

LOGOUT_REDIRECT_URLの定義例
LOGOUT_REDIRECT_URL = '/accounts/login/'

また、LOGOUT_REDIRECT_URL にも URL を表す文字列だけでなく、urls.py で設定する URL の名前等も指定可能です。

このように、2つの方法でリダイレクト先を設定することが可能ですが、両方で設定を行なっていた場合は、LogoutView のサブクラスのクラス変数 next_page への指定値が優先されることになります。さらに、両方を設定していない場合はリダイレクトレスポンスは返却されず、get メソッドが実行されてテンプレートファイルからの HTML の生成および HTML をボディとするレスポンスの返却が行われることになります。

LogoutView のサブクラスが利用するテンプレートファイルはクラス変数 template_name の定義によって指定可能です。この辺りは他の View のサブクラス と同様ですので詳細な説明は省略します。

スポンサーリンク

ログインの実現

また、ログアウトはログイン状態のユーザーを非ログイン状態に設定する処理ですので、ログアウト機能を実現するのであればログイン機能も実現しておく必要があります。

このログインを LoginView を利用してクラスベースビューで実現する方法については下記ページで解説していますので、ログインの実現方法の詳細に関しては下記ページを参照していただければと思います。

LoginViewの使い方の解説ページアイキャッチ 【Django】LoginViewの使い方(クラスベースビューでのログインの実現)

非ログインユーザーのアクセス制限

また、ログイン機能を搭載するウェブアプリにおいては、非ログイン状態のユーザーからのアクセスを拒否するようにすることも多いです。こういった非ログイン状態のユーザーに対するアクセス制限は LoginRequiredMixin を利用することで簡単に実現できます。これに関しても下記ページで解説していますので、詳細は下記ページを参照していただければと思います。

LoginViewの使い方の解説ページアイキャッチ 【Django】LoginViewの使い方(クラスベースビューでのログインの実現)

LogoutView のクラス変数

では、次は LogoutView で定義されているクラス変数の紹介を行なっていきます。これらのクラス変数を LogoutView を継承するクラスで定義し直して上書きすることでクラスの動作のカスタマイズを行うことが可能となります。

前述の通り、LogoutView がリクエストを受け取った際にはログアウト処理が実行され、その後、リダイレクト先の URL が設定されている場合は、その URL へのリダイレクトレスポンスが返却され、それ以外の場合は get メソッドが実行されるようになっています。なので、リダイレクト先の URL の設定や get メソッドから参照されるクラス変数の定義によって LogoutView のサブクラスの動作をウェブアプリに応じたものに変更していくことができます。

スポンサーリンク

LogoutView のクラス変数の一覧

この LogoutView で定義されるクラス変数には下記のようなものが存在します。

他の View のサブクラス の解説ページで説明済みのものばかりです。ですので、特に LogoutView に特化した説明が不要である場合は、各クラス変数のテキストに以前説明したページへのリンクを貼るようにしています。他のページにジャンプするリンクテキストの横には括弧内でジャンプ先のページを示していますので、これらのクラス変数の詳細を知りたい方はリンク先の説明を参照していただければと思います。

ここでは、next_page と template_name の解説のみを行なっていきます。

next_page

next_pageログアウト後のリダイレクト先の設定 で説明したようにログアウト後のリダイレクト先を指定するためのクラス変数になります。next_page のデフォルトは None で、next_pageNone の場合は settings.py で定義した LOGOUT_REDIRECT_URL で指定した URL がログイン後のリダイレクト先の URL に設定されることになります。

ログアウト後のリダイレクト先としてはログインページの URL を設定することが多いと思います。

クラス変数 next_page が定義されておらず、さらに settings.py にも LOGOUT_REDIRECT_URL が定義されていない場合は、次に説明する template_name で指定されるテンプレートファイルを利用して HTML が生成され、それがレスポンスのボディとしてクライアントに返却されることになります。

template_name

template_name は、他の View のサブクラス 同様に LogoutView のサブクラスが利用するテンプレートファイルを指定するクラス変数となります。デフォルトは 'registration/logged_out.html' となります。

前述の通り、ログイン後のリダイレクト先の URL を設定していない場合は、この template_name で指定したパスのテンプレートファイルから HTML が生成されることになります。そのため、template_name で指定したパスには「ログアウトしました」などのメッセージを示すテンプレートファイルなどを用意しておくことが多いと思います。

スポンサーリンク

LogoutView のメソッド

次に LogoutView の持つメソッドを紹介していきます。LogoutView を継承したクラスを定義し、そのクラスで LogotView の持つメソッドをオーバーライドしてやることで LogoutView とは異なる動作のクラスを実現することができるようになります。

ただ、LogoutView の場合はログアウトを実施し、その後にレスポンスを返却するという典型的な処理の流れが既に実現されているため、わざわざオーバーライドを行なって、その処理の流れを変更することは少ないと思います。

ということで、ここではオーバーライドの例などは示さず、LoginView のメソッドの一覧のみを示しておきたいと思います。

LogoutView のメソッド一覧

LogoutView の持つメソッドの一覧は下記のようになります。あくまでもクラスのカスタマイズ目的でオーバーライドを行う可能性のあるものを挙げており、as_view などのカスタマイズは行わないであろうメソッドは省略しています。

  • dispatch:ログアウトの実施および設定やリクエストに応じた処理の振り分けを行う
  • get:リクエストのメソッドが GET の場合の処理を実行する
  • post:リクエストのメソッドが POST の場合の処理を実行する(get の呼び出しのみを行う)
  • get_context_data:テンプレートに渡すコンテキストを生成する
  • get_next_page:リダイレクト先の URL を取得する
  • get_template_names:テンプレートファイルの名前を取得する
  • render_to_response:レスポンスを返却する

ご覧の通り、LogoutView の持つメソッドは少ないです。また、LogoutView のサブクラスで最初に実行されるメソッドは dispatch であり、ここでログアウトが実行されることになります。

さらに、ログアウト実行後に get_next_page メソッドが実行されてリダイレクト先の URL が取得されることになります。そして、この get_next_page メソッドの中で、クラス変数 next_pagesettings.py の LOGOUT_REDIRECT_URL が参照されることになります。

get_next_page の返却値が None である場合はリダイレクトは行われずに get or post メソッドが実行され、その中で get_context_data によってコンテキストを生成し、render_to_response によってレスポンスが生成されることになります。この辺りの流れは他の View のサブクラス と同様となります。 

LogoutView が生成するコンテキスト

続いて LogoutView が生成するコンテキストについて説明しておきます。

LogoutView は get_context_data メソッドの中でコンテキストを生成し、その生成するコンテキストには下記の要素が含まれます。

  • 'site':ログインしようとしているサイト(アプリ)の情報
  • 'site_name':ログインしようとしているサイト(アプリ)の名前
  • 'title''Logged out'

いくつかの要素がコンテキストに含まれることになりますが、基本的に LogoutView では「ログアウトしました」などのメッセージを表示するのみとなることが多いため、テンプレートファイルからコンテキストの要素を参照するようなことは少ないかもしれません。

もし、他のデータをコンテキストにセットしてテンプレートファイルから参照できるようにしたいのであれば、ListView の解説ページの extra_context で説明しているクラス変数 extra_context を定義したり、get_context_data のオーバーライドを行なったりしてコンテキストの要素を追加することも可能です。

スポンサーリンク

LogoutView の利用例

ページの冒頭でも少し説明したように、LogoutView の利用例に関しては下記ページの LoginView の利用例 の中でまとめて紹介するようにしています。

LoginViewの使い方の解説ページアイキャッチ 【Django】LoginViewの使い方(クラスベースビューでのログインの実現)

上記ページでも説明している通り、ログイン機能を搭載するウェブアプリにおいては LogoutView だけでなく、LoginViewLoginRequiredMixin も適切に利用して実装していく必要があります。

まとめ

このページでは、LogoutView および LogoutView を継承したクラスベースビューの作り方について解説しました!

LogoutView はログアウトを行うビューを実現するための View のサブクラス であり、このクラスを継承するビューを定義することで、ユーザーのログアウトが簡単に実現することができます。

ただし、ログアウトが必要になるのはログイン機能を備えたウェブアプリであり、ログイン機能を備えたウェブアプリを開発するために LoginView を継承するクラスや LoginRequiredMixin を継承するクラス等の定義も必要となります。そのため、LogoutView 単体で使い方を覚えておくというよりも、LoginViewLoginRequiredMixin もセットで使い方を覚えておく必要があります。

ログイン機能を実現できるようになれば開発可能なウェブアプリの幅が一気に広がります。そして、ログイン機能を実現するからにはログアウト機能も必要となりますので、是非 LogoutView を利用したビューの作り方についても覚えておいてください!

また、このサイトでは他の View のサブクラス についても説明していますので、他のページも是非読んでみてください!

DjangoのListViewの解説ページアイキャッチ 【Django】ListViewの使い方(クラスベースビューでの一覧リストページの実現) DjangoのDetailViewの解説ページアイキャッチ 【Django】DetailViewの使い方(クラスベースビューでの詳細ページの実現) CreateViewでのクラスベースビューの実現方法解説ページアイキャッチ 【Django】CreateViewの使い方(クラスベースビューでの新規登録ページの実現) UpdateViewでのクラスベースビューの実現方法解説ページアイキャッチ 【Django】UpdateViewの使い方(クラスベースビューでのレコード更新ページの実現) DeleteViewでのクラスベースビューの実現方法解説ページアイキャッチ 【Django】DeleteViewの使い方(クラスベースビューでのレコード削除ページの実現) FormViewでのクラスベースビューの実現方法解説ページアイキャッチ 【Django】FormViewの使い方(クラスベースビューで汎用的なフォームを扱う) LoginViewの使い方の解説ページアイキャッチ 【Django】LoginViewの使い方(クラスベースビューでのログインの実現)

同じカテゴリのページ一覧を表示