在webob中返回二进制数据。响应导致TypeError(repr(o)+ \“不是JSON可序列化的”“)”

时间:2019-08-09 01:00:07

标签: json http serialization webob

我正在尝试编写aws lambda函数以在webob.response.Response中返回二进制文件,但会收到错误

  

响应的JSON序列化期间发生错误:无法JSON序列化.....

     

回溯(最近通话最近):   在转储** kw).encode(obj)

中,文件“ /var/lang/lib/python3.6/json/init.py”,第238行      

文件“ /var/lang/lib/python3.6/json/encoder.py”,第199行,编码块= self.iterencode(o,_one_shot = True)

     

文件“ /var/lang/lib/python3.6/json/encoder.py”,第257行,以iterencode返回_iterencode(o,0)

     

文件“ /var/runtime/awslambda/bootstrap.py”,第134行,在decimal_serializer中引发TypeError(repr(o)+“不是JSON可序列化的”)

     

TypeError:不可JSON序列化

我遵循示例here

(出于某些原因,我不能在正文中使用S3前置url而不是二进制blob。)

class FileIterable(object):
    def __init__(self, dataObj):
        self.filename = dataObj

    def __iter__(self):
        return FileIterator(self.filename)

class FileIterator(object):
    chunk_size = 4096
    def __init__(self, fn):
        self.filename = fn
        self.filename_obj = open(self.filename, 'rb')

    def __iter__(self):
        return self

    def next(self):
        chunk = self.filename_obj.read(self.chunk_size)
        if not chunk:
            raise StopIteration
        return chunk
    __next__ = next 

def make_response(payload_len, payload):
    headerlist = [('Content-Type', 'application/octet-stream')]
    resp = Response(headerlist=headerlist, app_iter=FileIterable(payload))
    #resp.app_iter = FileIterable(payload)
    #resp.content_length = payload_len
    return resp


def lambda_handler(event, context):
    s3 = boto3.client('s3')

    bucket = 'my-bucket'
    key = 'my-binary-file.bin'       

    try:
        data = s3.get_object(Bucket=bucket, Key=key)
        filename = data['Body'].read()

        return make_response(data['ContentLength'], filename)
     ...

使用二进制/八位字节流(这是S3.get_object()返回的结果)导致相同的错误。

0 个答案:

没有答案