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