所以我想出了一個解決我自己問題的令人滿意的方式。
我設法得到這個非常實用的結果: ![Flask serving Docs demo](https://i.stack.imgur.com/czYoS.png)
請注意,我的模板僅適用於具有.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這正是我最初看到的帖子。這就是我結束的地方。幸運的是,我找到了解決我遇到的問題的解決方案。謝謝。 –