【问题标题】:Loading external script with jinja2 template directive使用 jinja2 模板指令加载外部脚本
【发布时间】:2011-03-25 15:30:10
【问题描述】:

我对 jinja2 和一般模板的使用非常陌生,所以我想知道是否有一种简单的方法可以加载外部 javascript。我正在考虑使用:

{% block javascript %}
    <script src="myscript.js"></script>
{% endblock %}

但我忍不住要问:

有没有办法直接从模板指令中加载这个脚本?

【问题讨论】:

    标签: python templates scripting jinja2 external


    【解决方案1】:

    你有两个选择——第一个是你做的方式——只需将适当的标记添加到模板中(或者如果你希望能够在扩展你的第一个模板的模板中覆盖它,则添加一个块。)

    第二种方式是使用Jinja2的include函数:

    {% block javascript %}
        <script type="text/javascript">
            {% include "myscript.js" %}
        </script>
        <!-- The contents of myscript.js will be loaded inside the script tag -->
    {% endblock %}
    

    使用include 的优点是Jinja2 会在包含它之前处理您的javascript ——这意味着您可以在您的javascript 中拥有根据程序状态而变化的变量。

    以这种方式使用include 的缺点是相同的——您的.js 文件将在发送之前通过Jinja2 运行——如果您不使用动态内容,您将只是不必要地处理文件每个请求——如果你使用的是带有 Jinja2 语法的 javascript 模板库,那么很可能会出现问题。

    【讨论】:

    • 所以这基本上将包括这些标签之间的文件 myscript.js 中的所有内容,我是对的吗?有什么理由我不能用它来包含文本文件或其他东西?
    • @kirbuchi -- 是的,完全正确。同样的权衡也适用。
    • 肖恩,谢谢。您可以从静态文件夹中包含,还是包含仅在模板文件夹中有效?我问这个,因为 myscript.js 应该在静态文件夹中。
    【解决方案2】:

    这个问题已经很老了,但还有另一种方法可能也很有趣。我在使用 Jinja2flask 时发现了它。

    我使用了url_for(),它工作正常:

    {% block javascript %}
        <script src="{{ url_for('static',filename='myscript.js') }}"></script>
    {% endblock %}
    

    我的 myscript.js 在我的静态文件夹中。在 Jinja2 环境中指定,或者默认在 flask 中。

    【讨论】:

    • 代码应在{{之前和}}之后包含",即src="{{ url_for('static',filename='myscript.js') }}",否则为无效HTML
    • 谢谢,很好的收获;)
    猜你喜欢
    • 1970-01-01
    • 2019-11-05
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多