python 中 AWS Lambda 的请求模块问题
Issue with requests module in python for AWS Lambda
我正在编写一个 lambda 函数,目的是使用请求从 Wolfram CloudObject 中提取信息。这是代码的相关部分:
from __future__ import print_function
import requests
.
.
.
def on_intent(intent_request, session):
print("on_intent requestID=" + intent_request['requestID'] + ", sessionID=" + session['sessionId'])
intent = intent_request['intent']
intent_name = intent_request['intent']['name']
# Dispatch to skill's intent handlers
if intent_name == "GetEvent":
return call_wolfram(intent, session)
elif intent_name == "AMAZON.HelpIntent":
return get_welcome_response()
elif intent_name == "AMAZON.CancelIntent" or intent_name == "AMAZON.StopIntent":
return handle_session_end_request()
else:
raise ValueError("Invalid intent")
.
.
.
# Functions that control skill's behavior
def call_wolfram(intent, session):
url = "https://path-to-cloud-object"
query = {'string1': 'VESSEL', 'string2': 'EVENT', 'RelString': 'TRIGGERED'}
r = requests.get(url, params=query)
session_attributes = {"r_result": r}
speech_output = "Congrats, dummy! It worked"
card_title = "Query"
should_end_session = True
return build_response({}, build_speechlet_response(card_title, speech_output, None, should_end_session)
其余大部分代码遵循 AWS 提供的 MyColorIs
示例模板,并进行了极小的改动。测试lambda函数时,报错信息给了我一个json file with stackTrace;我已将问题缩小到代码行 r = requests.get()
和 session_attributes = {}
,因为当注释掉时,lambda 执行成功。这是我使用 python 的第一个项目,所以我也是这门语言的新手。为了更好地衡量,这是我在 lambda 执行后收到的错误消息:
{
"stackTrace": [
[
"/var/task/query_lambda.py",
27,
"lambda_handler",
"return on_intent(event['request'], event['session'])"
],
[
"/var/task/query_lambda.py",
65,
"on_intent",
"return call_wolfram(intent, session)"
],
[
"/var/task/query_lambda.py",
113,
"call_wolfram",
"r = requests.get(url, params=query)"
],
[
"/var/task/requests/api.py",
71,
"get",
"return request('get', url, params=params, **kwargs)"
],
[
"/var/task/requests/api.py",
57,
"request",
"return session.request(method=method, url=url, **kwargs)"
],
[
"/var/task/requests/sessions.py",
475,
"request",
"resp = self.send(prep, **send_kwargs)"
],
[
"/var/task/requests/sessions.py",
585,
"send",
"r = adapter.send(request, **kwargs)"
],
[
"/var/task/requests/adapters.py",
477,
"send",
"raise SSLError(e, request=request)"
]
],
"errorType": "SSLError",
"errorMessage": "[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)"
}
您可以在此处详细了解请求对证书的使用:
http://docs.python-requests.org/en/master/user/advanced/
有两种方法可以解决这个问题:
- 找到您丢失的证书,并将其安装到出现故障的系统上。
通过将 verify=False
传递给 requests.get
来完全忽略证书:
r = requests.get(url, params=query, verify=False)
第二种方法更快,但不太安全;这对您的预期用途可能重要,也可能不重要。
lambda 环境不包含 certifi 模块,除非您将其与函数一起上传。
我会这样做:
cd <directory with your lambda>
pip install certifi -t .
zip ../lambda *
然后上传../lambda.zip到亚马逊。
我正在编写一个 lambda 函数,目的是使用请求从 Wolfram CloudObject 中提取信息。这是代码的相关部分:
from __future__ import print_function
import requests
.
.
.
def on_intent(intent_request, session):
print("on_intent requestID=" + intent_request['requestID'] + ", sessionID=" + session['sessionId'])
intent = intent_request['intent']
intent_name = intent_request['intent']['name']
# Dispatch to skill's intent handlers
if intent_name == "GetEvent":
return call_wolfram(intent, session)
elif intent_name == "AMAZON.HelpIntent":
return get_welcome_response()
elif intent_name == "AMAZON.CancelIntent" or intent_name == "AMAZON.StopIntent":
return handle_session_end_request()
else:
raise ValueError("Invalid intent")
.
.
.
# Functions that control skill's behavior
def call_wolfram(intent, session):
url = "https://path-to-cloud-object"
query = {'string1': 'VESSEL', 'string2': 'EVENT', 'RelString': 'TRIGGERED'}
r = requests.get(url, params=query)
session_attributes = {"r_result": r}
speech_output = "Congrats, dummy! It worked"
card_title = "Query"
should_end_session = True
return build_response({}, build_speechlet_response(card_title, speech_output, None, should_end_session)
其余大部分代码遵循 AWS 提供的 MyColorIs
示例模板,并进行了极小的改动。测试lambda函数时,报错信息给了我一个json file with stackTrace;我已将问题缩小到代码行 r = requests.get()
和 session_attributes = {}
,因为当注释掉时,lambda 执行成功。这是我使用 python 的第一个项目,所以我也是这门语言的新手。为了更好地衡量,这是我在 lambda 执行后收到的错误消息:
{
"stackTrace": [
[
"/var/task/query_lambda.py",
27,
"lambda_handler",
"return on_intent(event['request'], event['session'])"
],
[
"/var/task/query_lambda.py",
65,
"on_intent",
"return call_wolfram(intent, session)"
],
[
"/var/task/query_lambda.py",
113,
"call_wolfram",
"r = requests.get(url, params=query)"
],
[
"/var/task/requests/api.py",
71,
"get",
"return request('get', url, params=params, **kwargs)"
],
[
"/var/task/requests/api.py",
57,
"request",
"return session.request(method=method, url=url, **kwargs)"
],
[
"/var/task/requests/sessions.py",
475,
"request",
"resp = self.send(prep, **send_kwargs)"
],
[
"/var/task/requests/sessions.py",
585,
"send",
"r = adapter.send(request, **kwargs)"
],
[
"/var/task/requests/adapters.py",
477,
"send",
"raise SSLError(e, request=request)"
]
],
"errorType": "SSLError",
"errorMessage": "[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)"
}
您可以在此处详细了解请求对证书的使用:
http://docs.python-requests.org/en/master/user/advanced/
有两种方法可以解决这个问题:
- 找到您丢失的证书,并将其安装到出现故障的系统上。
通过将
verify=False
传递给requests.get
来完全忽略证书:r = requests.get(url, params=query, verify=False)
第二种方法更快,但不太安全;这对您的预期用途可能重要,也可能不重要。
lambda 环境不包含 certifi 模块,除非您将其与函数一起上传。
我会这样做:
cd <directory with your lambda>
pip install certifi -t .
zip ../lambda *
然后上传../lambda.zip到亚马逊。