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

Django后台用CKEditor传图时出现CSRF令牌缺失禁止访问问题

解决Django Admin中CKEditor上传图片的CSRF Token缺失问题

你的问题出在错误地将csrf_exempt应用到了前端视图上,而CKEditor的上传请求是直接调用/ckeditorupload/接口,这个接口属于ckeditor_uploader模块,和你写的PostList视图无关。移除CSRF中间件不仅不安全,还会导致Django Admin本身的功能异常。下面是正确的解决步骤:

1. 检查CKEditor Uploader的基础配置

确保你的项目中已经正确配置了ckeditor_uploader:

  • 在settings.py中,INSTALLED_APPS包含ckeditor和ckeditor_uploader
  • 配置上传路径:
    CKEDITOR_UPLOAD_PATH = "uploads/"
    
  • 在项目根urls.py中添加CKEditor的上传路由:
    urlpatterns = [
        # 其他路由...
        path('ckeditor/', include('ckeditor_uploader.urls')),
    ]
    

2. 配置CKEditor携带CSRF Token

CKEditor的异步上传请求需要手动携带CSRF Token,你可以通过修改CKEditor的配置文件实现:

  1. 在项目的static/ckeditor/目录下创建或修改config.js文件(如果没有该目录,先运行python manage.py collectstatic命令生成)
  2. 添加以下代码:
CKEDITOR.editorConfig = function( config ) {
    // 保留原有配置,新增上传相关设置
    config.filebrowserUploadUrl = '/ckeditor/upload/';
    config.filebrowserUploadMethod = 'form';
    
    // 让上传请求携带CSRF Token
    config.headers = {
        'X-CSRFToken': getCookie('csrftoken')
    };
};

// 获取CSRF Token的辅助函数
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;
}

Django Admin默认会在页面中设置CSRF Cookie,你可以在浏览器开发者工具的Application标签下查看csrftoken是否存在。如果不存在,检查你的MIDDLEWARE中是否保留了django.middleware.csrf.CsrfViewMiddleware(不要移除这个中间件)。

4. 不要滥用csrf_exempt

你之前给PostList添加csrf_exempt完全是无效操作,因为这个视图和CKEditor的上传接口没有任何关联。永远不要给Admin相关的接口豁免CSRF校验,这会带来严重的安全风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 05:24:07