はじめに
わたしは現在djangoの学習中の実務未経験のエンジニア志望のサラリーマン(営業)です。
参考書は「実践Django Pythonによる本格Webアプリケーション開発」を進めています。
https://www.shoeisha.co.jp/book/detail/9784798153964
躓いたこと
教本通りログイン・ログアウト機能を実施するコードを記載して、
ログイン中状態からログアウトしても HTTP ERROR 405 が表示されてしまう。。
LogoutView.as_view()クラスを用いて、
setteing.pyでLOGOUT_REDIRECT_URL = "/"を設定しているので
教本通りならログアウトボタンを押せばトップページにリダイレクトされるはず。
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.views import LoginView, LogoutView
from django.urls import path
from django.views.generic import CreateView
urlpatterns = [
path('signup/', CreateView.as_view(
template_name='accounts/signup.html',
form_class=UserCreationForm,
success_url="/",
), name='signup'),
path('login/', LoginView.as_view(
redirect_authenticated_user=True,
template_name='accounts/login.html'
), name='login'),
path('logout/', LogoutView.as_view(), name='logout'),
]
<nav class="navbar navbar-expand flex-md-row navbar-dark bg-dark">
<div class="container justify-content-between">
<a href="/" class="navbar-brand">Djangoスニペット</a>
<ul class="navbar-nav mr-md-2">
{% if user.is_authenticated %}
<li class="nav-item"><a class="nav-link" href="{% url 'logout' %}">ログアウト</a></li>
{% else %}
<li class="nav-item"><a class="nav-link" href="{% url 'login' %}">ログイン</a></li>
<li class="nav-item"><a class="nav-link" href="{% url 'signup' %}">会員登録</a></li>
{% endif %}
</ul>
</div>
</nav>
気付いたきっかけ
コマンドプロンプトに表示されていたエラーがこちら
Method Not Allowed (GET): /accounts/logout/
Method Not Allowed: /accounts/logout/
上記エラーで調べてみたところ、詳細を説明されているページを発見
https://terakoya.sejuku.net/question/detail/33882
ログアウトの際はPOSTメソッドでなくてはいけないところ、GETメソッドがリクエストされているとか・・・
解決策
説明をもとに<a>タグで囲っているところを<form>タグに修正
<nav class="navbar navbar-expand flex-md-row navbar-dark bg-dark">
<div class="container justify-content-between">
<a href="/" class="navbar-brand">Djangoスニペット</a>
<ul class="navbar-nav mr-md-2">
{% if user.is_authenticated %}
<li class="nav-item">
<form method="post" action="{% url 'logout' %}">
{% csrf_token %}
<button type="submit" class="btn btn-link nav-link">ログアウト</button>
</form>
</li>
{% else %}
<li class="nav-item"><a class="nav-link" href="{% url 'login' %}">ログイン</a></li>
<li class="nav-item"><a class="nav-link" href="{% url 'signup' %}">会員登録</a></li>
{% endif %}
</ul>
</div>
</nav>
最後に
無事ログアウトボタンが動作するようになりました。
(でもナビゲーションバーのログアウトがログイン・会員登録にパッと切り替わるだけで味気ないので、ログアウトしたら別のページに飛ぶ方が面白いなーと思いました。)