发送二进制数据响应的最有效方式(时间和空间)

2024-04-27 02:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我的设置是一个基于烧瓶的服务器。该项目的总体情况是:基于Flask的服务器根据一些算法计算从aws3获取二进制数据(比如找出要从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 ]
}

对于JSON中的任何语法错误,我深表歉意;我有点想找出一个小错误。 在构造了这个JSON之后,我知道JSON本身并不支持其中的二进制数据。因此,我不能将二进制数据作为值嵌入到JSON中。在

我意识到我总是可以将字节转换成base64编码的字符串,并在JSON中使用该字符串作为值。但是,结果字符串的大小大约增加了30%;4010个字节的数据被编码成5348个字节,虽然这对于单个二进制块来说无关紧要,但在JSON响应中嵌入大量这样的二进制块时,我的客户认为这是一个问题。由于额外的大小,响应需要更多的时间到达客户机,这是我的客户机应用程序的一个关键问题。在

我考虑的另一个选择是将二进制块作为octet-stream Content-Type流式传输给客户机。但我不确定它是否比上述解决方案更好。而且,在这种情况下,我还不知道如何将二进制块和它们的名称联系起来。在

有没有比“将二进制转换为文本并嵌入JSON”更好的解决方案?在


Tags: 数据字符串name服务器json编码客户机字节
1条回答
网友
1楼 · 发布于 2024-04-27 02:22:15

我解决了这个问题,并会写下解决方案,希望它能节省别人的时间。在

谢谢你,@dstromberg和@LukasGraf提供的建议。我首先检查了BSON,发现它足以满足我的需求,所以从未深入研究Procotol Buffer的细节。在

PyPi上的BSON分为两个包。在pymongo中,它是对MongoDB的补充。在bson中,它是一个独立的包,显然适合我的需要。但是,它只支持Python2。 因此,在推出我自己的端口之前,我四处寻找Python3实现,并在bsonspec.org:Link to the module上找到了另一个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')])

如您所见,它也可以容纳二进制数据。 我以mimetype=application/bson的形式从Flask发送数据,接收的JavaScript使用MongoDB团队提供的this standalone BSON library对其进行精确解析。在

相关问题 更多 >