使用蓝图和单独的视图时,未定义flask-ask名称“ ask”。py

时间:2019-02-05 11:43:08

标签: python flask flask-ask

在遵循教程时,@ ask装饰器在与ask = Ask(app,“ / someroute”)相同的文件中以及在app = Flask( name )之后的文件中起作用。如果我希望将@ask装饰器放在其自己的文件夹中的视图文件中,请使用蓝图,无论我尝试什么,装饰器都会显示“名称'ask'未定义”

我应该说我是不熟悉Flask的,但是现在有了一个基本应用程序,可以处理flask-principal之类的功能,并通过flask-login和flask-navigation仅在允许的情况下显示菜单项。

我一直在跟踪许多烧瓶询问教程,并且一切正常(到目前为止),但是我希望将视图代码放在自己的文件夹中的单独views.py中并使用Blueprints。正如许多烧瓶教程中所建议的那样,我使用create_app(config_name)代替了app = Flask( name )。我希望这样做,因为我想使我的主要__init__.py尽可能保持干净。

我对烧瓶的新颖性阻止了我像Gitter上的一些人所建议的那样在烧瓶中使用alexa-skills-kit-sdk-for-python之类的东西(因为烧瓶的要求似乎不再得到维护),我仍然对烧瓶的理解还不够,无法弄清楚为什么在单独的视图中Ask对象不可用。py

说实话,我很想将所有内容都放在app / __ init__.py中,因为这只是一个业余应用程序,但是我正尝试按照许多博客的建议来构造我的flask应用程序,即如果没有明显的解决方案,然后我将诉诸可行的方式,但我不禁会觉得这是我从烧瓶的角度而不是烧瓶的角度做错的事情。

值得补充的是,我遇到了一些安装问题(选择了PyYAML,因此我下载了软件包并手动安装了要求,然后运行setup.py(以防万一对问题有影响)

#app/__init__.py
#Pytho 3

from flask_ask import Ask, statement, question, session

....

def create_app(config_name):
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_object(app_config[config_name])
    app.config.from_pyfile('config.py')

    Bootstrap(app)
    db.init_app(app)
    nav.init_app(app)
    toolbar.init_app(app)

    login_manager.init_app(app)
    login_manager.login_message = "You must be logged in to access this page."
    login_manager.login_view = "auth.login"    

    principals = Principal(app)

    ask = Ask(app, "/alexa")
    ask.init_app(app) #have also done it without this as some of the tutorials don't mention it

    from .auth import auth as auth_blueprint
    app.register_blueprint(auth_blueprint)

    from .home import home as home_blueprint
    app.register_blueprint(home_blueprint)

    from .alexa import alexa as alexa_blueprint
    app.register_blueprint(alexa_blueprint,url_prefix='/alexa')



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

如果我删除@ask装饰器代码并按如下所示放置它。...

#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,因此路径是指向虚拟环境的)

在“ 调用”中的文件“ /用户/用户名/文档/个人/ Pi /模板/lib/python3.7/site-packages/flask/app.py”第2309行 返回self.wsgi_app(环境,start_response) wsgi_app中的文件“ /用户/用户名/文档/个人/Pi/template/lib/python3.7/site-packages/flask/app.py”,第2295行 响应= self.handle_exception(e) 文件“ / Users /用户名/ Documents /个人/Pi/template/lib/python3.7/site-packages/flask/app.py”,行1741,在handle_exception中 加价(exc_type,exc_value,tb) 重新列出文件“ / Users /用户名/ Documents /个人/Pi/template/lib/python3.7/site-packages/flask/_compat.py”,第35行 提高价值 wsgi_app中的文件“ /用户/用户名/文档/个人/Pi/template/lib/python3.7/site-packages/flask/app.py”,第2292行 响应= self.full_dispatch_request() 在full_dispatch_request中,文件“ /用户/用户名/文档/个人/Pi/template/lib/python3.7/site-packages/flask/app.py”,行1815 rv = self.handle_user_exception(e) 在handle_user_exception中的文件“ /用户/用户名/文档/个人/ Pi /模板/lib/python3.7/site-packages/flask/app.py”,行1718 加价(exc_type,exc_value,tb) 重新列出文件“ / Users /用户名/ Documents /个人/Pi/template/lib/python3.7/site-packages/flask/_compat.py”,第35行 提高价值 在full_dispatch_request中,文件“ /用户/用户名/文档/个人/Pi/template/lib/python3.7/site-packages/flask/app.py”,行1813 rv = self.dispatch_request() 文件“ /用户/用户名/文档/个人/Pi/template/lib/python3.7/site-packages/flask_debugtoolbar/init.py”,第125行,位于dispatch_request中 返回view_func(** req.view_args) 文件“ / Users /用户名/ Documents /个人/Pi/baseapp/app/alexa/views.py”,行33,在alexa_route中 回报(问) NameError:名称“ ask”未定义

1 个答案:

答案 0 :(得分:0)

在使用flask的app-factory时,您应该在create_app之外创建模块的对象:

#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”。