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