Directory listing mit Bottle
Verfasst: Mittwoch 2. November 2011, 15:04
				
				Hallo,
gibt es für Bottle ein Script zum Directory listing ähnlich wie bei Apache?
			gibt es für Bottle ein Script zum Directory listing ähnlich wie bei Apache?
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
snafu hat geschrieben:Na, ihm wird es sicher darum gehen, sich den ganzen Formatierungskram zu sparen und etwas Schönes als "Standardansicht" einsetzen zu können. Ihr seid manchmal echt toll mit eurem "Ja, das kann man sich ganz einfach selbst zusammen bauen". Natürlich kann man sich das notfalls selbst zusammen bauen...
Es hätte ja aber sein können, dass genau dieses Problem bereits von jemanden gelöst wurde und er ein Snippet / Projekt dazu online stellen kannnoisefloor hat geschrieben: @snafu: In diesem Fall muss man es selber bauen. Kann gibt es nicht, weil WSGI und Directory Listing nun mal nicht ist.
Code: Alles auswählen
#!/usr/bin/env python
from os import listdir
from bottle import run, debug, route, static_file, template
PATH = '/home/noisefloor/'
@route('/listing')
def listing():
    filelist = listdir(PATH)
    return template('filelister.tpl', path= PATH, filelist=filelist)
@route('/download/:name')
def download(name):
    return static_file(name, root=PATH)
if __name__ == '__main__':
    debug(True)
    run(reloader=True)Code: Alles auswählen
<html>
<head>
<title>Directory Lister</title>
</head>
<body>
<p>Dateien im Verzeichnis {{path}}:</p>
<ul>
%for i in filelist:
%if not i.startswith('.'):
<li><a href="/download/{{i}}">{{i}}</a></li>
%end
%end
</ul>
</body>
</html>Code: Alles auswählen
import os
from bottle import *
def walklevel(some_dir, level=1):
    some_dir = some_dir.rstrip(os.path.sep)
    assert os.path.isdir(some_dir)
    num_sep = some_dir.count(os.path.sep)
    for root, dirs, files in os.walk(some_dir):
        yield root, dirs, files
        num_sep_this = root.count(os.path.sep)
        if num_sep + level <= num_sep_this:
            del dirs[:]
@route('/static/:filename#.*#')
def send_static(filename):
    return static_file(filename, root='./static/')
@route('/')
def index():
    return dirlisting(home)
def dirlisting(dirname):
    output = ""
    for dirname, dirnames, filenames in walklevel(home, 0):
        for subdirname in dirnames:
            output += "<a href=/folder?sub="+subdirname+">"+subdirname+"</a><br>"
        for filename in filenames:
            if "avi" in filename:
                output += "<a href=static/"+filename+">"+filename+"</a><br>"
    return output
@route('/folder')
def folder():
    output = ""
    currentpath= request.query.sub
    head,  tail = os.path.split(currentpath)
    if not currentpath== "":
        output ="<a href=/folder?sub="+head+">...</a><br>"
    for dirname, dirnames, filenames in walklevel(os.path.join(home, currentpath), 0):
        for subdirname in dirnames:
            output += "<a href=/folder?sub="+os.path.join(currentpath, subdirname)+">"+subdirname+"</a><br>"
        for filename in filenames:
            output += "<a href=static/"+os.path.join(currentpath, filename)+">"+filename+"</a><br>"
    return output
home = 'full/path/to/static'
debug(True)
run(host='localhost', port=9050)
Hinkommen schon, Downloaden ist was anders. Wobei ich das noch nie ausprobiert habe, ob sowas wie "/pfad/zu/static/../../" funktioniert...Herr Lehmann hat geschrieben:Man sollte doch nirgends hinkommen wo kein static im dir ist.