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的配置文件实现:
- 在项目的
static/ckeditor/目录下创建或修改config.js文件(如果没有该目录,先运行python manage.py collectstatic命令生成) - 添加以下代码:
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; }
3. 验证Admin页面的CSRF Cookie
Django Admin默认会在页面中设置CSRF Cookie,你可以在浏览器开发者工具的Application标签下查看csrftoken是否存在。如果不存在,检查你的MIDDLEWARE中是否保留了django.middleware.csrf.CsrfViewMiddleware(不要移除这个中间件)。
4. 不要滥用csrf_exempt
你之前给PostList添加csrf_exempt完全是无效操作,因为这个视图和CKEditor的上传接口没有任何关联。永远不要给Admin相关的接口豁免CSRF校验,这会带来严重的安全风险。
内容的提问来源于stack exchange,提问作者Yarzooo
相关产品推荐
相关产品推荐

