2012-07-09 18 views
6

Sono abbastanza nuovo per Flask, per quello che vale. Sto usando i blueprints per spezzare il mio codice e sto cercando di usare Flask-Assets per servire i collegamenti delle risorse. Per qualche ragione, però, non riesco a far funzionare Flask-Assets all'interno di un progetto.Risorse specifiche del modello in Flask usando Flask-Assets?

Struttura codice:

/modules 
    /base 
     __init__.py 
    __init__.py 
/static 
    # ... stuff 
/templates 
    /layout.html 

In /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') 

E il layout di base ha questo in esso:

{% assets "css_all" %} 
    <link rel="stylesheet" href="{{ ASSET_URL }}" /> 
{% endassets %} 
{% assets "js_all" %} 
    <script type="text/javascript" src="{{ ASSET_URL }}"></script> 
{% endassets %} 

In realtà quello che ho avere in /modules/base/__init__.py in questo momento non funziona nemmeno, dato che lancia "RuntimeError: lavorare al di fuori dell'applicazione co ntext". Se sposto il codice delle risorse nella funzione indice, funziona, ma sembra strano dover ripetere quel codice ogni volta che voglio aggiungere risorse. C'è un modo migliore per farlo? Mi sto perdendo qualcosa?

Edit: /modules/base/__init__.py Aggiornamento per il commento di codecool, ma ora viene generata: errore "TemplateSyntaxError Incontrato sconosciuto tag 'asset'". Penso che questo sia perché l'oggetto assets non viene passato attraverso l'app.

Edit 2: Quindi prendere qualche consiglio da come SQLAlchemy fa le cose, ho ottenuto questo al tipo di lavoro con il seguente:

Nel mio __init__.py principale:

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) 

In base/__ init__.py: dall'importazione del pallone Blueprint, render_template, richiesta da flask.ext.assets import Environment, Bundle dall'importazione flask current_app come app

Il trucco qui è creare risorse nel progetto, importarlo nel init di base e quindi chiamare .init_app lì. Dove questo si rompe, tuttavia, sta avendo due progetti che lo fanno. L'ultimo chiamato sempre vince. Forse sarebbe possibile estrapolarlo in qualche modulo comune o qualcosa del genere.

+0

Ho modificato la mia risposta con la soluzione del tuo nuovo problema. – codecool

risposta

7

Non è necessario chiamare il metodo _get_current_object su current_app e questo è il motivo per cui si sta verificando l'errore. current_app è in realtà un proxy per l'app. codice dovrebbe essere simile a questo:

app = current_app 
    assets = Environment(app) 

Infatti, non è necessario assegnare come variabile. Fare questo:

 from flask import current_app as app 

    assets = Environment(app) 

Hai trovato RuntimeError perché _get_current_object è disponibile solo quando una richiesta è in corso altrimenti bisogna usare current_app. Quando hai spostato il codice di inizializzazione delle risorse nella vista index, ha iniziato a funzionare come era ora all'interno di una richiesta.

L'utilizzo di _get_current_object_get_current_object entra in Segnali in Flask e potete leggerlo qui http://flask.pocoo.org/docs/signals/#sending-signals.

Edit:

Questo sta accadendo perché questo non è il posto giusto per inizializzare beni Flask. Deve essere inizializzato in modules/__init__.py dove l'ambiente jinja è impostato quando viene creata l'app. Ricordare che il codice dei progetti viene eseguito solo quando vi si accede. Tutte le inizializzazioni globali dovrebbero essere fatte nel modulo in cui è definita la tua app dove questo codice è presente:

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

a destra. current_object esiste solo nel contesto della richiesta. – Brent81

+0

che risolve il problema di non caricare, ma ora genera un errore: 'jinja2.exceptions.TemplateSyntaxError TemplateSyntaxError: Incontrato sconosciuta tag 'assets'.' Penso che sia perché il fiasco-Assets oggetto isn' in realtà viene aggiunto all'oggetto dell'app Flask. – greggilbert

+0

Ho provato a inizializzare anche le risorse nella base init, e questo non cambia nulla. Stai dicendo, quindi, che non è possibile che i progetti abbiano impostato le proprie risorse? Aggiornamento – greggilbert

Problemi correlati