0

我正在尝试调试一个使用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 -

来自意图函数的日志消息永远不会显示。

当我使用zappa部署技能并执行操作时,zappa tail我会看到第二个请求 (SessionEndedRequest)。这会返回 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装饰器,所以我不知道如何解决这个问题。有人可以给我一个提示吗?

4

1 回答 1

0

回答自己,因为我已经弄清楚了:

我从包__init__.py文件中运行 APP,同时将意图函数单独保存intents.py在同一个包中。为此,必须将意图模块导入 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

更详细的解释可以在大型应用程序的烧瓶文档中找到。

于 2018-02-18T13:54:14.363 回答