👿
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