使用蓝图和一个单独的views.py [重复]当烧瓶-问名“问”没有被定义

问题描述 投票:0回答:1

这个问题已经在这里有一个答案:

当下面的教程时,它在相同的文件中提出= ASK(应用程序“/ someroute”)和应用程序后,瓶=(名称)@ask装饰工程。如果我希望把这些@ask装饰在自己的文件夹视图文件,使用蓝图不管我怎么努力,我得到“名‘问’没有定义”与装饰

我应该说我是新来的烧瓶中,但现在已经有了一个基础的应用程序的东西像长颈瓶主要有瓶,登录和烧瓶导航能够显示菜单项的工作只是如果允许工作。

我一直在关注许多瓶,问教程,一切工作(到目前为止),但我宁愿在一个单独的views.py视图代码在自己的文件夹和应用蓝图。我使用create_app(CONFIG_NAME)代替应用程式=烧瓶(名称)在许多烧瓶教程建议。我希望这样做,因为我想继续我的主要__init__.py尽可能干净。

我的新奇到瓶中防止我做类似使用Alexa的技能-KIT-SDK换蟒蛇如一些人建议的Gitter(如烧瓶问似乎没有再被维护)在烧瓶中,我还是不要“不懂烧瓶足够摸出为什么问对象在一个单独的views.py不可用

在所有的真相,我只是很想在应用程序的一切/ __ init__.py因为这只是一种爱好应用程序,但我想我的构建应用程序烧瓶许多博客,即作为建议,如果有对此没有明显的修复,然后我将诉诸于工作的方式,但我不禁感慨这是我做了从烧瓶的角度不烧瓶问错了。

这可能是值得补充的是我遇到了一些问题,安装(哽咽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这样的路径是虚拟环境)

文件 “/Users/username/Documents/Personal/Pi/template/lib/python3.7/site-packages/flask/app.py”,线2309,在调用返回self.wsgi_app(ENVIRON,start_response)文件“/用户/username/Documents/Personal/Pi/template/lib/python3.7/site-packages/flask/app.py “线2295,在wsgi_app响应= self.handle_exception(E)文件”/用户/用户名/文件/个人/ PI /模板/ lib中/ python3.7 /站点包/瓶/ app.py “线路1741,在handle_exception再加注(exc_type,exc_value,TB)文件”/用户/用户名/文件/个人/ PI /模板/lib/python3.7/site-packages/flask/_compat.py“35行,在再加注加薪值文件” /Users/username/Documents/Personal/Pi/template/lib/python3.7/site-packages/烧瓶/ app.py”,线2292,在wsgi_app响应= self.full_dispatch_request()文件 “/Users/username/Documents/Personal/Pi/template/lib/python3.7/site-packages/flask/app.py” ,线1815,在full_dispatch_request RV = self.handle_user_exception(E)文件“/Users/username/Documents/Personal/Pi/template/lib/python3.7 /site-packages/flask/app.py “线1718,在再加注handle_user_exception(exc_type,exc_value,TB)文件” /Users/username/Documents/Personal/Pi/template/lib/python3.7/site-packages/烧瓶/ _compat.py”,第35行,在再加注加注值文件‘/Users/username/Documents/Personal/Pi/template/lib/python3.7/site-packages/flask/app.py’,线1813,在full_dispatch_request RV = self.dispatch_request()文件 “/Users/username/Documents/Personal/Pi/template/lib/python3.7/site-packages/flask_debugtoolbar/init.py”,线125,在返回dispatch_request view_func(** req.view_args)文件 “/Users/username/Documents/Personal/Pi/baseapp/app/alexa/views.py”,33行,在alexa_route回报(问)NameError:名字 '问' 没有定义

python flask flask-ask
1个回答
0
投票

当使用瓶的应用工厂,你应该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)

当心命名您的应用程序“应用程序”,因为这可能会造成混淆的。我把自由将其更改为“my_app应用”更加清晰。

© www.soinside.com 2019 - 2024. All rights reserved.