2012-07-09 10 views
6

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 ...

+0

He editado mi respuesta con la solución de su nuevo problema. – codecool

Respuesta

7

No necesita llamar al método _get_current_object en current_app y es por eso que está recibiendo el error. current_app es en realidad un proxy para la aplicación. Código debería ser así:

app = current_app 
    assets = Environment(app) 

De hecho, no es necesario asignar como variable. Haga lo siguiente:

 from flask import current_app as app 

    assets = Environment(app) 

Usted está recibiendo RuntimeError porque _get_current_object sólo está disponible cuando una solicitud está pasando lo contrario tendrá que utilizar current_app. Cuando movió los activos inicializando el código dentro de la vista index, entonces comenzó a funcionar como lo estaba ahora dentro de una solicitud.

El uso de _get_current_object viene en la funcionalidad Señales en el Frasco y puede leerlo aquí http://flask.pocoo.org/docs/signals/#sending-signals.

Editar:

Esto está ocurriendo porque este no es el lugar adecuado para inicializar activos frasco. Tiene que inicializarse en modules/__init__.py donde se configura el entorno jinja cuando se crea la aplicación. Recuerde que el código de los planos se ejecuta solo cuando se accede a él. Todas las inicializaciones globales deben realizarse en el módulo donde está definida su aplicación, es decir, donde aparece este código:

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

a la derecha. current_object solo existe en el contexto de solicitud. – Brent81

+0

que resuelve el problema de que no se carga, pero ahora se lanza un error: 'jinja2.exceptions.TemplateSyntaxError TemplateSyntaxError: Encontró etiqueta desconocida 'assets'.' creo que eso es debido a que los matraz de Activos objeto ISN' En realidad, se adjunta al objeto de la aplicación Flask. – greggilbert

+0

Intenté inicializar activos en el init base también, y eso no cambia nada. ¿Estás diciendo, entonces, que no es posible tener planos que establezcan sus propios activos? – greggilbert

Cuestiones relacionadas