使用 flask-ask 的 LaunchRequest 出现 400 Bad Request 错误
400 Bad Request error on a LaunchRequest with flask-ask
我正在尝试调试使用 flask-ask 框架构建的小型 Alexa 技能。我的问题是我在一个简单的 LaunchRequest 上不断收到 400 错误。相关的意图函数是这样的:
@ASK.launch
def launch():
"""Welcome & ask for users intent."""
APP.logger.debug('LAUNCHING SESSION')
return question(render_template('welcome'))
当我 运行 服务器在本地处于调试模式(通过 ngrok 建立隧道)并发出一个简单的启动请求 ("start my_skills_name") 时,flask 记录了两个请求:
$ python main.py app --run
INFO:werkzeug: * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
INFO:werkzeug:127.0.0.1 - - [18/Feb/2018 12:47:43] "POST / HTTP/1.1" 400 -
INFO:werkzeug:127.0.0.1 - - [18/Feb/2018 12:47:44] "POST / HTTP/1.1" 200 -
从未显示来自 intent 函数的日志消息。
当我使用 zappa 部署技能并执行 zappa tail
时,我看到了第二个请求 (SessionEndedRequest)。 returns 一个 200 状态代码,但似乎确实产生了一些异常:
"request":{
"type":"SessionEndedRequest",
"requestId":"<1234>",
"timestamp":"2018-02-18T11:54:46Z",
"locale":"de-DE",
"reason":"ERROR",
"error":{
"type":"INVALID_RESPONSE",
"message":"An exception occurred while dispatching the request to the skill."
}
}
这个请求的函数也很简单:
@ASK.session_ended
def session_ended():
APP.logger.debug('ENDING SESSION')
return statement('bye')
没有显示日志消息,即使我删除该函数并且根本不处理 SessionEndedRequests,错误仍然存在。
我有点不知道这里会发生什么。请求确实到达了我的服务器,表明技能本身配置正确。看起来它们以某种方式没有被路由到正确的意图函数,但是由于我完全依赖 ask.intent
装饰器,所以我不知道如何解决这个问题。有人可以给我提示吗?
自己回答,因为我已经弄明白了:
我是 运行 程序包 __init__.py
文件中的应用程序,同时将意图函数保存在同一个程序包中的单独 intents.py
中。为此,必须将 intent 模块导入到 init 文件中,但前提是在创建 APP 对象之后。这意味着 mypackage/__init__.py
必须如下所示:
from flask import Flask
from flask_ask import Ask
APP = Flask(__name__)
ASK = Ask(APP, '/')
from my_package import intents # importing my_package/intents.py
可以在 larger applications 的烧瓶文档中找到更详细的解释。
我正在尝试调试使用 flask-ask 框架构建的小型 Alexa 技能。我的问题是我在一个简单的 LaunchRequest 上不断收到 400 错误。相关的意图函数是这样的:
@ASK.launch
def launch():
"""Welcome & ask for users intent."""
APP.logger.debug('LAUNCHING SESSION')
return question(render_template('welcome'))
当我 运行 服务器在本地处于调试模式(通过 ngrok 建立隧道)并发出一个简单的启动请求 ("start my_skills_name") 时,flask 记录了两个请求:
$ python main.py app --run
INFO:werkzeug: * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
INFO:werkzeug:127.0.0.1 - - [18/Feb/2018 12:47:43] "POST / HTTP/1.1" 400 -
INFO:werkzeug:127.0.0.1 - - [18/Feb/2018 12:47:44] "POST / HTTP/1.1" 200 -
从未显示来自 intent 函数的日志消息。
当我使用 zappa 部署技能并执行 zappa tail
时,我看到了第二个请求 (SessionEndedRequest)。 returns 一个 200 状态代码,但似乎确实产生了一些异常:
"request":{
"type":"SessionEndedRequest",
"requestId":"<1234>",
"timestamp":"2018-02-18T11:54:46Z",
"locale":"de-DE",
"reason":"ERROR",
"error":{
"type":"INVALID_RESPONSE",
"message":"An exception occurred while dispatching the request to the skill."
}
}
这个请求的函数也很简单:
@ASK.session_ended
def session_ended():
APP.logger.debug('ENDING SESSION')
return statement('bye')
没有显示日志消息,即使我删除该函数并且根本不处理 SessionEndedRequests,错误仍然存在。
我有点不知道这里会发生什么。请求确实到达了我的服务器,表明技能本身配置正确。看起来它们以某种方式没有被路由到正确的意图函数,但是由于我完全依赖 ask.intent
装饰器,所以我不知道如何解决这个问题。有人可以给我提示吗?
自己回答,因为我已经弄明白了:
我是 运行 程序包 __init__.py
文件中的应用程序,同时将意图函数保存在同一个程序包中的单独 intents.py
中。为此,必须将 intent 模块导入到 init 文件中,但前提是在创建 APP 对象之后。这意味着 mypackage/__init__.py
必须如下所示:
from flask import Flask
from flask_ask import Ask
APP = Flask(__name__)
ASK = Ask(APP, '/')
from my_package import intents # importing my_package/intents.py
可以在 larger applications 的烧瓶文档中找到更详细的解释。