在遵循教程时,@ 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”未定义
答案 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”。