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