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

React+Axios对接Django REST Framework登出时出现403 Forbidden请求错误

React+Axios对接Django REST Framework登出时出现403 Forbidden请求错误

看起来你已经把基础配置都做了,但登出时Session ID没被正确携带导致403,我来帮你一步步排查并解决问题:

1. 优先检查Django的Session Cookie跨域配置

Django默认的Session Cookie的SameSite属性为Lax,即使是本地127.0.0.1和localhost也可能被浏览器视为不同域名,导致Cookie在登出请求中不被发送。你需要在settings.py里显式调整Session Cookie的相关配置:

# settings.py
SESSION_COOKIE_SAMESITE = 'Lax'  # 开发环境用Lax即可,跨域场景可设为None(需配合SECURE_COOKIE)
SESSION_COOKIE_DOMAIN = '127.0.0.1'  # 与前端请求的域名保持一致,比如前端用localhost就改成localhost
SESSION_COOKIE_SECURE = False  # 开发环境HTTP下设为False,生产环境HTTPS必须设为True
SESSION_COOKIE_HTTPONLY = True  # 保持默认安全配置,避免前端JS直接访问Session Cookie

2. 简化Axios登出请求,移除冗余配置

你已经在全局Axios实例中配置了自动获取CSRF Token和withCredentials: true,手动拆分Cookie获取CSRF Token的操作完全多余,还可能因Cookie格式问题导致Token错误。同时要注意登出请求的URL路径必须以斜杠开头,避免相对路径拼接错误:

// 修正后的Logout函数
function logout(e) {
    e.preventDefault();
    // 移除手动获取CSRF Token的代码,依赖Axios自动配置
    // URL开头加斜杠,确保基于baseURL正确拼接
    client.post("/api/logout/", {})
      .then(res => {
          navigate("/login");
      }).catch(error => {
          console.error('Logout failed:', error);
      });
}

3. 补全Django的CORS与CSRF信任配置

确保settings.py里的信任域名完全覆盖前端的访问地址,避免因域名不匹配被拦截:

# settings.py
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
    "http://127.0.0.1:5173",
    "http://localhost:5173",
]
CSRF_TRUSTED_ORIGINS = [
    "http://127.0.0.1:5173",
    "http://localhost:5173",
]

4. 给登出视图添加日志排查

如果以上配置调整后仍有问题,可以在Django的登出视图中添加日志,确认请求是否携带了有效Session:

# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from django.contrib.auth import logout
import logging

logger = logging.getLogger(__name__)

class LogoutView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        # 打印日志确认用户和Session状态
        logger.info(f"Logout request received - User: {request.user}, Session ID: {request.session.session_key}")
        if request.user.is_authenticated:
            logout(request)
            return Response({'message': 'Logged out successfully'})
        else:
            return Response({'detail': 'User not authenticated'}, status=403)

查看Django的控制台日志,就能判断是前端没发送Session Cookie,还是后端没识别到用户。

备注:内容来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 13:54:29