2012-07-09 93 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