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()
这是python脚本,用于我的对话框代理后端。代理具有以下会话结构:
嗨->请输入地址->请输入名称(以浪费时间)->and,然后它给出旅行时间
因此,这个代理基本上给出了输入的地址和固定地址之间的旅行时间(使用again()
中的脚本),同时注意,如果我直接尝试在地址之后输出旅行时间,对话框代理说,超出了截止日期。因此,为了克服这个问题,我尝试了线程处理,以便在后台计算行程时间,同时将响应返回到对话框,询问用户名,然后输出行程时间。
但问题是,DialogFlow仍然表示超过了截止日期(在“请输入您的地址”)。我怀疑原因是,即使python脚本返回web钩子,但是直到python脚本停止执行时,对话框流才会显示输出。那我该怎么克服呢?
总之,我希望返回请求(get_address
操作),同时计算旅行时间(使用again()
),并在下一个请求中返回。
因此,按照的建议,从results()
函数的if()
部分中删除了return {'fulfillmentText': textv}
,并将其替换为return {'followupEventInput': 'IN_PROGRESS'}
,但它仍然写着DEADLINE_EXCEEDED
。正如我前面所说的,问题似乎在于results()
函数根本没有返回。
发布于 2020-05-07 18:35:02
我自己就猜到了。问题在于:threade=threading.Thread(target=again())
的语法
在()
之后不应该有again
。
发布于 2020-05-07 16:22:28
您面临的问题是,您的计算任务可能需要超过4秒的最大等待时间DialogFlow之间的问题和答案。
事实上,一个基本的解决办法是在某个时候买东西,问其他问题。
在下面的交互过程中,您需要检查后台线程是否已经完成,然后获取时间。否则,您需要扩展此过程。
一种稍微好一些的方法是触发事件(而不是提问):
进入address
https://stackoverflow.com/questions/61652734
复制相似问题