2016-03-24 10 views
3

私はFlaskを使用してアプリケーションを実装しており、ログディレクトリに入れたテキストファイルの内容を表示しようとしています。私のhtmlページのfiles.htmlでFlaskを使用して特定のディレクトリにファイルの内容を表示

@app.route('/files', methods = ['GET']) 
def config(): 
    if 'username' in session : 
     path = os.path.expanduser(u'~/path/to/log/') 
     return render_template('files.html', tree=make_tree(path)) 
    else: 
     return redirect(url_for('login')) 

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 

:だから私はこれを行っている

<title>Path: {{ tree.name }}</title> 
<h1>{{ tree.name }}</h1> 

<div class="accordion-heading" > 
    <div class="accordion-toggle" > 
     <a data-toggle="collapse" data-target="#files_list" href="#files_list"> 
      <b> 

<ul> 
{%- for item in tree.children recursive %} 
<div class="well well-sm"> <li>{{ item.name }} </div> 
    {%- if item.children -%} 
     <ul>{{ loop(item.children) }}</ul> 
    {%- endif %}</li> 
{%- endfor %} 
</ul> 

</b></div> 
     </a> 
    </div> 

これは私のログディレクトリ内のファイルの名前が表示されますが、私はのコンテンツを表示することはできませんよファイル。 は、私は多分、私のようなものを使用することができます考えた:すべてのヘルプ

import fnmatch 
def display_files(): 
    for dirpath, dirs, files in os.walk('log'): 
     for filename in fnmatch.filter(files, '*.*'): 
     with open(os.path.join(dirpath, filename)) as f: 
      file_contents = f.read().strip() 
      print file_contents 

    return render_template('files.html',title="index",file_contents=file_contents) 

をしてください?

+0

ようこそスタックオーバーフロー!ファイルの内容はどういう意味ですか? '.jpg'の場合は画像、' .py'の場合はソースコードです。 –

+0

はい、申し訳ありませんが、私はテキストファイルを意味しました。私は私の質問を編集します。ありがとう! – hey

+0

file_contentsを配列または辞書に格納する必要があります。すべてのファイルの内容をループし、file_contents変数を再割り当てするだけです。あなたのテンプレートに渡されるのは、最後のfile_contentsです。したがって、配列に追加するか、辞書に追加します。その後、テンプレート内のループを繰り返すことができます。 – wgwz

答えて

0

あなたはおそらく、あなたのファイルの内容を読み、そのようmake_tree機能にテンプレートにそれを渡すことができます:

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: 
       with open(fn) as f: 
        contents = f.read() 
       tree['children'].append(dict(name=name, contents=contents)) 
    return tree 

をし、ちょうどあなたがファイルの内容を表示したい場所に<pre>{{ item.contents }}</pre>を追加します。たとえば、ここに:

{%- for item in tree.children recursive %} 
    <div class="well well-sm"> 
     <li> 
      {{ item.name }} 
      <pre>{{ item.contents }}</pre> 
      {%- if item.children -%} 
       <ul>{{ loop(item.children) }}</ul> 
      {%- endif %} 
     </li> 
    </div> 
{%- endfor %} 

これは一見醜いですが、正しいデータが表示されます。

+0

Ilyaありがとう!これは動作します!ご協力いただきありがとうございます!非常に感謝:) – hey

+0

私は助けることができる嬉しい:) –

関連する問題