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.
Ho modificato la mia risposta con la soluzione del tuo nuovo problema. – codecool