从静态文件夹中使用 jinja 导入 javascript 个文件

Import javascript files with jinja from static folder

我需要访问 javascript 文件中的 jinja 模板(由于 i18n 标签)。所以我发现的方法是从 jinja 方法中加载包含 include 的 js 文件。 {% include "file.js" %}

但是,此方法将仅在模板文件夹中查找文件。但是 js 文件必须在静态文件夹中。我的问题是,如何更改 jinja 查找文件的方式?在这种情况下,不是在模板文件夹中搜索,而是在静态文件夹中搜索。

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

如果您需要将文件视为模板,那么它不是静态的。将其放入模板文件夹并进行渲染。如果文件 不是 动态的,那么它就是静态的。将它放在静态文件夹中并 link 到它。没有要求给定类型的文件 必须 是模板或静态文件。选择需要的一个。

另一方面,保持 JS 静态并向其传递参数可能更好,而不是根据不同的输入生成不同的代码。

给出一个如下所示的示例目录结构

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

您可以在创建应用程序对象时设置烧瓶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 %}