👿

Django:エラー「Showing `Method Not Allowed (GET): /users/logout/`」の解決方法

2024/04/17に公開

経緯

下記の本でDjangoを勉強している中で,このエラーに遭遇しました.

最短距離でゼロからしっかり学ぶ Python入門 実践編 〜ゲーム開発・データ可視化・Web開発 | Eric Matthes, 鈴木たかのり, 安田 善一郎 |本 | 通販 | Amazon

詳細

Djangoが提供する認証システム「django.contrib.auth」でログイン・ログアウト機能を実装する際に,ログアウトしようとしても「HTTP 405」のエラーが記載されたページが表示されました.

原因

GETリクエストによるログアウト機能がver4.1で廃止されたようです.GETリクエストの代わりに,POSTリクエストで行うよう指定されています.

https://docs.djangoproject.com/en/5.0/releases/4.1/#features-deprecated-in-4-1

エラーが起こったコード

learning_logs/base.html

<p>
    <a href = "{% url 'learning_logs:index' %}" >学習ノート</a> -
    <a href = "{% url 'learning_logs:topics' %}">トピック一覧</a> -
    {% if user.is_authenticated %}
        こんにちは {{user.username}} さん
        <a href="{% url 'users:logout' %}">ログアウト</a>
    {% else %}
        <a href="{% url 'users:login' %}">ログイン</a>
    {% endif %}
</p>
{% block content %}{% endblock content %}

※users/urls.pyの設定

from django.urls import path, include
from django.contrib.auth import views as auth_views 


app_name = 'users'
urlpatterns=[
    # デフォルトの認証URLを使用する
    path('', include('django.contrib.auth.urls')),
]

解決策

learning_logs/base.htmlファイルを以下のように変更する.

learning_logs/base.html

<p>
    <a href = "{% url 'learning_logs:index' %}" >学習ノート</a> -
    <a href = "{% url 'learning_logs:topics' %}">トピック一覧</a> -
    {% if user.is_authenticated %}
        こんにちは {{user.username}} さん
        <form method="post" action="{% url 'users:logout' %}">
            {% csrf_token %}
            <button type="submit">ログアウト</button>
        </form>
    {% else %}
        <a href="{% url 'users:login' %}">ログイン</a>
    {% endif %}
</p>
{% block content %}{% endblock content %}

参考

https://forum.djangoproject.com/t/showing-method-not-allowed-get-users-logout/26044

Discussion