从 S3 检索 Alexa json

问题描述 投票:0回答:1

因此,我正在使用 Alexa 的自定义部署模板。我刚刚开始使用 Alexa 进行编码,但我有 Python 经验。

我只是在玩弄提供的样板代码。我正在以 helloworld 意图进行测试,只是为了掌握一些东西。我搜索并查看了 Alexa 教程,但它们更多的是图像和声音。我正在专门研究静态数据。由于它是静态的,我不想使用 dynamoDB。我可能还有其他用途,为了保持免费套餐,我将保留有限的 dynamoDB 分配供以后使用。

因此,使用此代码,我在加载测试 JSON 时不会遇到任何错误。

class HelloWorldIntentHandler(AbstractRequestHandler):
    """Handler for Hello World Intent."""
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return ask_utils.is_intent_name("HelloWorldIntent")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        json_url = create_presigned_url("Media/json_data/test.json")
        test_raw_data = requests.get(json_url).content
        test_json_data = json.loads(test_raw_data)
        print(test_json_data)
        speak_output = "Hello World"

        return (
            handler_input.response_builder
                .speak(speak_output)
                # .ask("add a reprompt if you want to keep the session open for the user to respond")
                .response
        )

我在

cloudwatch
日志中收到以下内容。

{'test1': 'test one output', 'test2': 'test two output', 'test3': [{'test4': 'test four output', 'test44': 'test fourty four output', 'test444': 'test four hundred and forty four output'}]}

如果我尝试用打印引用数据(

test_json_data.test1
)。我从 Alex 那里收到了抱歉的消息,并在
cloudwatch
中收到了以下 Python 回溯。

AttributeError: 'dict' object has no attribute 'test1'

所以,这对我来说,它实际上是一个字符串,而不是一个 JSON,可能是由于编码原因,但为什么在 JSON 加载时不会出现错误?预签名的样板代码是:

def create_presigned_url(object_name):
    """Generate a presigned URL to share an S3 object with a capped expiration of 60 seconds

    :param object_name: string
    :return: Presigned URL as string. If error, returns None.
    """
    s3_client = boto3.client('s3',
                             region_name=os.environ.get('S3_PERSISTENCE_REGION'),
                             config=boto3.session.Config(signature_version='s3v4',s3={'addressing_style': 'path'}))
    try:
        bucket_name = os.environ.get('S3_PERSISTENCE_BUCKET')
        response = s3_client.generate_presigned_url('get_object',
                                                    Params={'Bucket': bucket_name,
                                                            'Key': object_name},
                                                    ExpiresIn=60*1)
    except ClientError as e:
        logging.error(e)
        return None

    # The response contains the presigned URL
    return response
python amazon-web-services amazon-s3 alexa-skills-kit
1个回答
0
投票

我是个白痴,有一段时间一直在编写其他东西,却忘记了 python 是如何工作的。没有点符号。

© www.soinside.com 2019 - 2024. All rights reserved.