导入请求在GCP python函数中不起作用



我是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):

其余的代码可能也需要修复,但这应该可以解决您遇到的错误。

相关内容

  • 没有找到相关文章

最新更新