Soy bastante nuevo en Flask, por lo que vale la pena. Estoy usando blueprints para romper mi código y estoy tratando de usar Flask-Assets para servir enlaces de activos. Por alguna razón, sin embargo, no puedo hacer que los Flask-Assets funcionen dentro de un blueprint.Activos específicos de planos en Flask utilizando Flask-Assets?
estructura Código:
/modules
/base
__init__.py
__init__.py
/static
# ... stuff
/templates
/layout.html
En /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')
Y el diseño de base tiene esto en él:
{% assets "css_all" %}
<link rel="stylesheet" href="{{ ASSET_URL }}" />
{% endassets %}
{% assets "js_all" %}
<script type="text/javascript" src="{{ ASSET_URL }}"></script>
{% endassets %}
En realidad lo que yo tener en /modules/base/__init__.py en este momento ni siquiera funciona, ya que arroja "RuntimeError: trabajando fuera de la aplicación co ntext ". Si muevo el código de activos a la función de índice, funciona, pero parece extraño tener que repetir ese código cada vez que quiero agregar activos. ¿Hay una mejor manera de hacer esto? ¿Me estoy perdiendo de algo?
Editar: /modules/base/__init__.py Actualizado por el comentario de codecool, pero ahora se lanza un: error "Se encontró TemplateSyntaxError etiqueta desconocida 'activos'". Creo que esto es porque el objeto activo no se transfiere a la aplicación.
Edición 2: Tan tomar algunos consejos de cómo SQLAlchemy hace las cosas, tengo este tipo de trabajo a la siguiente:
En mi __init__.py principal:
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)
En base/__ init__.py: desde el matraz, importe Blueprint, render_template, request desde el archivo frasco.ext.assets import Environment, paquete desde el frasco importe current_app como aplicación
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)
El truco aquí es crear activos en el blueprint, importarlo en el init básico, y luego llamar .init_app allí. Sin embargo, donde esto se descompone es en tener dos planos que hacen esto. El último llamado siempre gana. Tal vez sería posible sacar esto en algún módulo común o algo ...
He editado mi respuesta con la solución de su nuevo problema. – codecool