我正在尝试编写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()返回的结果)导致相同的错误。