在后台执行python脚本,同时返回dialogflow响应(python Flask)
这是python脚本,用于Dialogflow代理的后端。代理具有以下对话结构: 嗨->请输入地址->请输入姓名(浪费时间)->[然后给出旅行时间] 因此,该代理基本上给出了输入地址和固定地址之间的旅行时间(再次使用在后台执行python脚本,同时返回dialogflow响应(python Flask),python,multithreading,flask,dialogflow-es,dialogflow-es-fulfillment,Python,Multithreading,Flask,Dialogflow Es,Dialogflow Es Fulfillment,这是python脚本,用于Dialogflow代理的后端。代理具有以下对话结构: 嗨->请输入地址->请输入姓名(浪费时间)->[然后给出旅行时间] 因此,该代理基本上给出了输入地址和固定地址之间的旅行时间(再次使用中的脚本() 另外,请注意,我是在浪费时间,因为Dialogflow代理说,如果我直接尝试在地址之后输出旅行时间,则超过了最后期限。为了克服这个问题,我尝试了线程化,以便在后台计算行程时间,同时,响应返回到dialogflow,它询问用户名,然后输出行程时间 但问题是,DialogF
中的脚本()
另外,请注意,我是在浪费时间,因为Dialogflow代理说,如果我直接尝试在地址之后输出旅行时间,则超过了最后期限。为了克服这个问题,我尝试了线程化,以便在后台计算行程时间,同时,响应返回到dialogflow,它询问用户名,然后输出行程时间
但问题是,DialogFlow仍然表示超过了截止日期(在“请输入您的地址”)。我怀疑原因是,尽管python脚本返回webhook,但dialogflow不会显示输出,直到python脚本停止执行。那我怎么克服呢
总而言之,我希望返回请求(get\u address
action),同时计算旅行时间(再次使用(
)并在下一个请求中返回
正如建议的那样,我从if()
函数中删除了return{'fulfillmentText':textv}
,将其替换为return{'followEventInput':'IN_PROGRESS'}
,但它仍然说截止日期超过了
。正如我前面所说,问题似乎在于,results()
函数根本没有返回。您面临的问题是,您的计算任务可能需要超过问题和答案之间最长4秒的对话等待时间。
事实上,一个基本的解决办法就是找个时间买东西,然后问其他问题
在以下交互过程中,您需要检查后台线程是否已完成,然后获取时间。否则,您需要扩展此过程
一种稍微好一点的方法是触发事件(而不是提问):
- 输入地址
- webhook被调用
- 启动后台线程,睡眠3秒,正在触发事件
- DialogFlow intent I1由正在进行的事件触发,向用户显示一条消息(即正在处理)
- webhook在intent I1之后调用,休眠3秒,然后检查后台线程状态
您面临的问题是,您的计算任务可能需要超过问题和答案之间对话流等待的最长4秒时间。
事实上,一个基本的解决办法就是找个时间买东西,然后问其他问题
在以下交互过程中,您需要检查后台线程是否已完成,然后获取时间。否则,您需要扩展此过程
一种稍微好一点的方法是触发事件(而不是提问):
- 输入地址
- webhook被调用
- 启动后台线程,睡眠3秒,正在触发事件
- DialogFlow intent I1由正在进行的事件触发,向用户显示一条消息(即正在处理)
- webhook在intent I1之后调用,休眠3秒,然后检查后台线程状态
我自己想出来的。问题在于以下语法:
threade=threading.Thread(target=reach())
在之后不应该再出现()
,,,我自己想出来的。问题在于以下语法:
threade=threading.Thread(target=reach())
之后不应再出现()
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()