使用 Python/Flask 迭代 HTML 模板中的 URL 列表

acp*_*eon 3 html javascript python flask

这似乎是一个非常基本的问题,但我无法弄清楚。我将 URL 列表传递到 HTML 页面并尝试在 href 标记中打印出每个 URL。我正在使用 Flask 运行测试服务器,并且可以确认变量被正确传入(我可以从中打印出整个列表或元素)。

我的应用路线:

import doaudit # separate Py script that gets these urls

@app.route('/audit', methods = ['GET'])
def audit():
    return render_template('audit.html', listOfUrls = doaudit.listOfUrls)
Run Code Online (Sandbox Code Playgroud)

我的模板:

<html>
    <head>
        <title>Data Audit</title>   
</head>
<body>

        {% for url in listOfUrls %}        
        <script language="JavaScript">
            document.write( "<a href=\"" + url + "\">linktext</a>" );
        </script>
        {% endfor %}

    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方面的变化:

document.write( "<a href=\"" + '{{ listOfUrls[i] }}' + "\">linktext</a>" );
Run Code Online (Sandbox Code Playgroud)

并迭代所有 i 但这也不起作用。

列表的长度可能会有所不同,因此我需要一个迭代解决方案。提前致谢。

jad*_*k94 5

这就是你想要的:

{% for url in listOfUrls %}        
    <script language="JavaScript">
        document.write( "<a href=\"" + {{ url|tojson|safe }} + "\">linktext</a>" );
    </script>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

{{ url }}部分告诉 Jinja2(模板引擎)这url实际上是您在for url in blabla. 没有它,它会按原样打印。在浏览器中查看源时可以看到它。这意味着它将被解释为一个 JS 变量,它undefined相当于一个空字符串,然后你会看到它。

编辑:添加了tojson|safe调用,以确保它不会破坏 JS 代码。你可以这样来做:<a href=\"{{ url }}\">linktext</a>。但是这样"会破坏你的 html/js 代码。

编辑2:在什么tojson过滤器呢,是使其适合JS代码里面放。并且safe过滤器告诉渲染引擎它不应将其视为任何文本(应将其转义以在 HTML 中正确显示),而应将其视为安全文本(无论是否为 HTML)。