【问题标题】:Serving and opening directories with Python, Flask & Jinja使用 Python、Flask 和 Jinja 服务和打开目录
【发布时间】:2017-06-23 02:15:06
【问题描述】:

我已经搜索但找不到答案。

我是 python 新手,正好 1 周,我正在使用 python 和 Flask 来提供包含文件和文件夹的 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 %}

【问题讨论】:

    标签: python html flask directory jinja2


    【解决方案1】:

    代替:

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

    【讨论】:

    • 嗨@lismUK 我可以下载文件。您的替代方案只是在尝试下载文件时给出“找不到文件”错误。我的问题是打开目录链接,然后查看文件和子目录。感谢您的链接。
    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多