Ошибка 400 Bad Request в LaunchRequest с flask-ask

Я пытаюсь отладить небольшой навык Alexa, созданный с помощью фреймворка flask-ask. Моя проблема в том, что я продолжаю получать ошибку 400 при простом LaunchRequest. Соответствующая функция намерения такова:

@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, я понятия не имею, как это исправить. Может ли кто-нибудь дать мне подсказку?


person gmolau    schedule 18.02.2018    source источник


Ответы (1)


Отвечаю себе, потому что я понял это:

Я запускал приложение из файла пакетов __init__.py, сохраняя при этом функции намерения в отдельном файле intents.py того же пакета. Для этого необходимо импортировать модуль намерения в файл инициализации, но только после создания объекта 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

Более подробное объяснение можно найти в документации flask для крупных приложений.

person gmolau    schedule 18.02.2018
comment
Чертежи могут избежать этой проблемы и упростить более крупное приложение flask, которое обрабатывает как голосовые, так и обычные запросы. См. flask.pocoo.org/docs/0.12/patterns/packages/ - person farridav; 05.03.2018