问题描述
我正在开发一个应用程序,它加密/解密来自 S3 > Python/Django 应用程序 > 客户端的连续流中的非常大的文件。我正在尝试捕获在生成器函数中抛出的异常,并以错误方式响应客户端。 (例如“您提供的 AWS KMS 密钥对 xxxx 无效”)。我可以在生成器中记录错误,但我无法将其冒泡,以便将错误返回给客户端。理想情况下,我想向 @handle_exception
装饰器提出异常,但对处理函数中异常的解决方案感到满意。
这里有人能指出我正确的方向吗?到目前为止,我发现的解决方案没有无缝流的特定用例,而且很遗憾无法正常工作。谢谢!!
@handle_exception
@require_http_methods(["POST"])
def decrypt(request):
def generate(decryptor):
try:
for chunk in decryptor:
yield chunk
except Exception as e:
LOGGER.info(f"GENERATOR EXCEPTION CAN BE LOGGED HERE: {e}")
raise e
finally:
if decryptor:
decryptor.close()
try:
request_data = json.loads(request.body)
validate(instance=request_data,schema=constant.DECRYPT_SCHEMA)
s3 = boto3.client("s3",region_name=request_data["region"])
obj = s3.get_object(Bucket=request_data["bucket"],Key=request_data["key"])
set_socket_timeout(obj)
if request_data.get("decrypt",True):
encryptionClient = aws_encryption_sdk.EncryptionSDKClient(
commitment_policy=CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT
)
kms_key_provider = aws_encryption_sdk.StrictAwsKmsMasterKeyProvider(
key_ids=request_data["kmsKeys"]
)
return StreamingHttpResponse(
generate(
encryptionClient.stream(
mode="d",source=obj["Body"],key_provider=kms_key_provider,)
),reason="successfully downloaded encrypted file",)
except Exception as e:
LOGGER.info(f"NEED TO CATCH GENERATOR/STREAM EXCEPTION HERE: {e}")
raise
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)