Python前后端分离项目中如何通过JSON传输富文本数据?

基于 Flask 和 Vue 的前后端分离页面,后端使用富文本编辑器后保存的包含富文本的数据如何通过 JSON 接口传输。

目前想到的方案:

  1. JSON 转义,前端在转义回去解析。=>感觉比较麻烦;
  2. 富文本编辑器换成 Markdown 语法。=>对于没接触 Markdown 的人来说不友好,而且 Markdown 语法中也涉及到特殊字符,也需要转义,还不如直接用富文本转义。

一个疑问:

  1. 学长之前和我讲 JS 对象保持习惯用单引号 '', Html 标记语言习惯用双引号 "", 这样就不会引起歧义了。可是 JSON 文件中不都是双引号 "":""; 的形式吗?

Python前后端分离项目中如何通过JSON传输富文本数据?

17 回复

不是很懂
你自己手动拼接的 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)

关键点:

  1. Content-Type:必须设置为application/json
  2. HTML特殊字符:JSON格式本身会处理双引号等字符的转义(如"变成\"),所以富文本中的HTML标签(如<p>)可以安全传输。
  3. 安全性:富文本内容在展示时要小心XSS攻击,后端存储时通常不需要转义(保持原始HTML),但在前端渲染时要根据框架使用安全的方式(如Vue的v-html,React的dangerouslySetInnerHTML)。
  4. 数据库存储:直接将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> 就行了。

回到顶部