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

Flask集成CKEditor:模板语法内容在编辑框被渲染而非原样显示的问题排查与解决咨询

问题成因

我之前也踩过这个坑!当你用Flask的render_template渲染页面时,它会优先扫描并解析所有{{ ... }}格式的模板语法——不管这些语法是出现在页面的普通文本里,还是藏在CKEditor的value参数中。这就导致你存储的文档内容里的{{ *** }}会被Jinja2当作模板变量去查找替换:如果找不到对应的变量,就会被替换成空字符串;如果有同名变量,就会被替换成变量的值,自然没法原样显示在CKEditor编辑框里。

而你尝试的|safe过滤器,只是告诉Flask“这段内容是安全的,不要转义HTML标签”,但它完全不会阻止Jinja2解析模板变量语法,所以这个方案解决不了你的问题。

解决方案

这里有两种可靠的解决方法,你可以根据场景选择:

方法1:在Python代码中转义模板语法字符

在把内容传递给模板之前,手动将内容里的{{和}}替换成对应的HTML实体({{和}})。这样render_template就不会把它们当作模板语法,而是当成普通文本传递给CKEditor,CKEditor会自动把实体转回原本的符号显示。

示例代码:

from flask import render_template

@app.route('/edit/<int:doc_id>')
def edit_doc(doc_id):
    # 假设从数据库获取到原始文档内容
    content = get_document_from_db(doc_id)
    # 转义模板语法中的大括号
    escaped_content = content.replace('{{', '&#123;&#123;').replace('}}', '&#125;&#125;')
    return render_template('edit.html', content=escaped_content)

然后模板里正常调用CKEditor即可:

<form method="POST">
    {{ ckeditor.create(value=content) }}
    <input type="submit" name="submit">
</form>

方法2:自定义Jinja2过滤器(更简洁)

如果需要多次处理这类内容,推荐自定义一个Jinja2过滤器,专门用来转义模板语法字符,这样不用每次都在视图函数里手动替换:

首先在Flask应用中注册过滤器:

from flask import Flask

app = Flask(__name__)

@app.template_filter('escape_jinja')
def escape_jinja_filter(content):
    return content.replace('{{', '&#123;&#123;').replace('}}', '&#125;&#125;')

然后在模板中直接使用这个过滤器:

<form method="POST">
    {{ ckeditor.create(value=content|escape_jinja) }}
    <input type="submit" name="submit">
</form>
额外说明

当你提交CKEditor的内容时,这些HTML实体会被自动转成原始的{{和}},所以你保存到数据库的内容还是最初的模板语法,不需要额外做反向转义——CKEditor已经帮你处理好了这件事。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:54:58