Python 烧瓶询问姓名';询问';使用Blueprints和单独的views.py时未定义

Python 烧瓶询问姓名';询问';使用Blueprints和单独的views.py时未定义,python,flask,flask-ask,Python,Flask,Flask Ask,在以下教程中,@ask decorator与ask=ask(app,“/someroute”)位于同一文件中且在app=Flask(name)之后工作。如果我想把@ask decorators放在它自己的文件夹中的视图文件中,不管我怎么做,都要使用蓝图,我会得到decorator的“name'ask'未定义” 我应该说我是flask的新手,但是现在我已经有了一个基础应用程序,可以使用flask principal和flask登录以及flask导航等功能,只有在允许的情况下才能显示菜单项 我一直在

在以下教程中,@ask decorator与ask=ask(app,“/someroute”)位于同一文件中且在app=Flask(name)之后工作。如果我想把@ask decorators放在它自己的文件夹中的视图文件中,不管我怎么做,都要使用蓝图,我会得到decorator的“name'ask'未定义”

我应该说我是flask的新手,但是现在我已经有了一个基础应用程序,可以使用flask principal和flask登录以及flask导航等功能,只有在允许的情况下才能显示菜单项

我一直在学习许多flask ask教程,到目前为止一切都正常,但我更喜欢将视图代码放在单独的views.py文件夹中,并使用蓝图。我使用create_app(config_name)代替了许多Flask教程中建议的app=Flask(name)。我希望这样做,因为我想保持我的main\uu init\uuu.py尽可能干净

我对flask的新认识使我无法像Gitter上的一些人建议的那样在flask中使用alexa skills kit sdk for python(因为flask ask似乎不再被维护),我仍然不太了解flask,无法理解为什么ask对象在单独的views.py中不可用

事实上,我很想把所有东西都放在app/_init__u; y.py中,因为这只是一个业余爱好应用程序,但我正试图按照许多博客的建议构建我的烧瓶应用程序,也就是说,如果没有明显的修复方法,那么我将采用这种工作方式,但我忍不住觉得,从烧瓶的角度看,这是我做错了的事情,不是烧瓶问

值得一提的是,我在安装时遇到了一些问题(PyYAML阻塞,因此我下载了软件包并手动安装了需求,然后运行setup.py(以防万一这会对问题产生影响)

如果我删除@ask decorator代码并如下所示

#app/alexa/views.py
from flask_ask import Ask, statement, question, session
import json
import requests
import time
import unidecode

from . import alexa

    @alexa.route('/')
    def alexa_route():
     return('alexa')

    #this doesn't work
    @ask.launch # this is on line 33 (as below error)
    def start_skill():
        welcome_message = 'Hello there, would you like the news?'
        return question(welcome_message)
我得到(我正在使用venv,因此路径是指向虚拟环境的)

文件“/Users/username/Documents/Personal/Pi/template/lib/python3.7/site packages/flask/app.py”,第2309行,在call 返回self.wsgi_应用程序(环境,启动响应) wsgi_应用程序中的文件“/Users/username/Documents/Personal/Pi/template/lib/python3.7/site packages/flask/app.py”,第2295行 response=self.handle\u异常(e) 文件“/Users/username/Documents/Personal/Pi/template/lib/python3.7/site packages/flask/app.py”,第1741行,在handle\u异常中 重放(exc_类型、exc_值、tb) 文件“/Users/username/Documents/Personal/Pi/template/lib/python3.7/site packages/flask/_compat.py”,第35行,重新登录 增值 wsgi_应用程序中的文件“/Users/username/Documents/Personal/Pi/template/lib/python3.7/site packages/flask/app.py”,第2292行 response=self.full\u dispatch\u request() 文件“/Users/username/Documents/Personal/Pi/template/lib/python3.7/site packages/flask/app.py”,第1815行,完整发送请求 rv=自身处理用户异常(e) 文件“/Users/username/Documents/Personal/Pi/template/lib/python3.7/site packages/flask/app.py”,第1718行,在handle\u user\u exception中 重放(exc_类型、exc_值、tb) 文件“/Users/username/Documents/Personal/Pi/template/lib/python3.7/site packages/flask/_compat.py”,第35行,重新登录 增值 文件“/Users/username/Documents/Personal/Pi/template/lib/python3.7/site packages/flask/app.py”,第1813行,完整发送请求 rv=自我分派请求() 文件“/Users/username/Documents/Personal/Pi/template/lib/python3.7/site packages/flask\u debugtoolbar/init.py”,第125行,在调度请求中 返回视图函数(**请求视图参数) 文件“/Users/username/Documents/Personal/Pi/baseapp/app/alexa/views.py”,第33行,在alexa_路线中 返回(询问)
名称错误:未定义名称“ask”

使用flask的应用程序工厂时,应在create_应用程序之外创建模块的对象:

#my_app/__init__.py

from flask_ask import Ask, statement, question, session
...
ask = Ask()

def create_app(config_name):
    app = Flask(...)
    ...

    ask.init_app(app)
然后,您可以在需要时导入对象:

#my_app/alexa/views.py
from my_app import ask
...

@ask.launch
def start_skill():
    welcome_message = 'Hello there, would you like the news?'
    return question(welcome_message)
小心将你的应用命名为“app”,因为这可能会让人困惑。为了更清晰,我可以自由地将其更改为“my_app”

#my_app/alexa/views.py
from my_app import ask
...

@ask.launch
def start_skill():
    welcome_message = 'Hello there, would you like the news?'
    return question(welcome_message)