使用 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 的烧瓶文档中找到更详细的解释。