我试图在python中使用flask-ask和ngrok开始为alexa开发技能。以下是我的代码:
from flask import Flask
from flask_ask import Ask, statement, question, session
import json
import requests
import time
import unidecode
app = Flask(__name__)
ask = Ask(app, "/reddit_reader")
def get_headlines():
titles = 'is this working'
return titles
@app.route('/')
def homepage():
return "hi there, how ya doin?"
@ask.launch
def start_skill():
welcome_message = 'Hello there, would you like the news?'
return question(welcome_message)
@ask.intent("YesIntent")
def share_headlines():
headlines = get_headlines()
headline_msg = 'The current world news headlines are
{}'.format(headlines)
return statement(headline_msg)
@ask.intent("NoIntent")
def no_intent():
bye_text = 'I am not sure why you asked me to run then, but okay... bye'
return statement(bye_text)
if __name__ == '__main__':
app.run(debug=True)
代码在我的机器上正常运行,如果我将其打印出来,则返回正确的输出。但是当我使用ngrok在亚马逊上部署它时,该技能会产生HTTP 500内部错误。我在文本和开发控制台中的json模拟器中都得到了相同的500内部错误。
这是我的意图架构:
{
"intents": [
{
"intent": "YesIntent"
},
{
"intent": "NoIntent"
}
]
}
我的python提示符中出现以下错误:
AttributeError: module 'lib' has no attribute 'X509V3_EXT_get
堆栈跟踪如下:
Traceback (most recent call last):
File "C:\Python36\lib\site-packages\flask\app.py", line 1997, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Python36\lib\site-packages\flask\app.py", line 1985, in wsgi_app
response = self.handle_exception(e)
File "C:\Python36\lib\site-packages\flask\app.py", line 1540, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Python36\lib\site-packages\flask\_compat.py", line 33, in reraise
raise value
File "C:\Python36\lib\site-packages\flask\app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "C:\Python36\lib\site-packages\flask\app.py", line 1614, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Python36\lib\site-packages\flask\app.py", line 1517, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Python36\lib\site-packages\flask\_compat.py", line 33, in reraise
raise value
File "C:\Python36\lib\site-packages\flask\app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Python36\lib\site-packages\flask\app.py", line 1598, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Python36\lib\site-packages\flask_ask\core.py", line 728, in _flask_view_func
ask_payload = self._alexa_request(verify=self.ask_verify_requests)
File "C:\Python36\lib\site-packages\flask_ask\core.py", line 662, in _alexa_request
cert = verifier.load_certificate(cert_url)
File "C:\Python36\lib\site-packages\flask_ask\verifier.py", line 21, in load_certificate
if not _valid_certificate(cert):
File "C:\Python36\lib\site-packages\flask_ask\verifier.py", line 63, in _valid_certificate
value = str(extension)
File "C:\Python36\lib\site-packages\OpenSSL\crypto.py", line 779, in __str__
return self._subjectAltNameString()
File "C:\Python36\lib\site-packages\OpenSSL\crypto.py", line 740, in _subjectAltNameString
method = _lib.X509V3_EXT_get(self._extension)
AttributeError: module 'lib' has no attribute 'X509V3_EXT_get'
Pip冻结输出:
aniso8601==1.2.0
asn1crypto==0.24.0
certifi==2018.1.18
cffi==1.11.5
chardet==3.0.4
click==6.7
cryptography==2.2
Flask==0.12.1
Flask-Ask==0.9.8
idna==2.6
itsdangerous==0.24
Jinja2==2.10
MarkupSafe==1.0
pycparser==2.18
pyOpenSSL==17.0.0
python-dateutil==2.7.0
PyYAML==3.12
requests==2.18.4
six==1.11.0
Unidecode==1.0.22
urllib3==1.22
Werkzeug==0.14.1
我已尝试在python 2.7和python 3.6上运行它。任何帮助表示赞赏
答案 0 :(得分:20)
遇到同样的问题,您可以通过将加密降级为低于2.2的任何内容来修复它。
pip install 'cryptography<2.2'
rpg711得到了所有的功劳(见原帖上的评论)
答案 1 :(得分:1)
我可以确认它适用于密码2.1.4,而不适用于Python 3.7和Mac OS High Sierra上的2.5或2.6。但是,在Mac OS上,还有其他问题需要首先解决。
我发现安装crypotgraphy 2.1.4结束并显示错误(如下所示)。我在我的flask-ask项目的一开始就遇到了这个错误,在开始编码之前必须手动安装需求。当我最终开始尝试alexa时,使用密码2.5或2.6时遇到了同样的500错误(如上所述)。因此,读到它必须为2.1.4时,在尝试安装该特定版本时总会出现此错误:
#include <openssl/opensslv.h>
^~~~~~~~~~~~~~~~~~~~
1 error generated.
error: command 'clang' failed with exit status 1
尝试了很多事情,我尝试了本文中的具体建议(https://github.com/pyca/cryptography/issues/3489)。尝试使用出口CPPFLAGS和LDFLAGS似乎没有用,但是以下方法可以解决
pip3 install cryptography==2.1.4 --global-option=build_ext --global-option="-L/usr/local/opt/openssl/lib" --global-option="-I/usr/local/opt/openssl/include"
恐怕我不能说我之前尝试过的事情(即brew link openssl以及设置CPPFLAGS和LDFLAGS)是否对最终结果有影响。但是,我没有像帖子中那样更新openssl。我希望这会有所帮助,但是我并不是从知识的角度出发,并且不确定我是否有技能来手动安装opsenssl,如后文所述。
我希望这会有所帮助,因为我几乎已经放弃了。
顺便说一句:使用ngrok的Web界面/检查器,我发现确实非常方便,即能够一次又一次重播亚马逊请求非常方便,因为在加密问题发生之前我犯了其他错误。
答案 2 :(得分:0)
引用此链接可以帮助我解决问题。 https://github.com/pyca/cryptography/issues/3489
基本上,通过$ brew link openssl
在Mac中链接openssl并安装cryptography == 2.1.4,问题得以解决。
答案 3 :(得分:0)
在debian linux上,尝试使用
降级加密模块pip install 'cryptography<2.2'
导致无法卸载旧模块的错误(我认为我的版本为2.6.1)。我通过删除文件夹密码以及/ usr / lib / python3 / dist-packages中的*-。egg文件来手动卸载了它。
然后,当我尝试安装较旧的加密模块时,由于缺少某些标头,我再次遇到“无法构建车轮”错误。根据{{3}}的说法,
sudo apt-get install build-essential libssl-dev libffi-dev python3-dev
然后我终于能够安装2.1.4版的加密模块,并且我的alexa技能正常工作。