Python Spyne 服务 - base64 字符串转义

0 投票
1 回答
1129 浏览
提问于 2025-04-17 18:46

我有一个简单的spyne服务:

class JiraAdapter(ServiceBase):
    @srpc(Unicode, String, Unicode, _returns=Status)
    def CreateJiraIssueWithBase64Attachment(summary, base64attachment, attachment_filename):
        status = Status
        try:
            newkey = jira_client.createWithBase64Attachment(summary, base64attachment, attachment_filename)
            status.Code = StatusCodes.IssueCreated
            status.Message = unicode(newkey)
        except Exception as e:
            status.Code = StatusCodes.InternalError
            status.Message = u'Internal Exception: %s' % e.message
        return status

问题是,有些程序会在生成的base64字符串中,每隔大约60个字符就插入一个'\n',这样会导致服务的方法接收到的字符串变成了转义字符('\\n'),这会让事情变得很奇怪。有没有什么设置可以避免这种情况呢?

1 个回答

0

首先,关于你发布的代码,有几点需要说明:

  1. 你必须实例化你的类型,也就是说要用 status = Status() 这种方式,而不是 status = Status。现在这样做的话,你是在给 Status 类设置属性。这不仅是错误的做法,还会因为没有正确的锁定而导致竞争条件,影响全局状态。

  2. Jira 有没有办法创建带有二进制数据的问题?你可以使用 ByteArray,它可以帮你处理 base64 编码和解码。需要注意的是,ByteArray 会被反序列化成一系列字符串。

  3. 你可以定义一个自定义的 base64 类型:

    Base64String = String(pattern='[0-9a-zA-Z/+=]+')
    

    ... 然后用它替代普通的 String,并加上验证,这样可以轻松拒绝无效的输入。

  4. 与其返回一个 "Status" 对象,不如什么都不返回,而是在需要的时候抛出异常(或者让原来的异常继续传递)。异常和普通对象一样也可以被序列化。不过这要看你希望你的 API 被怎样使用,这是你自己的决定。

现在回到你最初的问题:

你会同意,这里正确的做法是修复任何将 '\n'(即 0x0a)转义为 r"\n"(即 0x5c 0x6e)的地方。

不过如果你想处理这个问题,我觉得你评论中的解决方案(即 base64attachment = base64attachment.decode('string-escape'))是最好的选择。

希望这些对你有帮助。

祝好,

撰写回答