从Flask中的列表动态创建链接



我正试图动态创建一个指向静态文件夹中文件的链接列表,但由于嵌套的{{{}}}而失败,这在逻辑上是必需的。

Flask服务器在中有文件

/Static/FileFolder

它们被收集在一个列表中

FileList = []

for path in os.listdir(FileFolderPath):
if os.path.isfile(os.path.join(FileFolderPath, path)):
Filelist.append(path)

链路是用建立的

return render_template('list.html', FileList = FileList)

Html有这个

{% for item in FileList %}
<li><a href=" {{url_for('static', filename=' {{item}} ')  }}">{{item}}</a>  </li>
{% endfor %}

作为失败

filename=' {{item}} '

没有给我文件链接的url,只是一个指向的无意义链接

http://127.0.0.1:5020/static/%20%7B%7Bitem%7D%7D%20

其文件夹和名称错误。那么,我如何给出正确的文件夹,并在用于url_for{{}}的{{}}中放置一个指向{{item}}的链接呢?

如果你只使用一次jinja2标记,如下所示:

{% for link in links %}
<li><a href="/static/{{ link }}">{{ link }}</a>  </li>
{% endfor %}

另一种选择,但这主要取决于你想要完成什么,是在你的应用程序中添加另一条路线。py

@app.route('/static/<page>')
def get_link(page):
return f'{page}'

然后在你的html文件中:

<li><a href="{{ url_for('get_link', page=link) }}">{{ link }}</a></li>

此外,您可能需要考虑使用PEP8命名指南>https://peps.python.org/pep-0008/#type-变量名

您不需要在已经是jinja模板化的块中使用双大括号

templates/lists.html

{% for item in FileList %}
<li><a href=" {{ url_for('file', variable=item)  }}">{{item}}</a>  </li>
{% endfor %}

app.py

import os
from flask import Flask, render_template

app = Flask(__name__)

def funk():
FileList = []
FileFolderPath = '.'
for path in os.listdir(FileFolderPath):
if os.path.isfile(os.path.join(FileFolderPath, path)):
FileList.append(path)
return FileList

@app.route('/')
def hello_world():
FileList = funk()
return render_template('./list.html', FileList = FileList)

@app.route('/<variable>/')
def file(variable):
return variable

terminal

export FLASK_APP=app.py
flask run

tree

.
├── app.py
└── templates
   └── list.html

如前所述,您可以直接传递包含文件相对路径的变量,而不需要括号和引号。

请注意,您需要静态文件夹中的完整相对路径来引用具有url_for('static', filename=...)的文件。

以下示例使用pathlib模块来实现您的需求。

from pathlib import Path
@app.route('/')
def index():
# ./static/path/to/folder/
p = Path(app.static_folder, 'path', 'to', 'folder')
filenames = [x.relative_to(app.static_folder) for x in p.iterdir() if x.is_file()]
return render_template('index.html', **locals())
<ul>
{% for filename in filenames -%}
<li><a href="{{ url_for('static', filename=filename) }}">{{ filename }}</a></li>
{% endfor -%}
</ul>

相关内容

  • 没有找到相关文章

最新更新