Djangoのauthログイン機能でログインは出来たのにログアウトすると「このページは現在機能していません」と表示されることがあります。その原因はいくつか考えられます。
logoutが出来るように修正する方法その1
まずurls.pyのコードになります。通常はこのようにコードを書きます。
from django.urls import path
# viewsをインポートしてauth_viewという記名で利用する
from django.contrib.auth import views as auth_views
# URLパターンを逆引きできるように名前を付ける
app_name = 'accounts'
# URLパターンを登録するための変数
urlpatterns = [
# ログインページの表示
path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
# ログアウトを実行
path('logout/', auth_views.LogoutView.as_view(template_name='logout.html'), name='logout'),
]
このコードのtemplate_name=’logout.html’で指定されたテンプレートをレンダリングしようとします。
このlogout.htmlが存在しない、または何らかのエラーを含んでいる場合に問題が発生する可能性があります。
しかし、一般的にはログアウト後にはユーザーをログインページやホームページにリダイレクトさせることが一般的です。そのため、テンプレートをレンダリングする代わりにリダイレクトを行う設定に変更すると良いでしょう。
urls.pyの修正
from django.contrib.auth import views as auth_views
# ログアウト後にリダイレクトするURLを指定
path('logout/', auth_views.LogoutView.as_view(next_page='ホームページのURL'), name='logout'),
next_pageにはリダイレクト先のURLを指定します。これが/であればサイトのホームページになりますし、/login/など、ログインページへのパスを指定することもできます。
logoutが出来るように修正する方法その2
ドルウェアの設定確認をします。
Djangoの認証システムはセッションミドルウェアに依存しているため、settings.pyにdjango.contrib.sessions.middleware.SessionMiddlewareとdjango.contrib.auth.middleware.AuthenticationMiddlewareが含まれていることを確認してください。
logoutが出来るように修正する方法その3
ログアウトボタンのフォームの確認をします。
ログアウトボタンがフォームを介してPOSTリクエストを送信しているか、または単にリンクとして機能しているかを確認してください。セキュリティ上の理由から、ログアウトはPOSTリクエストを使用して実行することが推奨されます。
<a href="{% url 'accounts:logout' %}">ログアウト</a>
上記のような書き方はダメです。
修正コードを下記に書きます。
<form action="{% url 'accounts:logout' %}" method="post">
{% csrf_token %}
<button type="submit">ログアウト</button>
</form>
この方法でログアウト機能が期待通りに動作するようになるはずです。