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

Django集成TinyMCE图片上传遇CSRF缺失错误求助

解决Django集成TinyMCE图片上传时的CSRF令牌缺失问题

1. 修正images_upload_url配置

你当前设置的"static/images/images"是静态文件路径,并非有效的上传处理端点。django-tinymce自带图片上传视图,需将配置修改为:

"images_upload_url": "/tinymce/upload/",

该路径对应你已添加的tinymce.urls中的上传处理视图,无需额外新增URL规则。

2. 修复自定义上传处理器的CSRF令牌携带逻辑

你配置了自定义上传处理器tinymce_image_upload_handler,需在请求中手动携带CSRF令牌。打开admin/js/tinymce-upload.js,修改处理器函数:

function tinymce_image_upload_handler(blobInfo, progress) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.withCredentials = true;
    xhr.open('POST', tinymce.activeEditor.settings.images_upload_url);
    
    // 从Cookie中获取CSRF令牌并添加到请求头
    const csrfToken = Cookies.get('csrftoken');
    xhr.setRequestHeader('X-CSRFToken', csrfToken);
    
    xhr.upload.onprogress = (e) => {
      progress(e.loaded / e.total * 100);
    };
    
    xhr.onload = () => {
      if (xhr.status === 403) {
        reject('上传被拒绝:CSRF令牌无效或缺失');
        return;
      }
      if (xhr.status < 200 || xhr.status >= 300) {
        reject('HTTP错误:' + xhr.status);
        return;
      }
      
      const json = JSON.parse(xhr.responseText);
      if (!json || typeof json.location !== 'string') {
        reject('无效的上传响应:' + xhr.responseText);
        return;
      }
      
      resolve(json.location);
    };
    
    xhr.onerror = () => {
      reject('网络错误,无法完成上传');
    };
    
    const formData = new FormData();
    formData.append('file', blobInfo.blob(), blobInfo.filename());
    
    xhr.send(formData);
  });
}

此代码利用你引入的js-cookie库获取CSRF令牌,确保请求符合Django的CSRF验证规则。

3. 验证CSRF中间件与生产环境配置

  • 本地和生产环境均需确保django.middleware.csrf.CsrfViewMiddleware在settings.py的MIDDLEWARE列表中(默认已启用)。
  • Ubuntu + Nginx生产环境下,需在Nginx的server配置块中添加以下规则,保证请求头正常传递:
location / {
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass http://your_uwsgi_or_gunicorn_address;
}

4. 生产环境媒体文件配置

生产环境需正确配置媒体文件存储与访问:

  • 在settings.py中设置:
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
  • 在Nginx中添加媒体文件访问规则:
location /media/ {
    alias /path/to/your/project/media/;
}

django-tinymce默认将上传图片存储在MEDIA_ROOT/tinymce/目录下,访问路径为MEDIA_URL/tinymce/xxx.jpg。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:30:51