简体   繁体   English

从 Python Lambda 中的 POST 请求中提取参数

[英]Extracting Parameters from POST Request in Python Lambda

Context: I'm trying to make a POST request to a AWS lambda function written in python from JavaScript.上下文:我正在尝试向 AWS lambda function 发出一个 POST 请求,该请求用 python 从 Z68636995AF75A60EDA0EF75A60EDA0 I will then enter the information in the POST request into a Database.然后,我会将 POST 请求中的信息输入到数据库中。

Problem: I can't seem to figure out how to get the information out of the POST request.问题:我似乎无法弄清楚如何从 POST 请求中获取信息。 and store it into variables.并将其存储到变量中。

I've tried to use the event['Username'] which in the testing simulation provided by AWS works although in practice doesn't.我尝试使用在 AWS 提供的测试模拟中有效的 event['Username'],尽管实际上并没有。

<form method="POST" action="https://fake.execute-api.us-east-1.amazonaws.com/Prod/RegisterUser">
            <label for="Username">Username:</label><br>
            <input type="text" id="Username" name="Username" value=""><br>
            <label for="password">Password:</label><br>
            <input type="text" id="Password" name="Password" value=""><br><br>
            <input type="submit" id="submit" value="Submit" >
    </form> 
POST /Prod/RegisterUser HTTP/1.1
Host: fake.execute-api.us-east-1.amazonaws.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 24
Connection: close
Upgrade-Insecure-Requests: 1

Username=jat&Password=sa
import pymysql
import json

#endpoint = 'fake.us-east-1.rds.amazonaws.com'
#username = 'admin'
#password = 'admin'
#database_name = 'fake'

#connection
#connection = pymysql.connect(endpoint, user=username, passwd=password, db=database_name)

def lambda_handler(event, context):

   user =  event['Username']
   password = event['Password']
   
   return {
      "Username": user,
      "Password":password
   }

Your HTTP body will come through lambda as event['body'] .您的 HTTP 主体将通过 lambda 作为event['body']

Also, I think you'll need to parse the JSON string of the body, using json.loads .另外,我认为您需要使用json.loads解析正文的 JSON 字符串。

Lastly, I saw your HTML is doing a GET method, you might want to fix that:最后,我看到您的 HTML 正在执行GET方法,您可能需要解决该问题:

<form method="POST" action="https://fake.execute-api.us-east-1.amazonaws.com/Prod/RegisterUser">

Serverless is a great resource for lambda functions.无服务器是 lambda 功能的绝佳资源。 Here's an example of theirs that might apply to your case:以下是他们可能适用于您的案例的示例:

https://github.com/serverless/examples/blob/master/aws-python-rest-api-with-dynamodb/todos/create.py https://github.com/serverless/examples/blob/master/aws-python-rest-api-with-dynamodb/todos/create.py

SOLVED:解决了:

I found that posting directly to the AWS Lambda wasn't working because of the string format.我发现由于字符串格式,直接发布到 AWS Lambda 不起作用。 The AWS Lambda requires JSON format with use of JSON.stringify(). AWS Lambda 需要使用 JSON.stringify() 的 JSON 格式。

        <form onsubmit="submitData();return false;">
            <label for="Username">Username:</label><br>
            <input type="text" id="Username" name="Username" value=""><br>
            <label for="password">Password:</label><br>
            <input type="text" id="Password" name="Password" value=""><br><br>
            <input type="submit" id="submit" value="Submit" >
        </form>
            function submitData() {
                var user = document.getElementById("Username").value
                var pass = document.getElementById("Password").value
                var json = { Username: user, Password: pass };
                $.ajax({
                    type: "POST",
                    url: "https://fake.execute-api.us-east-1.amazonaws.com/Prod/RegisterUser",
                    data: JSON.stringify(json),
                    beforeSend: function() { 
                        console.log("Before");
                        $("#submit").attr('disabled', true);
                    },
                    success: function(response){ 
                        console.log(response);
                        $("#submit").attr('disabled', false);
                    }
                });
            }
import pymysql
import json

def lambda_handler(event, context):
   resp = event
   return {
      "Username:": resp["Username"],
      "Password": resp["Password"]
   }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM