Jay*_*oot 4 python json amazon-s3 binary-data flask
我的设置是基于Flask的服务器。该项目的鸟瞰图是:基于Flask的服务器基于一些算法计算(例如找出要从S3提取的文件名)从AWS S3提取二进制数据,并将数据提供给HTML + JavaScript客户端。
起初,我认为JSON对象是最好的响应类型。我创建了以下格式的JSON响应(可能在语法上不正确):
{
'payload': [
{
'symbol': 'sym',
'exchange': 'exch',
'headerfile': {
'name': '#name',
'content': '#binarycontent'
},
'datafiles': [
{
'name': '#name',
'content': '#binarycontent'
},
{
'name': '#name',
'content': '#binarycontent'
}
]
},
'errors': [ //errors ]
}
Run Code Online (Sandbox Code Playgroud)
对于JSON中的任何语法错误,我深表歉意。我有点想找出一个小错误。在构造了此JSON之后,我知道JSON本身并不支持二进制数据。因此,我将无法将二进制数据作为值嵌入JSON中。
我意识到,我始终可以将字节转换为base64编码的字符串,并将该字符串用作JSON中的值。但是,结果字符串的大小要多出30%左右。4010字节的数据被编码为5348字节,虽然对于单个二进制块来说微不足道,但是当我将大量此类二进制块嵌入JSON响应时,我的客户将其视为一个问题。由于尺寸较大,响应需要更多时间才能到达客户,这是我客户的应用程序的关键问题。
我考虑的另一种选择是将二进制块流式传输octet-stream Content-Type到客户端。但是我不确定它是否比上述解决方案更好。此外,在这种情况下,我还无法弄清楚如何关联二进制块及其名称。
有没有比“将二进制文件转换为文本并嵌入JSON”更好的解决方案?
我解决了这个问题,并将写下解决方案,希望它可以节省别人的时间。
谢谢@dstromberg和@LukasGraf的建议。我首先检查了BSON,发现它足以满足我的需求,所以从没有详细介绍Procotol Buffer。
PyPi上的BSON可分为两个软件包。在pymongo中,它是对MongoDB的补充。在bson中,它是一个独立的软件包,显然适合我的需求。但是,它仅支持Python2。因此,在推出自己的端口之前,我环顾了Python3的实现,并在bsonspec.org上找到了BSON规范的另一种实现:链接至模块。
该模块的最简单用法如下:
>>> import bson
warning: module typecheck.py cannot be imported, type checking is skipped
>>> encoded = bson.serialize_to_bytes({'name': 'chunkfile', 'content': b'\xad\x03\xae\x03\xac\x03\xac\x03\xd4\x13'})
>>> print(encoded)
b'1\x00\x00\x00\x02name\x00\n\x00\x00\x00chunkfile\x00\x05content\x00\n\x00\x00\x00\x00\xad\x03\xae\x03\xac\x03\xac\x03\xd4\x13\x00'
>>> decoded = bson.parse_bytes(encoded)
>>> print(decoded)
OrderedDict([('name', 'chunkfile'), ('content', b'\xad\x03\xae\x03\xac\x03\xac\x03\xd4\x13')])
Run Code Online (Sandbox Code Playgroud)
如您所见,它也可以容纳二进制数据。我从Flask以形式发送了数据,mimetype=application/bson使用MongoDB团队提供的独立BSON库,接收JavaScript对其进行了精确解析。
| 归档时间: |
|
| 查看次数: |
1937 次 |
| 最近记录: |