0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【DjangoのLogout機能が教本通り動かなかった経験から

Posted at

はじめに

わたしは現在djangoの学習中の実務未経験のエンジニア志望のサラリーマン(営業)です。
参考書は「実践Django Pythonによる本格Webアプリケーション開発」を進めています。
https://www.shoeisha.co.jp/book/detail/9784798153964
image.png

躓いたこと

教本通りログイン・ログアウト機能を実施するコードを記載して、
ログイン中状態からログアウトしても HTTP ERROR 405 が表示されてしまう。。
LogoutView.as_view()クラスを用いて、
setteing.pyでLOGOUT_REDIRECT_URL = "/"を設定しているので
教本通りならログアウトボタンを押せばトップページにリダイレクトされるはず。

accounts/urls.py
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'),
]
base.html
<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>タグに修正

base.html
<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>

最後に

無事ログアウトボタンが動作するようになりました。
(でもナビゲーションバーのログアウトがログイン・会員登録にパッと切り替わるだけで味気ないので、ログアウトしたら別のページに飛ぶ方が面白いなーと思いました。)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?