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

如何延长Django CSRF令牌有效期?设置SESSION_COOKIE_AGE无效

解决Django CSRF令牌超时问题

你修改SESSION_COOKIE_AGE无效的核心原因是:CSRF令牌的有效期由**CSRF_COOKIE_AGE**单独控制,与会话cookie的有效期是两个独立的配置项。Django默认的CSRF_COOKIE_AGE为3600秒(1小时),这就是页面闲置数小时后提交表单触发403错误的直接原因。

正确配置方法

在settings.py中添加或修改以下配置,将CSRF cookie的有效期延长至目标时长(例如7天):

CSRF_COOKIE_AGE = 604800  # 7天,单位为秒

额外注意事项

  • 确认django.middleware.csrf.CsrfViewMiddleware中间件已在你的MIDDLEWARE列表中启用,这是CSRF保护机制生效的基础。
  • 如果页面存在静态缓存(如CDN缓存),缓存页面会包含过期的CSRF令牌,此时需要在表单提交前通过JavaScript动态获取最新令牌:
    // 获取最新CSRF令牌的示例(适配Django默认cookie规则)
    function getCookie(name) {
        let cookieValue = null;
        if (document.cookie && document.cookie !== '') {
            const cookies = document.cookie.split(';');
            for (let i = 0; i < cookies.length; i++) {
                const cookie = cookies[i].trim();
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    const csrftoken = getCookie('csrftoken');
    // 提交表单时携带该最新令牌
    
  • 检查浏览器隐私设置,确保未开启自动清除该站点cookie的规则,否则即使后端设置了长期有效期,浏览器也可能提前删除CSRF cookie。

内容的提问来源于stack exchange,提问作者ar2015

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 05:42:08