Javascriptファイルのjinjaテンプレートにアクセスする必要があります(i18nタグのため)。だから私が見つけた方法は、jinjaメソッドからincludeを使ってjsファイルをロードすることです。 {% include "file.js" %}
ただし、このメソッドはテンプレートフォルダー内のファイルのみを検索します。ただし、jsファイルは静的フォルダーにある必要があります。私の質問は、jinjaがファイルを探す方法をどのように変更できますか?この場合、テンプレートフォルダーで検索する代わりに、静的フォルダーで検索します。
{% block javascript %}
<script type="text/javascript">
{% include "myscript.js" %}
</script>
{% endblock %}
ファイルをテンプレートとして扱う必要がある場合、それは静的ではありません。テンプレートフォルダに入れてレンダリングします。ファイルがnot動的である場合、それは静的です。静的フォルダに入れてリンクします。特定のタイプのファイル必須がテンプレートまたは静的ファイルである必要はありません。必要な方を選んでください。
一方、異なる入力に基づいて異なるコードを生成するよりも、JSを静的に保ち、引数を渡す方がおそらく良いでしょう。
次のようなディレクトリ構造の例を考えます。
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パスを設定する必要はありませんが、上記がデフォルトであるため、長い間知らなかった便利な機能なので、表示したいと思います。
これを行うだけで、グローバル関数を作成して登録できます。
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 %}