简体   繁体   English

Output 事件数据在 Python 3.6 AWS Lambda ZC1C425268E68385D1AB5074C14

[英]Output event data in Python 3.6 AWS Lambda function

I am trying to output an event called sheetID in a AWS Lambda Python function, but can't seem to get the syntax right. I am trying to output an event called sheetID in a AWS Lambda Python function, but can't seem to get the syntax right.

Here is a code snippet:这是一个代码片段:


def lambda_handler(event, context):
    scraper = Scraper()
    scraper.run()
    return { "Message": "Scrape function ran correctly!" }

class Scraper():
    def __init__(self):
        log.debug("Starting scraper...")
        scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
        credentials = sac.from_json_keyfile_name('src/h9d7246486f2.json', scope)

        log.debug("Authorizing gspread...")
        self.gc = gspread.authorize(credentials)
        self.spreadsheet = self.gc.open_by_key(event['sheetID'])
...

This is the line with the issue:这是问题所在:

self.spreadsheet = self.gc.open_by_key(event['sheetID'])

which previously had a static Google Sheet name以前有一个 static Google 表格名称

self.spreadsheet = self.gc.open("CorStats")

A test Lambda function works fine with event data, but not sure whether the format part can or should be used in the function above.测试 Lambda function 可以很好地处理事件数据,但不确定格式部分是否可以或应该在上面的 function 中使用。

def my_handler(event, context):
    message = 'Hello {} {}!'.format(event['key1'], 
                                    event['key3'])  
    return { 
        'message' : message
    }  

Here is the error log:这是错误日志:

{
  "errorMessage": "name 'event' is not defined",
  "errorType": "NameError",
  "stackTrace": [
    [
      "/var/task/src/scrape_lambda.py",
      18,
      "lambda_handler",
      "scraper = Scraper()"
    ],
    [
      "/var/task/src/scrape_lambda.py",
      30,
      "__init__",
      "self.spreadsheet = self.gc.open_by_key(event['sheetID'])"
    ]
  ]
}

You need include event in the __init__ method, eg def __init__(self, event): , then instantiate it with scraper = Scraper(event) .您需要在__init__方法中包含事件,例如def __init__(self, event): ,然后使用scraper = Scraper(event)实例化它。

It might be cleaner to do def __init__(self, sheet_id) , then do scraper = Scraper(event['sheetID')) and self.spreadsheet = self.gc.open_by_key(sheet_id) .执行def __init__(self, sheet_id)可能会更干净,然后执行scraper = Scraper(event['sheetID'))self.spreadsheet = self.gc.open_by_key(sheet_id) This way, you have uncoupled the Scraper class from the lambda event and can test it separately.这样,您就可以将Scraper class 与 lambda 事件分离,并可以单独对其进行测试。

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

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