我对 Flask 很陌生,因为它的价值。我正在使用蓝图来分解我的代码,并尝试使用 Flask-Assets 来提供资产链接。但是,出于某种原因,我无法让 Flask-Assets 在蓝图中工作。
代码结构:
/modules
/base
__init__.py
__init__.py
/static
# ... stuff
/templates
/layout.html
在 /modules/base/__init__.py 中:
from flask import Blueprint, render_template, request
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.assets import Environment, Bundle
from flask import current_app as app
default = Blueprint('base', __name__)
assets = Environment(app)
css = Bundle('css/bootstrap.min.css')
assets.register('css_all', css)
js = Bundle('js/jquery-1.7.2.min.js', 'js/bootstrap.min.js')
assets.register('js_all', js)
@default.route('/')
def index():
return render_template('index/index.html')
基本布局中有这个:
{% assets "css_all" %}
<link rel="stylesheet" href="{{ ASSET_URL }}" />
{% endassets %}
{% assets "js_all" %}
<script type="text/javascript" src="{{ ASSET_URL }}"></script>
{% endassets %}
实际上,我现在 /modules/base/__init__.py 中的内容甚至都不起作用,因为它会抛出“RuntimeError:在应用程序上下文之外工作”。如果我将资产代码移动到索引函数中,它确实可以工作,但是每次我想添加资产时都必须重复该代码似乎很奇怪。有一个更好的方法吗?我错过了什么吗?
编辑:根据 codecool 的评论更新 /modules/base/__init__.py,但现在它会引发“TemplateSyntaxError:遇到未知标签‘assets’”错误。我认为这是因为资产对象没有传递到应用程序。
编辑 2:因此,从 SQLAlchemy 的工作方式中获取一些建议,我得到了以下工作:
在我的主要 __init__.py 中:
from flask import Flask
from modules.base import default, assets as base_assets
from flask.ext.assets import Environment, Bundle
app = Flask(__name__)
app.register_blueprint(default)
base_assets.init_app(app)
在 base/__init__.py 中:from flask import Blueprint、render_template、request from flask.ext.assets import Environment、Bundle from flask import current_app as app
default = Blueprint('base', __name__)
assets = Environment(app)
css = Bundle('css/bootstrap2.min.css')
assets.register('css_all', css)
js = Bundle('js/jquery-1.7.2.min.js', 'js/bootstrap.min.js')
assets.register('js_all', js)
这里的技巧是在蓝图中创建资产,将其导入基本 init,然后在那里调用 .init_app。然而,这失败的地方在于有两个蓝图可以做到这一点。最后一个叫的总是赢。也许可以将其拉出到某个通用模块或其他东西中..