【问题标题】:RuntimeError: assets instance not bound to an application, and no application in current contextRuntimeError:资产实例未绑定到应用程序,当前上下文中没有应用程序
【发布时间】:2016-03-17 22:09:19
【问题描述】:

我正在修改cookiecutter Flask 应用程序。我目前正在尝试将日期选择器添加到页面。我找到了https://eonasdan.github.io/bootstrap-datetimepicker/。这个 cookiecutter 使用烧瓶资产来管理项目资产。

https://adambard.com/blog/fresh-flask-setup/ 之后,我已经修改了我的 assets.py 文件:

from flask_assets import Bundle, Environment
import os

css = Bundle(
    "libs/bootstrap/dist/css/spacelab/bootstrap.css",
    "bower_components/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.css",
    "css/style.css",
    "css/home.css",
    # "css/style.css",
    filters="cssmin",
    output="public/css/common.css"
)

js = Bundle(
    "libs/jQuery/dist/jquery.js",
    "libs/bootstrap/dist/js/bootstrap.js",
    "bower_components/moment/moment.js",
    "bower_components/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min.js",
    "js/plugins.js",
    filters='jsmin',
    output="public/js/common.js"
)

# Tell flask-assets where to look for our coffeescript and sass files.
assets = Environment()
assets.load_path = [os.path.join(os.path.dirname(__file__), 'myflaskapp/static/bower_components')]

assets.register("js_all", js)
assets.register("css_all", css)

当我这样做时,我得到:

Traceback (most recent call last):
  File "C:/envs/r2/myproject/manage.py", line 8, in <module>
    from myflaskapp.app import create_app
  File "C:\envs\r2\myproject\myflaskapp\app.py", line 8, in <module>
    from myflaskapp.assets import assets
  File "C:\envs\r2\myproject\myflaskapp\assets.py", line 41, in <module>
    assets.load_path = [os.path.join(os.path.dirname(__file__), 'myflaskapp/static/bower_components')]
  File "C:\envs\virtalenvs\flask_myproject\lib\site-packages\webassets\env.py", line 639, in _set_load_path
    self._storage['load_path'] = load_path
  File "C:\envs\virtalenvs\flask_myproject\lib\site-packages\flask_assets.py", line 104, in __setitem__
    self.env._app.config[self._transform_key(key)] = value
  File "C:\envs\virtalenvs\flask_myproject\lib\site-packages\flask_assets.py", line 292, in _app
    'and no application in current context')
RuntimeError: assets instance not bound to an application, and no application in current context

我做错了什么?

编辑:app.py 初始化资产:

from flask import Flask, render_template
from myflaskapp.assets import assets

    :param config_object: The configuration object to use.
    """
    app = Flask(__name__)
    app.config.from_object(config_object)
    register_extensions(app)
    register_blueprints(app)
    register_errorhandlers(app)
    return app

def register_extensions(app):
    assets.init_app(app)

def register_blueprints(app):
    app.register_blueprint(public.blueprint)
    app.register_blueprint(user.blueprint)

【问题讨论】:

标签: python flask bower webassets flask-assets


【解决方案1】:

正如我在评论中指出的那样,您必须将 Flask 应用程序绑定到该对象,正如它在回溯中指出的那样:

>>> RuntimeError: assets instance not bound to an application, and no 
    application in current context

这将解决您的问题,无论它是否与您的用例相关...:

def register_extensions(app):
    assets.init_app(app)
    with app.app_context():
         assets.load_path = ['static']

或者你可以重写你的创建应用程序来拥有

def create_assets(app):
    assets = Environment(app)
    ....
    assets.load_path ['static']
    return assets

def create_app():
    app = Flask()
    ....
    assets = create_assets(app)
    return app

您的错误的全部原因是您致电load_path。这会尝试在 webassets 中设置属性,您可以在此处查看:https://github.com/miracle2k/webassets/blob/95dff0ad6dcc25b81790a1585c67f5393e7d32af/src/webassets/env.py#L656

def _set_load_path(self, load_path):
    self._storage['load_path'] = load_path

现在,这会激活烧瓶资产对象上的 _storage 属性,导致它尝试执行此操作:https://github.com/miracle2k/flask-assets/blob/eb7f1905410828689086b80eb19be9331041ac52/src/flask_assets.py#L102

def __setitem__(self, key, value):
    if not self._set_deprecated(key, value):
        self.env._app.config[self._transform_key(key)] = value

如您所见,它需要访问应用程序,而当您使用load_path 时您没有提供应用程序,它会向您抱怨,正如它在 Traceback 中很好地解释的那样。我在烧瓶资产页面上找到了关于此的讨论:https://github.com/miracle2k/flask-assets/issues/35

您可能非常正确地认为,当您调用 init_app() 时,一切都应该没问题,但事实并非如此,init_app() 没有提供任何 appEnvironment 的参考:https://github.com/miracle2k/flask-assets/blob/eb7f1905410828689086b80eb19be9331041ac52/src/flask_assets.py#L338

def init_app(self, app):
    app.jinja_env.add_extension('webassets.ext.jinja2.AssetsExtension')
    app.jinja_env.assets_environment = self

我根本不使用烧瓶资产,所以我不太确定他们为什么没有用Environment().init_app 引用app,所以如果其他人知道,请大声说出来。

【讨论】:

  • 感谢 jonny,在您的帮助下,我在使用 app.app_context(): assets.load_path = ['static'] 更改为 assets.load_path= [os.path.join(os. path.dirname(file), 'static')]。不幸的是,当我推送到 heroku 时,输出文件没有放在静态目录中,请参阅stackoverflow.com/questions/36086581/…
猜你喜欢
  • 2023-03-14
  • 2022-11-14
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
相关资源
最近更新 更多