【问题标题】:Import javascript files with jinja from static folder [duplicate]从静态文件夹中导入带有 jinja 的 javascript 文件 [重复]
【发布时间】:2015-06-02 20:15:36
【问题描述】:
我需要访问 javascript 文件中的 jinja 模板(由于 i18n 标签)。所以我发现的方法只是从 jinja 方法中加载包含包含的 js 文件。 {% include "file.js" %}
但是,此方法将仅在模板文件夹中查找文件。但是js文件必须在静态文件夹中。我的问题是,我怎样才能改变 jinja 查找文件的方式?在这种情况下,不要在模板文件夹中搜索,而是在静态文件夹中搜索。
{% block javascript %}
<script type="text/javascript">
{% include "myscript.js" %}
</script>
{% endblock %}
【问题讨论】:
标签:
python
flask
jinja2
template-engine
【解决方案1】:
如果您需要将文件视为模板,则它不是静态的。把它放在模板文件夹中并渲染它。如果文件是非动态的,那么它就是静态的。将它放在静态文件夹中并链接到它。没有要求给定类型的文件必须是模板或静态文件。选择一个必要的。
另一方面,最好让 JS 保持静态并向其传递参数,而不是根据不同的输入生成不同的代码。
【解决方案2】:
给定一个如下所示的示例目录结构
app/static/css/bootstrap.min.css
app/static/js/bootstrap.min.js
app/templates/test_page.html
app/views
run_server
你可以在创建app对象的时候设置flaskstatic_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 路径,但由于上面显示的是默认值,因此我想展示它,因为这是我很久不知道的功能并且很有用。
【解决方案3】:
您可以这样做创建和注册一个全局函数:
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-filter 防止引号开始转义):
{% block javascript %}
<script type="text/javascript">
{{ static_include("myscript.js") | safe }}
</script>
{% endblock %}