LogoutViewで405エラーが出た話
LogoutViewで405エラーが出た話
Djangoの組み込みビューであるLogoutViewを使ったときに405エラーが発生しました。
完全に忘れていたので、備忘録として残そうと思いました、、!
エラー内容
組み込みビューでログアウトの処理を実装してログアウトページにアクセスしたら以下のエラーが出ました。
Method Not Allowed (GET): /accounts/logout/
Method Not Allowed: /accounts/logout/
[18/Jun/2025 00:17:08] "GET /accounts/logout/ HTTP/1.1" 405 0
原因
エラーの内容を見てみるとMethod Not Allowed (GETとなっています。
こうなる原因は組み込みのLogoutViewはPOSTメソッドのみを許可しているためです。
実際に組み込みのソースコードには以下のように記述されています
class LogoutView(RedirectURLMixin, TemplateView):
"""
Log out the user and display the 'You are logged out' message.
"""
http_method_names = ["post", "options"]
template_name = "registration/logged_out.html"
extra_context = None
‥‥
このため、aタグなどでログアウトページにアクセスするとGETメソッドとしてアクセスしてしまうためエラーが発生します
対処法
対処法としては、ログアウトのリンクをPOSTメソッドで送信するようにする必要があります。
なので厄介なのですが、aタグではなく、formタグを使用してPOSTメソッドでログアウトのリクエストを送信する必要があります。
このときに、CSRFトークンを忘れずに設定する必要があります。(Djangoでのセキュリティ対策のため)
<form action="{% url 'logout' %}" method="post">
{% csrf_token %}
<button type="submit">ログアウト</button>
</form>
追記
今回エラーが出るのはDjangoのバージョンが5系以降で出るらしいです。
今まで自分がこのエラーに遭遇しなかったのはずっと4系を使っていたからでした、、、
4系のほうでLogoutViewの実装を確認したところGETメソッドなども許可されてました。
class LogoutView(RedirectURLMixin, TemplateView):
"""
Log out the user and display the 'You are logged out' message.
"""
"""
RemovedInDjango50Warning: when the deprecation ends, remove "get" and
"head" from http_method_names.
"""
http_method_names = ["get", "head", "post", "options"]
template_name = "registration/logged_out.html"
extra_context = None
‥‥
コメントアウトで5系以降ではGETメソッドは消すよ~と書かれてた、、
📚 参考資料
Using the Django authentication system
https://docs.djangoproject.com/en/5.2/topics/auth/default/#all-authentication-views
django/contrib/auth/views.py | GitHub
https://github.com/django/django/blob/stable/5.2.x/django/contrib/auth/views.py#L125