所以我想出了一个解决我自己问题的令人满意的方式。
我设法得到这个非常实用的结果:
请注意,我的模板仅适用于具有.html
扩展名的文件好,但它可以很容易地增强,以支持其他文件扩展名。
这是我的最后定稿templates\template.html
文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Docs Demo</title>
<link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
</head>
<body>
<div id="container">
<div class="left_frame">
<h1>{{ tree.name }}</h1>
<ul>
{%- for item in tree.children recursive %}
{% if '.html' in item.name %}
<li><a href="docs/{{ item.name }}" target="iframe1">
{{ item.name.split('/')[-1:][0] }}
{%- if item.children -%}
<ul>{{ loop(item.children) }}</ul>
{%- endif %}</a></li>
{% else %}
<li>{{ item.name }}
{%- if item.children -%}
<ul>{{ loop(item.children) }}</ul>
{%- endif %}</li>
{% endif %}
{%- endfor %}
</ul>
</div>
<div class="right_frame">
<iframe name="iframe1"></iframe>
</div>
</div>
</body>
</html>
你可以参考王刷新的回答为我在template.html
文件已经更改为正确的,使这项工作进行了分析。
这里是demo_app.py
脚本,通过瓶用于我的文档HTML文件:在demo_app.py
因为问我原来的问题
import threading
import os
import webbrowser
from flask import Flask, render_template, send_from_directory
app = Flask(__name__, static_folder='static')
ROOT = os.path.dirname(os.path.abspath(__file__))
DOCS_ROOT = os.path.join(app.static_folder, 'docs')
@app.route('/')
def docs_tree():
return render_template('template.html', tree=make_tree(DOCS_ROOT))
@app.route('/docs/<path:filename>')
def send_docs(filename):
return send_from_directory(directory=DOCS_ROOT, 'docs'), filename=filename)
def make_tree(path):
tree = dict(name=os.path.basename(path), children=[])
try:
lst = os.listdir(path)
except OSError:
pass # ignore errors
else:
for name in lst:
fn = os.path.join(path, name)
if os.path.isdir(fn):
tree['children'].append(make_tree(fn))
else:
np = os.path.join(path.replace(DOCS_ROOT, ''), name).replace('\\', '/')
if np.startswith('/'):
np = np[1:]
tree['children'].append(dict(name=np))
return tree
if __name__ == '__main__':
host = 'localhost'
port = '8888'
url = 'http://{h}:{p}'.format(h=host, p=port)
threading.Timer(3, lambda: webbrowser.open(url)).start()
app.run(host=host, port=port, debug=False)
最显着的变化如下:
- 初始化
app
后,我使用app.static_folder
设置DOCS_ROOT
;
- 在函数
send_docs()
中,我将send_from_directory()
的directory
参数更改为使用DOCS_ROOT
;
里面的make_tree()
,该for
循环else
块里面,我说:
np = os.path.join(path.replace(DOCS_ROOT, ''), name).replace('\\', '/')
if np.startswith('/'):
np = np[1:]
这一切确实是采取name
绝对路径,删除哪些匹配DOCS_ROOT
,只留下相对路径(和然后将\\
替换为/
),从而产生从static/docs
的简单相对路径。如果相对路径以/
开始,我将其删除(因为从docs
在template.html
尾/
。
任何有兴趣的简单样式表(static\styles.css
)我用(以及一些更新的增强):
html {
min-height:100%;
position:relative;
}
body {
overflow:hidden;
}
.container {
width:100%;
overflow:auto;
}
.left_frame {
float:left;
background:#E8F1F5;
width:25%;
height:100vh;
}
.right_frame {
float:right;
background:#FAFAFA;
width:75%;
height:100vh;
}
.right_frame iframe {
display:block;
width:100%;
height:100%;
border:none;
}
您是否尝试过构建包含所有路径名称的树:https://stackoverflow.com/questions/10961378/how-to-generate-an-html-directory-list-using-python? – jbndlr
@jbndlr这正是我最初看到的帖子。这就是我结束的地方。幸运的是,我找到了解决我遇到的问题的解决方案。谢谢。 –