You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:50:25