2012-07-09 44 views
6

我对Flask很新奇,因为它值得。我正在使用蓝图来分解我的代码,并试图使用Flask-Assets来提供资产链接。但出于某种原因,我无法让Flask-Assets在蓝图内工作。使用Flask-Assets的Flask特定资产在Flask中?

代码结构:

/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:在应用程序之外工作NTEXT”。如果我将资产代码移动到索引函数中,它确实有效,但每次我想要添加资源时都必须重复该代码似乎很奇怪。有一个更好的方法吗?我错过了什么吗?

编辑:每codecool的评论更新/modules/base/__init__.py,但现在它抛出一个“TemplateSyntaxError:遇到未知标签的资产'”的错误。我认为这是因为资产对象没有传递给应用程序。

编辑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) 

在flask/__ init__.py: from flask导入Blueprint,render_template,请求从flask.ext.assets导入环境,请求 从flask导入current_app导入环境,Bundle 作为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。但是,如果发生这种情况,有两个蓝图可以做到这一点。最后一个总是胜出。也许它可以把这个拉出到一些通用的模块或什么..

+0

我编辑了我的答案并解决了你的新问题。 – codecool 2012-07-10 06:11:12

回答

7

你不需要拨打_get_current_object方法current_app这就是为什么你会得到错误。 current_app实际上是应用程序的代理。 代码应该是这样的:

app = current_app 
    assets = Environment(app) 

逸岸,你并不需要将其指定为变量。这样做:

 from flask import current_app as app 

    assets = Environment(app) 

你得到RuntimeError因为_get_current_object只有当一个请求是怎么回事有效,否则,你必须使用current_app。当您在index视图内移动资产初始化代码时,它开始工作,因为它现在在请求中。

_get_current_object'的用法在于Flask的信号功能,你可以在这里阅读关于它的信息http://flask.pocoo.org/docs/signals/#sending-signals

编辑:

发生这种情况,因为这不是初始化瓶资产在正确的地方。它必须在modules/__init__.py初始化,其中创建应用程序时设置jinja环境。 记住蓝图代码仅在访问时才运行。所有的全局初始化应该在定义你的应用程序的模块中完成,即代码存在的地方:

app = Flask(__name__) 
    assets = Environment(app) 
+0

没错。 current_object只存在于请求上下文中。 – Brent81 2012-07-09 06:10:28

+0

,可解决这不加载的问题,但现在它抛出一个错误: 'jinja2.exceptions.TemplateSyntaxError TemplateSyntaxError:遇到未知的标记“assets'.' 我想这是因为瓶资产对象ISN”实际上是附加到Flask应用程序对象。 – greggilbert 2012-07-09 23:35:56

+0

我试着初始化基本init中的资产,但这并没有改变任何东西。那么你是否在说,蓝图不可能设置自己的资产? – greggilbert 2012-07-11 02:14:46