使用烧瓶询问的 Alexa 技能:HTTP 500:内部服务器错误

Posted

技术标签:

【中文标题】使用烧瓶询问的 Alexa 技能:HTTP 500:内部服务器错误【英文标题】:Alexa Skill using flask-ask: HTTP 500 : INTERNAL SERVER ERROR 【发布时间】:2017-12-13 05:05:34 【问题描述】:

我只是在学习使用 Flask-Ask 编写 Alexa 技能。 这是flask_app.py的代码:

from flask import Flask, render_template
from flask_ask import Ask, statement, question, session
import random

app = Flask(__name__)

ask = Ask(app, "/")

def armstrong(num):

   order = len(str(num))

   num_sum = 0


   temp = num
   while temp > 0:
    digit = temp % 10
    num_sum += digit ** order
    temp //= 10


    if num == num_sum:
        return True
    else:
        return False

@ask.launch

def new_game():

  welcome_msg = render_template('welcome')

  return statement(welcome_msg)



@ask.intent("AnswerIntent", convert = 'first': int )

def answer(first):

   if armstrong(int(first)):
    msg = render_template('win')
   else:
    msg = render_template('lose')

   return statement(msg)


if __name__ == '__main__':

app.run()

这是意图 JSON 文件的代码:


"intents": [
  "intent": "AnswerIntent",
        "slots": [
              "name": "number",
             "type": "AMAZON.NUMBER"
         ]
  ]

这些是我的示例话语:

AnswerIntent number
AnswerIntent My number is number 
AnswerIntent Is number an armstrong number

但我的命令行错误是:

[2017-07-09 15:37:07,543] ERROR in app: Exception on / [POST]
Traceback (most recent call last):
File "C:\Users\Sayantan Das\AppData\Local\Programs\Python\Python36\lib\site-    packages\flask\app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\Sayantan Das\AppData\Local\Programs\Python\Python36\lib\site-    packages\flask\app.py", line 1614, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\Sayantan Das\AppData\Local\Programs\Python\Python36\lib\site-    packages\flask\app.py", line 1517, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\Sayantan Das\AppData\Local\Programs\Python\Python36\lib\site-    packages\flask\_compat.py", line 33, in reraise
raise value
File "C:\Users\Sayantan Das\AppData\Local\Programs\Python\Python36\lib\site-    packages\flask\app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\Sayantan Das\AppData\Local\Programs\Python\Python36\lib\site-    packages\flask\app.py", line 1598, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\Sayantan Das\AppData\Local\Programs\Python\Python36\lib\site-    packages\flask_ask\core.py", line 571, in _flask_view_func
ask_payload = self._alexa_request(verify=self.ask_verify_requests)
File "C:\Users\Sayantan Das\AppData\Local\Programs\Python\Python36\lib\site-    packages\flask_ask\core.py", line 533, in _alexa_request
timestamp = aniso8601.parse_datetime(alexa_request_payload['request']['timestamp'])
 File "C:\Users\Sayantan Das\AppData\Local\Programs\Python\Python36\lib\site-     packages\aniso8601\time.py", line 120, in parse_datetime
isodatestr, isotimestr = isodatetimestr.split(delimiter)
AttributeError: 'int' object has no attribute 'split'
127.0.0.1 - - [09/Jul/2017 15:37:07] "POST / HTTP/1.1" 500 -

ngrok 显示以下错误:

HTTP Requests
-------------

POST /                         500 INTERNAL SERVER ERROR

在测试中输入话语“start armstrong”后的服务响应是:

    There was an error calling the remote endpoint, which returned HTTP 500 :
    INTERNAL SERVER ERROR

这是我的第一个 Alexa 技能。我正在尝试在 Python 上使用 Flask 和 flask-ask 来实现它。 请帮忙。

【问题讨论】:

这里也一样。这个 bug 的另一个奇怪之处是,如果你复制 Text 测试器生成的 JSON 并将其粘贴到测试器的 JSON 选项卡中,它实际上可以工作。 @alpalalpal 我会试试你的建议。 尝试在您的 python 中将加密版本降级为 2.1。 【参考方案1】:

看起来这可能是 Alexa 测试工具的问题。请参阅https://github.com/johnwheeler/flask-ask/issues/152 和https://forums.developer.amazon.com/questions/78372/timestamp-is-sent-in-different-formats.html

我可以确认我的技能适用于 Echo 设备和 Alexa 管理页面测试部分的 JSON 选项卡。但它在 echosim.io 和 Text 选项卡中失败。

【讨论】:

flask-ask 项目解决了提交 #152 中的时间戳问题。 echosim.io 现在似乎也可以工作了。

以上是关于使用烧瓶询问的 Alexa 技能:HTTP 500:内部服务器错误的主要内容,如果未能解决你的问题,请参考以下文章

Alexa 自定义技能示例话语

聆听 Alexa 技能包中的响应

如何为 Alexa 技能意图响应获取和使用确认“是”或“否”

Alexa Skill - 如何获取要求 Alexa 的完整声明文本

从 Alexa 向 API 进行身份验证

从 Amazon Alexa 技能包发送 HTTP 发布请求