2016-03-24 32 views
3

Flask kullanarak bir uygulama uyguluyor ve log dizinine koyduğum metin dosyalarının içeriğini görüntülemeye çalışıyorum. Yani ben yapmış:Flask kullanarak belirli bir dizindeki dosyaların içeriğini görüntüleme

@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 
benim html sayfası files.html içinde

: my günlük dizininin içindeki dosyaların

<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> 

Bu yalnızca görüntüler isimlerin ama içeriğini görüntülemek mümkün değilim dosyalar. ben gibi bir şey kullanabilirsiniz düşündüm:

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) 

Herhangi bir yardım lütfen ??

+0

Yığın Taşmasına Hoş Geldiniz! Dosyaların içeriği ile ne demek istiyorsun? '.jpg' ise resim gibi ve' .py' ise kaynak kodu gibi? –

+0

evet üzgünüm, metin dosyalarını kastediyorum. Sorumu düzenleyeceğim. Teşekkürler! – hey

+0

Dosya_içeriklerini bir dizide veya bir sözlükte depolamanız gerekir. Tüm dosya içeriği üzerinde döngü yapıyor ve sadece file_contents değişkenini yeniden ataıyorsunuz. Şablonunuza gönderilen tüm son dosya_içindendir. Yani ya bir diziye ekleyebilir veya bir sözlüğe ekleyebilirsiniz. Ardından, şablonunuzda bunun üstesinden gelebilirsiniz. – wgwz

cevap

0

Muhtemelen dosyanın içeriğini okumak ve böyle make_tree işlevinde şablona geçirebilirsiniz:

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 

ve sadece dosyanın içeriğini görüntülemek istediğiniz yere <pre>{{ item.contents }}</pre> ekleyin. Örneğin, burada:

{%- 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 %} 

Bu çok çirkindir, ancak doğru verileri göstermelidir.

+0

Ilya Teşekkürler! bu çalışıyor! Yardım ettiğin için teşekkür ederim! çok takdir ediyorum :) – hey

+0

Sevindim :) –