Blueprint -определенные активы в Flask с использованием Flask -Assets?

Я довольно новичок в Flask, чего бы это ни стоило. Я использую чертежи, чтобы разбить свой код, и пытаюсь использовать ресурсы Flask -для обслуживания ссылок на ресурсы. Однако по какой-то причине я не могу заставить Flask -Assets работать в проекте.

Структура кода:

/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 :, работающий вне контекста приложения». Если я перенесу код активов в функцию индекса, он сработает, но мне кажется странным повторять этот код каждый раз, когда я хочу добавить активы. Есть лучший способ это сделать? Я что-то упускаю?

Изменить:Обновлен /modules/base/ __init __.py в соответствии с комментарием codecool, но теперь он выдает ошибку «TemplateSyntaxError :Обнаружен неизвестный тег 'assets'». Я думаю, это связано с тем, что объект активов не передается в приложение.

Редактировать 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)

В базе/ __init __.py :из flask импортировать Blueprint, визуализировать _шаблон, запросить из flask.ext.assets импортировать среду, пакет из фляги импортировать текущее _приложение как приложение

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 _. Однако, где это ломается, так это в наличии двух чертежей, которые делают это. Выигрывает всегда последний вызванный.Может быть, можно было бы вытащить это в какой-то общий модуль или что-то в этом роде..

7
задан greggilbert 11 July 2012 в 03:03
поделиться