このページでは LogoutView
の使い方について説明していきます。
この LogoutView
は View
というクラスのサブクラスの1つであり、ビューをクラスベースで作成する際に利用するクラスとなります。この View のサブクラス
を継承し、さらにクラス変数を定義したりメソッドをオーバーライドすることで、あなたが開発したいアプリに応じたビューを作成することが可能となります。
この辺りのクラスベースビューやクラスベースビューの作り方については下記ページで解説していますので、詳しくはこちらをご参照ください。
【Django入門14】クラスベースビューの基本そして、名前の通り LogoutView
はログアウトを実現するための View のサブクラス
となります。そもそもログアウトはログイン状態のユーザーが行うもので有り、ログインを実現するのは LoginView
の役割となります。この LoginView
に関しては下記ページで解説していますので、LoginView
に関しては下記ページを参照していただければと思います。
このページで目指すことは、LogoutView
を利用し、ログアウトをクラスベースビューで実現していくことになります。また、このページでは LogoutView
の使用例は示さず、先ほど紹介した上記の LoginView
でまとめて示すようにしています。そのため、LogoutView
の使用例に関しては上記ページの LoginView の利用例 を別途参照していただければと思います。
Contents
LogoutView
まずは、LogoutView
がどういったクラスであるのかについて解説していきたいと思います。
名前の通り、LogoutView
はログアウトを行うビューを実現するクラスとなります。
auth
アプリから提供されるクラス
このサイトでは今まで View のサブクラス
として CreateView
や UpdateView
を紹介してきましたが、これらは django.views.generic
から提供されるクラスでした。そのため、これらは django.views.generic
から import
して利用する必要がありました。
それに対し、LogoutView
に関してはは LoginView
と同様に django.contrib.auth.views
から import
して利用することになります。
from django.contrib.auth.views import LogoutView
LogoutView
は auth
というアプリで定義されるクラスとなりますので、上記のように import
の仕方が他の View のサブクラス
とは異なる点に注意してください。
また、auth
アプリでは、下記のようにログアウトを実現するための関数が定義されています(ログインを実現するためのクラスや関数も多数定義されています)。
- ユーザーを管理するモデルクラス;
User
- ログアウトを行う関数:
logiout
そして、今回扱う LogoutView
では、ここで紹介した関数を利用してログアウトを実現するビューとなります。
スポンサーリンク
LogoutView
の処理の流れ
続いて LogoutView
の処理の流れについて説明しておきます。
まず、LogoutView
は GET
メソッドと POST
メソッドのリクエストに対応するビューとなりますが、基本的に実行される処理は同じとなります。
そして、LogoutView
はリクエストを受け取るとログアウト処理を行うようになっています。そのため、ユーザーが LogoutView
に紐づけられる URL ヘアクセスするとログアウト状態(非ログイン状態)となります。そして、このログアウト処理は先ほども紹介した logout
関数の実行によって行われることになります。
さらに、ログアウト処理が実行された後は “特定の 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 へのリダイレクトレスポンスが返却されることになります。
それ以外の場合、リクエストのメソッドが GET
であれば get
が、メソッドが POST
であれば post
が呼び出されるようになっています。が、post
では get
を呼び出す処理のみが行われるため、リクエストのメソッドに関わらず処理内容は同じで、結局はリダイレクト先の URL が設定される場合とそれ以外の場合とで処理が振り分けられることになると考えて良いです。そして、リダイレクト先の URL が設定されていない場合はテンプレートファイルから 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 へのリダイレクトレスポンスが返却されることになります。
class UserLogout(LogoutView):
next_page = 'login'
プロジェクトでリダイレクト先を設定する
また、プロジェクトの設定ファイルである settings.py
でログアウト後のリダイレクト先を設定することも可能です。この settings.py
に LOGOUT_REDIRECT_URL
を定義することで、ログアウト後のリダイレクト先を設定することができます。
例えば下記のように settings.py
に対して LOGOUT_REDIRECT_URL
の定義を追加しておけば、ログアウト後に /accounts/login/
をリダイレクト先とするリダイレクトレスポンスが返却されるようになります。
LOGOUT_REDIRECT_URL = '/accounts/login/'
また、LOGOUT_REDIRECT_URL
にも URL を表す文字列だけでなく、urls.py
で設定する URL の名前等も指定可能です。
このように、2つの方法でリダイレクト先を設定することが可能ですが、両方で設定を行なっていた場合は、LogoutView
のサブクラスのクラス変数 next_page
への指定値が優先されることになります。さらに、両方を設定していない場合はリダイレクトレスポンスは返却されず、get
メソッドが実行されてテンプレートファイルからの HTML の生成および HTML をボディとするレスポンスの返却が行われることになります。
LogoutView
のサブクラスが利用するテンプレートファイルはクラス変数 template_name
の定義によって指定可能です。この辺りは他の View のサブクラス
と同様ですので詳細な説明は省略します。
スポンサーリンク
ログインの実現
また、ログアウトはログイン状態のユーザーを非ログイン状態に設定する処理ですので、ログアウト機能を実現するのであればログイン機能も実現しておく必要があります。
このログインを LoginView
を利用してクラスベースビューで実現する方法については下記ページで解説していますので、ログインの実現方法の詳細に関しては下記ページを参照していただければと思います。
非ログインユーザーのアクセス制限
また、ログイン機能を搭載するウェブアプリにおいては、非ログイン状態のユーザーからのアクセスを拒否するようにすることも多いです。こういった非ログイン状態のユーザーに対するアクセス制限は LoginRequiredMixin
を利用することで簡単に実現できます。これに関しても下記ページで解説していますので、詳細は下記ページを参照していただければと思います。
LogoutView
のクラス変数
では、次は LogoutView
で定義されているクラス変数の紹介を行なっていきます。これらのクラス変数を LogoutView
を継承するクラスで定義し直して上書きすることでクラスの動作のカスタマイズを行うことが可能となります。
前述の通り、LogoutView
がリクエストを受け取った際にはログアウト処理が実行され、その後、リダイレクト先の URL が設定されている場合は、その URL へのリダイレクトレスポンスが返却され、それ以外の場合は get
メソッドが実行されるようになっています。なので、リダイレクト先の URL の設定や get
メソッドから参照されるクラス変数の定義によって LogoutView
のサブクラスの動作をウェブアプリに応じたものに変更していくことができます。
スポンサーリンク
LogoutView
のクラス変数の一覧
この LogoutView
で定義されるクラス変数には下記のようなものが存在します。
- next_page
- redirect_field_name (
LoginView
) - template_name
- extra_context (
ListView
) - template_engine (
ListView
) - response_class (
ListView
) - content_type (
ListView
)
他の View のサブクラス
の解説ページで説明済みのものばかりです。ですので、特に LogoutView
に特化した説明が不要である場合は、各クラス変数のテキストに以前説明したページへのリンクを貼るようにしています。他のページにジャンプするリンクテキストの横には括弧内でジャンプ先のページを示していますので、これらのクラス変数の詳細を知りたい方はリンク先の説明を参照していただければと思います。
ここでは、next_page と template_name の解説のみを行なっていきます。
next_page
next_page
は ログアウト後のリダイレクト先の設定 で説明したようにログアウト後のリダイレクト先を指定するためのクラス変数になります。next_page
のデフォルトは None
で、next_page
が None
の場合は 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_page
や settings.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 の利用例 の中でまとめて紹介するようにしています。
上記ページでも説明している通り、ログイン機能を搭載するウェブアプリにおいては LogoutView
だけでなく、LoginView
や LoginRequiredMixin
も適切に利用して実装していく必要があります。
まとめ
このページでは、LogoutView
および LogoutView
を継承したクラスベースビューの作り方について解説しました!
LogoutView
はログアウトを行うビューを実現するための View のサブクラス
であり、このクラスを継承するビューを定義することで、ユーザーのログアウトが簡単に実現することができます。
ただし、ログアウトが必要になるのはログイン機能を備えたウェブアプリであり、ログイン機能を備えたウェブアプリを開発するために LoginView
を継承するクラスや LoginRequiredMixin
を継承するクラス等の定義も必要となります。そのため、LogoutView
単体で使い方を覚えておくというよりも、LoginView
や LoginRequiredMixin
もセットで使い方を覚えておく必要があります。
ログイン機能を実現できるようになれば開発可能なウェブアプリの幅が一気に広がります。そして、ログイン機能を実現するからにはログアウト機能も必要となりますので、是非 LogoutView
を利用したビューの作り方についても覚えておいてください!
また、このサイトでは他の View のサブクラス
についても説明していますので、他のページも是非読んでみてください!