LogoutViewで405エラーが出た話

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となっています。
こうなる原因は組み込みのLogoutViewPOSTメソッドのみを許可しているためです。

実際に組み込みのソースコードには以下のように記述されています

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

他のStringを探す