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
相关产品推荐
相关产品推荐

