Djangoでlogoutすると「このページは現在機能していません」と表示される

投稿日: 2024年2月16日

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>

この方法でログアウト機能が期待通りに動作するようになるはずです。

記事