2017-02-06 7 views
1

私は検索しましたが、回答が見つかりませんでした。Python、Flask&Jinjaでディレクトリを開いて開く

私はpythonに1週間新しく、私はFlaskでpythonを使ってファイルとフォルダを含むWebディレクトリを提供しています。

ファイルをダウンロードできますが、ディレクトリを開くときに404が表示されます。手伝ってくれますか。

views.py:

from flask import Flask, render_template, send_from_directory, send_file 
#from app import app 
import os 
from pprint import pprint 
import magic 
import urllib 
import sys 

reload(sys) 
sys.setdefaultencoding('utf8') 

app = Flask(__name__) 
mime = magic.Magic(mime=True) 

""" 
Config 
""" 
# To list the current directory 
#base_directory = os.path.dirname(os.path.abspath(__file__)) 
base_directory = "/var/www/html/test" 
# directories not to be listed 
ignored_dirs = ["venv"] 
ignore_dotfiles = True 
ignore_dollarfiles = True 
omit_folders = False 
omit_files = False 

""" The base route with the file list """ 
@app.route("/") 
def home(): 
    files = [] 
    dirs = [] 

    meta = { 
     "current_directory": base_directory 
    } 

    for (dirpath, dirnames, filenames) in os.walk(base_directory): 
      for name in filenames: 
      if omit_files == True: 
       break 

      for ign in ignored_dirs: 
       if ign in dirnames: 
        dirnames.remove(ign) 

      nm = os.path.join(dirpath, name).replace(base_directory, "").strip("/").split("/") 
      fullpath = os.path.join(dirpath, name) 

      if os.path.isfile(fullpath) == False: 
       continue 

      size = os.stat(fullpath).st_size 

      if len(nm) == 1: 
       name_s = name.split(".") 
       if ignore_dotfiles == True: 
        if name_s[0] == "" or name_s[0] == None: 
         continue 

       files.append({ 
        "name": name, 
        "size": str(size) + " B", 
#      "mime": mime.from_file(fullpath), 
        "fullname": urllib.quote_plus(fullpath) 
       }) 

     for dirname in dirnames: 
      if omit_folders == True: 
       break 

      fullpath = os.path.join(dirpath, dirname) 

      if ignore_dotfiles == True: 
       name_split = dirname.split(".") 
       if name_split[0] == "" or name_split[0] == None: 
        continue 

      if ignore_dollarfiles == True: 
       name_split = dirname.split("$") 
       if name_split[0] == "" or name_split[0] == None: 
        continue 

      dirs.append({ 
       "name": dirname, 
       "size": "/", 
#     "mime": mime.from_file(fullpath) 
      }) 

    return render_template("index.html", files=sorted(files, key=lambda k: k["name"].lower()), folders=dirs, meta=meta) 

@app.route("/download/<filename>") 
def download(filename): 
    filename = urllib.unquote(filename) 
    if os.path.isfile(filename): 
     if os.path.dirname(filename) == base_directory.rstrip("/"): 
      return send_file(filename, as_attachment=True) 
      else: 
      return render_template("no_permission.html") 
    else: 
      return render_template("not_found.html") 
    return None 

if __name__ == "__main__": 
    app.run(host="0.0.0.0", debug=True) 

テンプレート/ index.htmlを:

{% extends "_layout.html" %} 
{% block content %} 

<div class="container" style="margin-top: 10px"> 
    <div class="row"> 
    <div class="col-lg-12"> 
    <div class="card"> 
     <div class="card-header">Directory listing for "{{meta.current_directory}}"</div> 
      <div class="card-block"> 
       <table class="table"> 
       <thead> 
        <tr> 
         <th>Name</th> 
         <th>Size</th> 
<!--      <th>MIME</th> --> 
         <th>Download</th> 
        </tr> 
       </thead> 
       <tbody> 
        {% for folder in folders %} 
        <tr> 
         <td><a href="{{meta.current_directory}}{{ folder.fullname|urlencode }}/{{folder.name}}"><i class="fa fa-file-o"></i> {{ folder.name }}</a></td> 
         <td>{{ folder.size }}</td> 
<!--      <td><span class="label label-primary">{{ folder.mime }}</span></td> --> 
         <td></td> 
        </tr> 
        {% endfor %} 

        {% for file in files %} 
        <tr> 
         <td><i class="fa fa-file-o"></i> {{ file.name }}</td> 
         <td>{{ file.size }}</td> 
<!--      <td><span class="label label-primary">{{ file.mime }}</span></td> --> 
         <td><a href="download/{{ file.fullname|urlencode }}" class="label label-success"><i class="fa fa-download"></i> Download</a>    </td> 
        </tr> 
        {% endfor %} 
       </tbody> 
       </table> 
      </div> 
     </div> 
    </div> 
    </div> 
    </div> 
</div> 

{% endblock %} 

答えて

0

の代わりに:

<a href="download/{{ file.fullname|urlencode }}" class="label label-success"> 

やってみてください。

<a href="{{url_for('download', filename=file.fullname|urlencode)}}" class="label label-success"> 

See this for a practical.

+0

こんにちは@lismUK ファイルをダウンロードできます。あなたの選択肢は、ファイルをダウンロードしようとしているときに "ファイルが見つかりません"というエラーを出すだけです。私の問題はディレクトリリンクを開いて、ファイルとサブディレクトリを見ていることです。 リンクありがとうございます。 – StoneAgeRebel

関連する問題