如何从呈现的HTML模板中呈现JS模板?

Cal*_*laf 3 javascript python jinja2 flask

如果我想通过Jinja2生成JavaScript代码,而不仅仅是HTML,我是否坚持保持JS代码内联,或者我有没有办法引用脚本?

具体来说:

app.py

from flask import Flask, render_template
app = Flask(__name__)
app.config['DEBUG'] = True

@app.route('/')
def index():
    return render_template('index.html', name='Sebastian', color='pink')

if __name__ == '__main__':
    app.run()
Run Code Online (Sandbox Code Playgroud)

的index.html

<!DOCTYPE html>
<html>
    <head>
        <meta content="utf-8" http-equiv="encoding">
        <script>
            function myEnterFunction() {
                element = document.getElementById("demo");
                element.style.backgroundColor = "{{ color }}";
            }
        </script>
    </head>
    <body>
        <p>Hello {{ name }}</p>
        <div onmouseenter="myEnterFunction()">
            <p>onmouseenter:
                <span id="demo">Mouse over me!</span>
            </p>
        </div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

如果JavaScript代码是内联的,这可以正常工作,但如果我们想保持整洁并引用一个单独的文件呢?

<head>
    <meta content="utf-8" http-equiv="encoding">
    <script src="code.js"></script>
</head>
Run Code Online (Sandbox Code Playgroud)

也许,这可以通过替代来实现src="code.js"

{% render_template('code.js', color=color) %}
Run Code Online (Sandbox Code Playgroud)

在渲染HTML模板时,您能看到如何渲染JS模板吗?

Sin*_*clu 8

您可以添加生成JS的路由.

@app.route('/script.js')
def script():
    return render_template('script.js', color='pink')
Run Code Online (Sandbox Code Playgroud)

在script.js中,这应该与其他模板位于同一个文件夹中:

 function myEnterFunction() {
                element = document.getElementById("demo");
                element.style.backgroundColor = "{{ color }}";
            }
Run Code Online (Sandbox Code Playgroud)

在你的layout.html中:

<script src="{{url_for('script')}}"></script>
Run Code Online (Sandbox Code Playgroud)

Jinja2将解析包含它的语法的任何文件.