Django 推文应用登出功能异常问题求助
Django 登出功能失效问题解决记录
问题概述
开发基于Python 3.12.0 + Django的推文应用时,登录功能正常,但登出操作失效。点击登出链接(http://127.0.0.1:8000/logout/?next=/)时出现「无法访问此网站」错误,无法完成账号登出。
相关代码
urls.py
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path("",include('tweetapp.urls')), path("",include('django.contrib.auth.urls')), ]
views.py
from django.shortcuts import render, redirect from . import models from django.urls import reverse from tweetapp.forms import AddTweetForm, AddTweetModelForm def listtweet(request): all_tweets = models.Tweet.objects.all() tweet_dict = {"tweets":all_tweets} return render(request,'tweetapp/listtweet.html',context=tweet_dict) def addtweet(request): if request.POST: nickname = request.POST["nickname"] message = request.POST["message"] models.Tweet.objects.create(nickname=nickname, message=message) return redirect(reverse('tweetapp:listtweet')) else: return render(request,'tweetapp/addtweet.html') def addtweetbyform(request): if request.method == "POST": form = AddTweetForm(request.POST) if form.is_valid(): nickname = form.cleaned_data["nickname_input"] message = form.cleaned_data["message_input"] models.Tweet.objects.create(nickname=nickname, message=message ) return redirect(reverse('tweetapp:listtweet')) else: print("error in form") return render(request,'tweetapp/addtweetbyform.html', context={"form":form}) else: form = AddTweetForm() return render(request,'tweetapp/addtweetbyform.html', context={"form":form}) def addtweetbymodelform(request): if request.method == "POST": form = AddTweetModelForm(request.POST) if form.is_valid(): print(form.cleaned_data) return redirect(reverse('tweetapp:listtweet')) else: print("error in form") return render(request,'tweetapp/addtweetbymodelform.html', context={"form":form}) else: form = AddTweetModelForm() return render(request,'tweetapp/addtweetbymodelform.html', context={"form":form})
原base.html中的登出代码
<li class="nav-item"> <a class="nav-link" href="{% url 'login' %}">Login</a> </li> <li class="nav-item"> <a class="nav-link" href="{% url 'logout' %}?next=/">Logout</a> </li>
解决方法
Django内置的logout视图默认仅接受POST请求(出于CSRF安全防护考虑),原代码中使用<a>标签发起的是GET请求,因此无法正常触发登出逻辑。将登出链接替换为POST表单形式,带上CSRF令牌即可解决问题:
修改后的base.html登出代码:
<form method="post" action="{% url 'logout' %}"> {% csrf_token %} <button class="nav-link" type="submit">Logout</button> </form>
内容的提问来源于stack exchange,提问作者airbone7
相关产品推荐
相关产品推荐

