2012-06-09 15 views
15

私は、Pythonを使用してhtmlドキュメントを生成する際にいくつか問題があります。私は、ディレクトリツリーのHTMLリストを作成しようとしています。これは私が今までに持っているものです:Pythonを使用してhtmlディレクトリリストを生成する方法

ルートディレクトリ、1レベルのサブディレクトリとファイルしかないとうまくいくようです。しかし、別のレベルのサブディレクトリを追加すると問題が発生します(クローズタグは、私が思うところで十分な時間入力されないためです)。しかし、私はそれの周りに頭を下げるのは苦労している。

この方法ではできない場合は、より簡単な方法がありますか?私はフラスコを使用していますが、私は非常にテンプレートで未熟なので、おそらく私は何かを欠いています。

+3

[フラスコ-のautoindex](http://packages.python.org/Flask-AutoIndex/) – jfs

答えて

34

ディレクトリツリーの生成とそのレンダリングをhtmlで区切ることができます。

あなたは、単純な再帰関数使用することができ、ツリー生成するには:templates/dirtree.htmlファイルにHTMLを入れ

<!doctype html> 
<title>Path: {{ tree.name }}</title> 
<h1>{{ tree.name }}</h1> 
<ul> 
{%- for item in tree.children recursive %} 
    <li>{{ item.name }} 
    {%- if item.children -%} 
     <ul>{{ loop(item.children) }}</ul> 
    {%- endif %}</li> 
{%- endfor %} 
</ul> 

:あなたはJinja2ののループrecursive機能を使用することができ、HTMLとしてレンダリングするには

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: 
       tree['children'].append(dict(name=name)) 
    return tree 

を。 、それをテストし、次のコードを実行し、http://localhost:8888/を訪問する :

import os 
from flask import Flask, render_template 

app = Flask(__name__) 

@app.route('/') 
def dirtree(): 
    path = os.path.expanduser(u'~') 
    return render_template('dirtree.html', tree=make_tree(path)) 

if __name__=="__main__": 
    app.run(host='localhost', port=8888, debug=True) 
+0

これは完璧に動作します。 – bem3ry

+0

すばらしい解決策。ありがとう。 – under5hell

+0

あなたがJinjaに慣れていないなら、 'dirtree.html'テンプレートファイルは' templates'ディレクトリにある必要があります。 –

関連する問題