Python前后端分离项目中如何通过JSON传输富文本数据?
基于 Flask 和 Vue 的前后端分离页面,后端使用富文本编辑器后保存的包含富文本的数据如何通过 JSON 接口传输。
目前想到的方案:
- JSON 转义,前端在转义回去解析。=>感觉比较麻烦;
- 富文本编辑器换成 Markdown 语法。=>对于没接触 Markdown 的人来说不友好,而且 Markdown 语法中也涉及到特殊字符,也需要转义,还不如直接用富文本转义。
一个疑问:
- 学长之前和我讲 JS 对象保持习惯用单引号 '', Html 标记语言习惯用双引号 "", 这样就不会引起歧义了。可是 JSON 文件中不都是双引号 "":""; 的形式吗?
Python前后端分离项目中如何通过JSON传输富文本数据?
不是很懂
你自己手动拼接的 json 吗? 那样才涉及你自己去转义吧?
在前后端分离项目中,通过JSON传输富文本数据,核心是处理好HTML内容的转义和编码。富文本(通常包含HTML标签)直接作为字符串放入JSON即可,但要注意特殊字符的处理。
前端(JavaScript)示例: 发送数据时,通常不需要特殊处理,富文本编辑器(如Quill、TinyMCE)的值本身就是字符串。
// 假设从富文本编辑器获取内容
let richTextContent = document.getElementById('editor').innerHTML;
// 或使用编辑器实例:quill.root.innerHTML
let dataToSend = {
title: "文章标题",
content: richTextContent, // 直接放入对象
author: "作者"
};
// 使用fetch发送POST请求
fetch('/api/save-article', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(dataToSend)
});
后端(Python Flask)示例: 接收时解析JSON,注意HTML内容可能包含引号等需要转义的字符,但JSON解析器会自动处理。
from flask import Flask, request, jsonify
import json
app = Flask(__name__)
@app.route('/api/save-article', methods=['POST'])
def save_article():
# 直接获取JSON数据
data = request.get_json()
# 提取富文本内容
title = data.get('title')
content = data.get('content') # 这里就是富文本HTML字符串
author = data.get('author')
# 示例:打印或存储到数据库
print(f"标题: {title}")
print(f"内容: {content[:100]}...") # 打印前100字符
print(f"作者: {author}")
# 这里可以将其存入数据库(如SQLAlchemy模型)
# article = Article(title=title, content=content, author=author)
# db.session.add(article)
# db.session.commit()
return jsonify({"status": "success", "message": "文章保存成功"})
if __name__ == '__main__':
app.run(debug=True)
关键点:
- Content-Type:必须设置为
application/json。 - HTML特殊字符:JSON格式本身会处理双引号等字符的转义(如
"变成\"),所以富文本中的HTML标签(如<p>)可以安全传输。 - 安全性:富文本内容在展示时要小心XSS攻击,后端存储时通常不需要转义(保持原始HTML),但在前端渲染时要根据框架使用安全的方式(如Vue的
v-html,React的dangerouslySetInnerHTML)。 - 数据库存储:直接将HTML字符串存入TEXT或LONGTEXT类型字段。
简单总结: 把富文本当普通字符串处理,JSON和HTTP协议会搞定编码和传输。
A1:JSON 是一种跨语言的协议,所以规范里规定 key 以及 string 都用双引号包围。以更好的兼容不同语言的解释器。
至于你的问题,应该是如何正确将 HTML 文档存到字符串中。可以参考这篇文章:
https://www.thorntech.com/2012/07/4-things-you-must-do-when-putting-html-in-json/
前端 vue 可以用 v-html 直接引用这个字符串即可。但还需要考虑安全问题,防止 XSS。
https://github.com/vuejs/vue/issues/6333
嗯?你的 json 是手拼的?我们 json 都会自动处理转义啊?
json 的转义不都是自的么。你手拼的话容易出错呀,还是让他自动转吧。
这时候可以用到“加密算法” base64 来解决你的烦恼
#3 还有这种操作吗?我试试。
富文本有多富?
一般空格换行直接 <pre> 梭哈就行了。
#4 不知道原来能自动转义,我一直以为 json 里传特殊符号会可能会引起歧义,一直都是没敢加。我试试吧。
#2 感谢您的理解,确实是这个意思。我试试。
{
html: “<div></div>”
}
#7 哈哈,没想到那么多,目前能想到的就是富文本里双引号、空格、换行
#5 高级的玩法,复盘的时候试试。
正常的 json 处理库都会自动转义的,不需要你自己操心
感觉要发明个三引号,引号不够用
js 处理可以 split 一下 \r \n 这种的,起码换行就搞定了
那就<pre> 就行了。

