Python 使用烧瓶资产在烧瓶中设计特定资产?

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

我对烧瓶是个新手,不管它值多少钱。我正在使用蓝图来分解代码,并尝试使用Flask资产来提供资产链接。然而,由于某些原因,我无法让Flask资产在蓝图中工作

代码结构:

/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中初始化。这很好。我已经用你新问题的解决方案编辑了我的答案。