python - Google Cloud Function 因 TypeError 崩溃:“请求”对象不可下标
问题描述
我已经部署了一个谷歌云函数,并通过一个 http GET 请求和 URL 查询字符串参数来访问它。
但是,它失败并显示“错误:无法处理请求”。
不过,当我从 Colab 笔记本运行它时,该功能工作得非常好。
我在下面分享函数代码(main.py)、requirements.txt和错误日志:
主要.py:
from goose3 import Goose
import validators
import json
from transformers import pipeline
def respond(err, res=None):
print(err)
print(res)
return {
'statusCode': '400' if err else '200',
'body': err['message'] if err else json.dumps(res),
'headers': {
'Content-Type': 'application/json',
},
}
def extract_html(url):
extractor = Goose({'browser_user_agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2)','strict': False})
article = extractor.extract(url=url)
text = article.cleaned_text
info = article.infos
print("Extracted {} words.".format( str(len(text.split(' '))) ))
return info, text
def t5(event):
qs = event['queryStringParameters']
if qs and 'url' in qs:
url = qs['url']
print(url)
try:
validators.url(url)
info, text = extract_html(url)
nlp_t5 = pipeline('summarization', model="t5-small", tokenizer="t5-small")
summary = nlp_t5(text)
data = {'url': url,
'info': info,
'meta_description': summary
}
return respond(None, data)
except ValidationFailure as e:
err = {'message': 'Not a valid URL.'}
return respond(err)
except Exception as e:
err = {'message': str(e)}
return respond(err)
else:
return respond(ValueError('Missing parameter `url`.'))
要求.txt:
https://download.pytorch.org/whl/cpu/torch-1.0.1.post2-cp37-cp37m-linux_x86_64.whl
transformers==2.7.0
validators==0.14.3
goose3==3.1.6
错误日志:
{
insertId: "xxxx-cea02c1b8e9a"
labels: {
execution_id: "oq7e8d7dryic"
}
logName: "xxxxxxx/cloudfunctions.googleapis.com%2Fcloud-functions"
receiveTimestamp: "2020-04-15T11:21:52.415338305Z"
resource: {
labels: {
function_name: "t5"
project_id: "xxxx"
region: "us-central1"
}
type: "cloud_function"
}
severity: "ERROR"
textPayload: "Traceback (most recent call last):
File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 346, in run_http_function
result = _function_handler.invoke_user_function(flask.request)
File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 217, in invoke_user_function
return call_user_function(request_or_event)
File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 210, in call_user_function
return self._user_function(request_or_event)
File "/user_code/main.py", line 30, in t5
qs = event['queryStringParameters']
File "/env/local/lib/python3.7/site-packages/werkzeug/local.py", line 377, in <lambda>
__getitem__ = lambda x, i: x._get_current_object()[i]
TypeError: 'Request' object is not subscriptable
"
timestamp: "2020-04-15T11:21:51.928Z"
trace: "xxxxxxx/traces/ac5c24180c1fce71fdcf32e39d88d1ff"
}
示例触发事件:
{
"httpMethod": "GET",
"queryStringParameters": {
"url": "https://www.webmd.com/rx/physicians/"
}
}
我四处寻找解决方案,但找不到任何解决方案。
提前非常感谢。
解决方案
你正在做的:
def t5(event):
qs = event['queryStringParameters']
if qs and 'url' in qs:
url = qs['url']
...
但是这里传递给函数的对象是一个Flask请求对象,所以你需要这样做:
def t5(event):
url = event.args.get("url")
if url:
...
我建议重命名参数,以免与背景函数混淆:
def t5(request):
url = request.args.get("url")
if url:
...
您还需要更新您的respond
方法以返回字符串、元组或Response
实例。就像是:
def respond(err, res=None):
print(err)
print(res)
if err:
return err['message'], 400, {'Content-Type': 'application/json'}
else:
return json.dumps(res), 200, {'Content-Type': 'application/json'}
推荐阅读
- c# - 检测是否从已发布的自包含可执行文件运行
- javascript - 用于计算日期时间的 JavaScript 间隔函数
- c++ - QTreeView:如果没有输入,则不更新索引
- windows - 需要帮助删除 RELEASE Flash Player ActiveX (windows 8.1)
- javascript - React 在 js 文件之间传递变量
- html - XSLT 表在输出中乱序
- python - QPlainTextEdit 和 QCompleter 焦点问题
- javascript - 创建一个firebase函数以在数据库中设置负服务器时间戳但保留NaN
- sql - 为 RDLC 报告创建视图的 SQL 查询
- powershell - 是否可以使用 powershell 甚至 cmd 使用密码/哈希加密任何文件?