在从 S3 到客户端Django 应用程序的连续流中的 Python 生成器函数中的异常处理

问题描述

我正在开发一个应用程序,它加密/解密来自 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 (将#修改为@)