Python 使用烧瓶资产在烧瓶中设计特定资产?
我对烧瓶是个新手,不管它值多少钱。我正在使用蓝图来分解代码,并尝试使用Flask资产来提供资产链接。然而,由于某些原因,我无法让Flask资产在蓝图中工作 代码结构:Python 使用烧瓶资产在烧瓶中设计特定资产?,python,flask,Python,Flask,我对烧瓶是个新手,不管它值多少钱。我正在使用蓝图来分解代码,并尝试使用Flask资产来提供资产链接。然而,由于某些原因,我无法让Flask资产在蓝图中工作 代码结构: /modules /base __init__.py __init__.py /static # ... stuff /templates /layout.html 在/modules/base/\uuuuu init\uuuuuuu.py中: from flask import
/modules
/base
__init__.py
__init__.py
/static
# ... stuff
/templates
/layout.html
在/modules/base/\uuuuu init\uuuuuuu.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')
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)
基本布局中包含以下内容:
{% assets "css_all" %}
<link rel="stylesheet" href="{{ ASSET_URL }}" />
{% endassets %}
{% assets "js_all" %}
<script type="text/javascript" src="{{ ASSET_URL }}"></script>
{% endassets %}
在base/\uuuu init\uuuuu.py中:
从flask导入蓝图、渲染模板、请求
从flask.ext.assets导入环境,绑定
从flask导入当前的应用程序作为应用程序
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)
这里的技巧是在blueprint中创建资产,将其导入基本init,然后在那里调用.init_应用程序。然而,问题在于有两个这样做的蓝图。最后一个打电话的总是胜出。也许可以将它拉到某个公共模块或某物中。您不需要在
当前应用程序上调用\u get\u current\u object
方法,这就是出现错误的原因<代码>当前应用程序
实际上是该应用程序的代理。
代码应该是这样的:
app = current_app
assets = Environment(app)
实际上,您不需要将其指定为变量。这样做:
from flask import current_app as app
assets = Environment(app)
您收到RuntimeError,因为只有在请求进行时,\u get\u current\u object
才可用,否则您必须使用current\u app
。当您在索引
视图中移动资产初始化代码时,它开始工作,因为它现在在请求中
\u get\u current\u object
的用法来自Flask中的信号功能,您可以在此处阅读
编辑:
发生这种情况是因为这里不是初始化Flask资产的正确位置。它必须在创建应用程序时设置jinja环境的模块/\uuuu init\uuuu.py
中初始化。
请记住,蓝图代码只有在被访问时才运行。所有全局初始化都应在定义应用程序的模块中完成,即存在以下代码的模块:
app = Flask(__name__)
assets = Environment(app)
这里的技巧是在蓝图中创建资产,并将其导入到
基本初始化,然后在那里调用.init_应用程序。这在哪里中断
然而,下降是因为有两个这样做的蓝图。最后一个
打电话总是赢。也许有可能把它拉出来
一些普通的模块或者什么的
看看这篇文章。它很好地解释了如何使资产蓝图具体化
您可以在任何地方声明捆绑包。在本文中,它们在单独的文件assets.py
中声明。或者,您可以在自己声明蓝图的位置设置特定于蓝图的捆绑包。然后将它们导入主项目\uuuu init\uuuu.py
文件,并在注册蓝图后注册它们
我在这里修改了您的示例:
/\uuuuuu init\uuuuuuuuu.py
:
from flask import Flask
from flask-assets import Environment
from modules.base import bp as base_bp, assets as base_assets
# Assuming more blueprints in addition to modules.base...
from modules.home import bp as home_bp, assets as home_assets
from modules.auth import bp as auth_bp, assets as auth_assets
# Declare Flask App
app = Flask(__name__)
# Register Blueprints
app.register_blueprint(base_bp)
app.register_blueprint(home_bp)
app.register_blueprint(auth_bp)
# Register Assets
bundles = {**base_assets, **home_assets, **auth_assets} # Combines all bundle-dictionaries into one
assets = Environment(app)
assets.register(bundles)
from flask import Blueprint, render_template
from flask-assets import Bundle
# Declare Blueprint
bp = Blueprint("base", __name__)
# Declare Blueprint-Specific Assets
bundles = {
"base_css": Bundle(
"base/css/bootstrap.min.css"
),
"base_js": Bundle(
"base/js/jquery-1.7.2.min.js",
"base/js/bootstrap.min.js"
)
}
@bp.route('/')
def index():
return render_template('index/index.html')
/modules/base/\uuuuuu init\uuuuuuu.py
:
from flask import Flask
from flask-assets import Environment
from modules.base import bp as base_bp, assets as base_assets
# Assuming more blueprints in addition to modules.base...
from modules.home import bp as home_bp, assets as home_assets
from modules.auth import bp as auth_bp, assets as auth_assets
# Declare Flask App
app = Flask(__name__)
# Register Blueprints
app.register_blueprint(base_bp)
app.register_blueprint(home_bp)
app.register_blueprint(auth_bp)
# Register Assets
bundles = {**base_assets, **home_assets, **auth_assets} # Combines all bundle-dictionaries into one
assets = Environment(app)
assets.register(bundles)
from flask import Blueprint, render_template
from flask-assets import Bundle
# Declare Blueprint
bp = Blueprint("base", __name__)
# Declare Blueprint-Specific Assets
bundles = {
"base_css": Bundle(
"base/css/bootstrap.min.css"
),
"base_js": Bundle(
"base/js/jquery-1.7.2.min.js",
"base/js/bootstrap.min.js"
)
}
@bp.route('/')
def index():
return render_template('index/index.html')
/modules/base/templates/layout.html
:
{% assets "base_css" %}
<link rel="stylesheet" href="{{ ASSET_URL }}" />
{% endassets %}
{% assets "base_js" %}
<script type="text/javascript" src="{{ ASSET_URL }}"></script>
{% endassets %}
{%assets“base_css”%}
{%endassets%}
{%assets“base_js”%}
{%endassets%}
解决了it未加载的问题,但是现在它抛出了一个错误:jinja2.exceptions.TemplateSyntaxError TemplateSyntaxError:遇到了未知的标记“assets”。
我想这是因为Flask assets对象实际上没有附加到Flask app对象。我也尝试过在base init中初始化资产,这不会改变任何事情。那么,你是说不可能让蓝图设定自己的资产吗?@gchucky是的!扩展应在main init.py中初始化。这很好。我已经用你新问题的解决方案编辑了我的答案。