【发布时间】:2020-05-07 08:01:23
【问题描述】:
app = Flask(__name__)
av=""
time=""
action=""
def again():
...
@app.route('/')
def index():
return 'Hello World!'
def results():
global action
req = request.get_json(force=True)
action = req.get('queryResult').get('action')
if(action=="get_address"):
global av
global time
av=req.get('queryResult').get('parameters').get('location').get('city')
threade=threading.Thread(target=again())
threade.start()
textv="Thanks! Please enter your name now."
return {'fulfillmentText': textv}
else:
textv="Time: " + time
return {'fulfillmentText': textv}
# create a route for webhook
@app.route('/webhook', methods=['GET', 'POST'])
def webhook():
# return response
return make_response(jsonify(results()))
# run the app
if __name__ == '__main__':
app.run()
这是我的 Dialogflow 代理后端的 python 脚本。代理具有以下对话结构:
你好->请输入地址->请输入姓名(浪费时间)->[然后给出旅行时间]
所以这个代理基本上给出了输入的地址和固定地址之间的旅行时间(使用again()中的脚本)
另外,请注意我在浪费时间,因为如果我直接尝试在地址之后输出旅行时间,Dialogflow 代理会说,已超过截止日期。所以为了解决这个问题,我尝试了线程,以便在后台计算行程时间,同时将响应返回到对话流,询问用户的姓名,然后输出行程时间。
但问题是,DialogFlow 仍然显示已超过截止日期(在 “请输入您的地址”)。我怀疑原因是,即使 python 脚本返回 webhook,但 dialogflow 不会显示输出,直到 python 脚本停止执行。那么我该如何克服呢?
总结一下,我希望请求返回(get_address action),同时计算行程时间(使用again())并在下一个请求中返回。
按照建议,我从 if() 的 results() 函数的一部分中删除了 return {'fulfillmentText': textv},并将其替换为 return {'followupEventInput': 'IN_PROGRESS'},但它仍然显示为 DEADLINE_EXCEEDED。正如我之前所说,问题似乎在于results() 函数根本没有返回。
【问题讨论】:
标签: python multithreading flask dialogflow-es dialogflow-es-fulfillment