使用AWS python lambda读取表单数据

时间:2018-09-07 08:27:34

标签: python-3.x aws-lambda

我想读取http发布请求的“ key”参数,但是它不起作用。

def my_handler(event, context):
    print(event)
    print(event['body'])
    print("key: " + event['key'])

    key = event['query']['key']

    encoded_string = str(key).encode("utf-8")
    # Create the file named for example "42.json" containing the appropriate data
    s3_path =  str(key) + '.json'
    s3 = boto3.resource("s3")
    s3.Bucket(BUCKET_NAME).put_object(Key=s3_path, Body=encoded_string)

    message = {
       'message': 'Created {}!'.format(key)  
    }
    return {
        'statusCode': 200,
        'headers': {'Content-Type': 'application/json'},
        'body': json.dumps(message)
    }

更新:如果我使用下面的代码,则可以在http帖子中读取JSON数据,但仍然无法读取表单数据。

def my_handler(event, context):
    print(event)
    print(event['body'])
   # print("key: " + event['key'])
    print("key  " + json.loads(event['body'])["key"])

    key = json.loads(event['body'])["key"]

    encoded_string = str(key).encode("utf-8")
    # Create the file named for example "42.json" containing the appropriate data
    s3_path =  str(key) + '.json'
    s3 = boto3.resource("s3")
    s3.Bucket(BUCKET_NAME).put_object(Key=s3_path, Body=encoded_string)

    message = {
       'message': 'Created {}!'.format(key)  
    }
    return {
        'statusCode': 200,
        'headers': {'Content-Type': 'application/json'},
        'body': json.dumps(message)
    }

2 个答案:

答案 0 :(得分:2)

enter image description here 1.我假设您正在使用API​​网关,那么值得使用Lambda代理集成,这在您对API网关的集成请求下。 aws docs

  1. 如果您使用此设置,则不需要进行任何映射。

答案 1 :(得分:1)

我也遇到了麻烦。我专门使用python3.7在AWS Lambda上工作。花了一天时间,但我想通了。

此代码将“ multipart / form-data”主体解析为称为form_data的字典。有两个注意事项:(a)此代码假设帖子正文和标题是utf-8编码的;这似乎是AWS API网关特有的,但是我没有尽一切努力来测试它是否适用于所有情况。 (b)因为形式可以的任何字段都有多个值,所以任何键的值都是一个列表。您在问有关从表单数据中检索“键”的问题。如果“键”只有一个值,那么您将引用form_data['key'][0]

import cgi

def handler(event, context):
    print(event)
    print(event['body'])

    fp = io.BytesIO(event['body'].encode('utf-8'))
    pdict = cgi.parse_header(event['headers']['Content-Type'])[1]
    if 'boundary' in pdict:
        pdict['boundary'] = pdict['boundary'].encode('utf-8')
    pdict['CONTENT-LENGTH'] = len(event['body'])
    form_data = cgi.parse_multipart(fp, pdict)
    print('form_data=', form_data)