我是GCP云函数的新手,我正在尝试使用Python部署一个云函数,当被调用时,它将执行get请求并返回一些数据。为此,我使用requests模块的requests.get((函数。当调用函数时,我得到以下错误:
名称错误:名称"请求"未定义
在更新代码以将导入请求包含在main.py文件中并调用函数后,我得到错误:
导入请求ModuleNotFoundError:没有名为"请求"的模块
然后我试图将其作为包含在requirements.txt文件中
请求==2.*
并收到"无模块"错误。下面是我试图运行的代码。
def web_request (requests):
data = requests.get_json()
if data['parameter'] == 'input':
GET_request = requests.get('RequestURL')
GET_data = GetRequest.json()
return GET_data
请就最佳解决方案提出建议。
这里有一个镜像代码的示例(请参阅下面的注意事项(
requirements.txt
:
functions-framework==3.*
requests==2.*
main.py
:
import functions_framework
import requests
@functions_framework.http
def web_request (request):
# request -- is the parameter
data = request.get_json()
if data['parameter'] == 'input':
# requests -- is the imported package
response = requests.get(data['url'])
data = response.json()
return data
注意以上代码反映了您的代码。它不包含错误处理。
创建本地Python环境
python3 -m venv venv
source venv/bin/activate
python3 -m pip install requirement=requirements.txt
在本地运行云功能
在一个shell中,启动服务器:
functions-framework --target web_request
在另一个shell中,测试服务器:
curl
--request POST
--header "Content-Type: application/json"
--data '{"parameter":"input","url":"http://ip.jsontest.com/"}'
http://localhost:8080/web_request
应该产生这样的结果:
{"ip":"11.22.33.44"}
将云功能部署到谷歌云
BILLING=[YOUR-BILLING]
PROJECT=[YOUR-PROJECT]
REGION=[YOUR-REGION]
gcloud projects create ${PROJECT}
gcloud beta billing projects link ${PROJECT}
--billing-account=${BILLING}
# Deploy
gcloud functions deploy web_request
--runtime=python310
--trigger-http
--allow-unauthenticated
--region=${REGION}
--project=${PROJECT}
# Test
gcloud functions call web_request
--project=${PROJECT}
--region=${REGION}
--data='{"parameter":"input","url":"http://ip.jsontest.com/"}'
收益率,例如:
{"ip":"2600:1900:2000:13::14"}
或者:
TOKEN=$(
gcloud auth print-identity-token)
ENDPOINT=$(
gcloud functions describe web_request
--region=${REGION}
--project=${PROJECT}
--format="value(httpsTrigger.url)")
curl --request POST
--header "Authorization:bearer ${TOKEN}"
--header "Content-Type:application/json"
--data '{"parameter":"input","url":"http://ip.jsontest.com/"}'
${ENDPOINT}
第二代谷歌云功能在失败时,有时会发出误导性的错误消息。我在导入请求方面也遇到了类似的问题,但最终是一个格式错误的字符串。当我作为第一代部署时,我发现了这个问题,在修复后,它在第二代也起了作用。如@DazWilkin所示在本地运行有助于避免此类问题。
在您的情况下,您的变量正在跟踪请求包。您应该重新编写函数,以便使用名称request
作为参数,而不是requests
。
代码的第一行是:def web_request (request):
其余的代码可能也需要修复,但这应该可以解决您遇到的错误。