应迁移到 django-ckeditor-5:因 ckeditor 4 已终止支持且存在未修复漏洞,django-ckeditor(v6.x)触发安全警告 w001;django-ckeditor-5 基于 ckeditor 5 community edition,开源免费、深度适配 django 4.2+,支持零配置快速接入与图片上传。

用 django-ckeditor 快速集成富文本编辑器(Django 场景)
直接上 django-ckeditor 是 Django 项目里最省心的选择,它把编辑器渲染、表单绑定、模型字段封装全包了,不用自己拼 HTML + JS 初始化。
安装后在 settings.py 中注册应用和配置:
INSTALLED_APPS = [
# ...
'ckeditor',
'ckeditor_uploader', # 注意:带上传支持的版本
]
<p>CKEDITOR_CONFIGS = {
'default': {
'toolbar': 'full',
'height': 300,
'image_upload_url': '/ckeditor/upload/', # 后端上传接口路径
},
}</p>
模型中用 RichTextUploadingField 替代普通 TextField,它会自动处理图片上传逻辑:
from ckeditor_uploader.fields import RichTextUploadingField <p>class Article(models.Model): content = RichTextUploadingField()</p>
关键点:必须同时引入 ckeditor 和 ckeditor_uploader,只装前者不支持图片上传;RichTextUploadingField 才会触发上传流程,RichTextField 不会。
处理图片上传路径与权限(CKEDITOR_UPLOAD_PATH 和静态配置)
默认情况下,django-ckeditor 把上传的图片存到 media/ckeditor/ 下,但容易出两个问题:访问 404、生产环境无法直接读取。
-
CKEDITOR_UPLOAD_PATH必须是相对于MEDIA_ROOT的路径,比如设为'uploads/',最终文件落在MEDIA_ROOT/uploads/xxx.jpg - Django 开发时要显式配置
urls.py暴露MEDIA_URL路径:urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) - 生产环境别依赖 Django serve 静态文件,Nginx/Apache 要配好
location /media/指向真实磁盘路径 - 上传目录需有写权限(Linux 下常见
chmod 755 media/或更细粒度控制)
前端图片上传失败的典型错误及排查
点击上传按钮没反应、控制台报 403/404/500、编辑器里显示 “Upload failed” —— 这些基本都卡在请求链路上。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 403:CSRF 未通过。确保表单包含
{% csrf_token %},且CKEDITOR_CONFIGS中未禁用csrf_token(默认开启) - 404:URL 路由没配对。检查
urls.py是否引入了ckeditor_uploader.urls:path('ckeditor/', include('ckeditor_uploader.urls')) - 500:上传目录不可写,或 PIL/Pillow 缺失(缩略图处理失败)。运行
python -c "from PIL import Image"确认 Pillow 已安装 - 上传成功但编辑器不显示:检查返回 JSON 格式是否符合预期(必须含
url字段,值为可访问的绝对或相对 URL)
Flask 或 FastAPI 项目怎么搞?别硬套 Django 方案
没有现成的 ckeditor_uploader,就得自己接上传接口。核心就两件事:前端配置上传 URL,后端提供接收并返回标准响应。
以 CKEditor 5 为例,前端初始化时指定上传适配器:
ClassicEditor
.create(document.querySelector('#editor'), {
simpleUpload: {
uploadUrl: '/api/upload-image/',
headers: { 'X-CSRFToken': getCookie('csrftoken') } // Flask/FastAPI 可改用 token header 或 query 参数
}
})
后端只需一个接收 multipart/form-data 的接口,保存文件并返回:
{ "url": "/media/uploads/abc.png" }
注意点:
- 路径必须能被 Web 服务器直接访问(即走静态文件服务,不是 Python view 返回)
- FastAPI 用
File(...)接收,Flask 用request.files.get('upload') - 别忘了校验文件类型(
content-type和后缀)、限制大小(如10 * 1024 * 1024),否则容易被上传恶意文件
富文本图片上传真正的复杂点不在编辑器本身,而在于上传路径的动静分离、权限控制、CDN 兼容和 XSS 过滤 —— 这些往往上线后才暴露,开发阶段容易忽略。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










