👿
Django:エラー「Showing `Method Not Allowed (GET): /users/logout/`」の解決方法
経緯
下記の本でDjangoを勉強している中で,このエラーに遭遇しました.
最短距離でゼロからしっかり学ぶ Python入門 実践編 〜ゲーム開発・データ可視化・Web開発 | Eric Matthes, 鈴木たかのり, 安田 善一郎 |本 | 通販 | Amazon
詳細
Djangoが提供する認証システム「django.contrib.auth」でログイン・ログアウト機能を実装する際に,ログアウトしようとしても「HTTP 405」のエラーが記載されたページが表示されました.
原因
GETリクエストによるログアウト機能がver4.1で廃止されたようです.GETリクエストの代わりに,POSTリクエストで行うよう指定されています.
エラーが起こったコード
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 %}
参考


Discussion