Python Spyne 服务 - base64 字符串转义
我有一个简单的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
首先,关于你发布的代码,有几点需要说明:
你必须实例化你的类型,也就是说要用
status = Status()
这种方式,而不是status = Status
。现在这样做的话,你是在给Status
类设置属性。这不仅是错误的做法,还会因为没有正确的锁定而导致竞争条件,影响全局状态。Jira 有没有办法创建带有二进制数据的问题?你可以使用
ByteArray
,它可以帮你处理 base64 编码和解码。需要注意的是,ByteArray
会被反序列化成一系列字符串。你可以定义一个自定义的 base64 类型:
Base64String = String(pattern='[0-9a-zA-Z/+=]+')
... 然后用它替代普通的
String
,并加上验证,这样可以轻松拒绝无效的输入。与其返回一个 "Status" 对象,不如什么都不返回,而是在需要的时候抛出异常(或者让原来的异常继续传递)。异常和普通对象一样也可以被序列化。不过这要看你希望你的 API 被怎样使用,这是你自己的决定。
现在回到你最初的问题:
你会同意,这里正确的做法是修复任何将 '\n'(即 0x0a)转义为 r"\n"(即 0x5c 0x6e)的地方。
不过如果你想处理这个问题,我觉得你评论中的解决方案(即 base64attachment = base64attachment.decode('string-escape')
)是最好的选择。
希望这些对你有帮助。
祝好,