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

Confluence API换行保留问题:Python上传YAML内容无换行

问题分析与解决方案

让我们一步步拆解你遇到的问题,以及对应的修正方案:

核心错误点

1. YAML输出为字节串而非字符串

你调用yaml.safe_dump时指定了encoding='utf-8',这会让方法返回字节对象(bytes),而Confluence的update_or_create接口要求body参数是字符串类型。这种类型不匹配会导致Confluence无法正确解析内容,进而出现无换行的异常显示。

2. 错误使用pprint.pprint

pprint.pprint的作用是将内容打印到控制台,它没有返回值(默认返回None)。当你把它的结果赋值给confluence_data时,实际上是把None传给了页面body,自然会导致页面为空。如果要生成带换行的格式化字符串,应该用pprint.pformat,它会返回格式化后的字符串。

3. 未适配Confluence的Storage格式

Confluence的storage表示法基于HTML,普通文本的换行和缩进会被自动忽略。如果直接传入YAML字符串,Confluence会把所有内容压缩成一行显示,必须用HTML标签来保留格式。


修正后的完整代码

import yaml
from atlassian import Confluence
import pprint

# 你的原始数据
source_data = {'associations': [{'host1': ['v1','v2']}, {'host2': ['v2,v3']}, {'host3': ['v1', 'v7']}]}

# 方案1:生成带格式的YAML字符串(推荐)
# 去掉encoding参数,直接得到字符串;sort_keys=False保留原字典顺序
yaml_content = yaml.safe_dump(source_data['associations'], allow_unicode=True, sort_keys=False)

# 方案2:如果想用pprint格式化(可选)
# yaml_content = pprint.pformat(source_data['associations'], width=1)

# 用<pre>标签包裹YAML内容,让Confluence保留原始格式
confluence_body = f"<pre>{yaml_content}</pre>"

# 初始化Confluence客户端
confluence = Confluence(
    url='https://confluence-url',
    username='user',
    password='password'
)

# 更新或创建页面(注意representation参数不要有空格)
status = confluence.update_or_create(
    parent_id=someid,
    title='Test page',
    body=confluence_body,
    representation='storage'
)

关键说明

  • <pre>标签是核心:它会告诉Confluence保留文本的所有换行、缩进和空格,完美适配YAML的格式要求。
  • 确保body是字符串:如果一定要用encoding='utf-8',记得加上.decode('utf-8')把字节串转成字符串,比如yaml.safe_dump(...).decode('utf-8')。
  • sort_keys=False:可选参数,用来保留原始字典的键顺序,避免YAML输出自动排序host1/host2/host3。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:32:38