web-dev-qa-db-ja.com

静的フォルダーからjinjaを使用してjavascriptファイルをインポートします

Javascriptファイルのjinjaテンプレートにアクセスする必要があります(i18nタグのため)。だから私が見つけた方法は、jinjaメソッドからincludeを使ってjsファイルをロードすることです。 {% include "file.js" %}

ただし、このメソッドはテンプレートフォルダー内のファイルのみを検索します。ただし、jsファイルは静的フォルダーにある必要があります。私の質問は、jinjaがファイルを探す方法をどのように変更できますか?この場合、テンプレートフォルダーで検索する代わりに、静的フォルダーで検索します。

{% block javascript %}
    <script type="text/javascript">
        {% include "myscript.js" %}
    </script>
{% endblock %}
9
anvd

ファイルをテンプレートとして扱う必要がある場合、それは静的ではありません。テンプレートフォルダに入れてレンダリングします。ファイルがnot動的である場合、それは静的です。静的フォルダに入れてリンクします。特定のタイプのファイル必須がテンプレートまたは静的ファイルである必要はありません。必要な方を選んでください。

一方、異なる入力に基づいて異なるコードを生成するよりも、JSを静的に保ち、引数を渡す方がおそらく良いでしょう。

6
davidism

次のようなディレクトリ構造の例を考えます。

app/static/css/bootstrap.min.css
app/static/js/bootstrap.min.js
app/templates/test_page.html
app/views
run_server

アプリオブジェクトを作成するときにflask static_url_pathを設定できます

app = Flask(__name__, static_url_path='/static')

そしてtest_page.htmlであなたはこのように見える何かを持つことができます

<link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet">

 I am an HTML body

<script src="{{ url_for('static', filename='js/bootstrap.min.js') }}"></script>

静的URLパスを設定する必要はありませんが、上記がデフォルトであるため、長い間知らなかった便利な機能なので、表示したいと思います。

6
AlexLordThorsen

これを行うだけで、グローバル関数を作成して登録できます。

import os

app = Flask(__name__.split('.')[0])

@app.template_global()
def static_include(filename):
    fullpath = os.path.join(app.static_folder, filename)
    with open(fullpath, 'r') as f:
        return f.read()

そして、次のように含めることができます(safe-フィルターは引用符がエスケープされ始めるのを防ぎます):

{% block javascript %}
    <script type="text/javascript">
        {{ static_include("myscript.js") | safe }}
    </script>
{% endblock %}
4
doekman