私はFlaskにかなり慣れていません。ブループリントを使用してコードを分割し、Flask-Assets を使用してアセット リンクを提供しようとしています。しかし、何らかの理由で、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: working outside of application context」をスローするため、機能しません。アセット コードをインデックス関数に移動すると機能しますが、アセットを追加するたびにそのコードを繰り返さなければならないのは奇妙に思えます。これを行うより良い方法はありますか?何か不足していますか?
編集: codecool のコメントごとに /modules/base/__init__.py を更新しましたが、「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)
base/__init__.py 内: フラスコからブループリントをインポート、render_template、flask.ext.assets からリクエストをインポート、環境をインポート、フラスコからバンドルを app として current_app をインポート
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 にインポートしてから、そこで .init_app を呼び出すことです。ただし、これがうまくいかないのは、これを行う 2 つの設計図があることです。最後に呼び出されたものが常に勝ちます。たぶん、これをいくつかの共通モジュールまたは何かに引き出すことが可能になるでしょう..