Directory listing mit Bottle

Django, Flask, Bottle, WSGI, CGI…
Antworten
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

Hallo,

gibt es für Bottle ein Script zum Directory listing ähnlich wie bei Apache?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

meinst du, dass der Inhalt des Verzeichnisse angezeigt wird, wenn keine index.html existiert?

Wenn ja: nee, weil WSGI ja so nicht funktioniert. Sprich wenn du sowas brauchst, dann musst du selber eine Funktion erstellen und an eine Route binden.

Gruß, noisefloor
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

Ich hatte gehofft jemand hat vielleicht schon eine solche Funktion programmiert und könnte sie zur verfügung stellen...

Aber werd mich wohl selber mal daran setzen.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

na ja, schwierig ist da ja nicht... Du liest einfach alle Dateinamen aus "dem" Verzeichnis aus (mit dem os-Modul) und baust dir ein Template, dass dies wohlformatiert ausliefert.

Gruß, noisefloor
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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...
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@snafu: In diesem Fall muss man es selber bauen. Kann gibt es nicht, weil WSGI und Directory Listing nun mal nicht ist.

Standardansicht wäre, eine eine Liste aus Python zu retournieren. Dann kommt man auch ohne Template aus.

Gruß, noisefloor
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

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

Genau darum ging es mir. Habe es aber mittlerweile selber gebastelt.
:K
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Kannste ja vielleicht online stellen für nachfolgende Leser. Vielleicht entwickelt sich daraus ja sogar ein kleines Projekt, wenn da einer Bock drauf hat. Wer weiß...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

noisefloor hat geschrieben: @snafu: In diesem Fall muss man es selber bauen. Kann gibt es nicht, weil WSGI und Directory Listing nun mal nicht ist.
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 kann :!: Herr Lehmann fragte ja nicht nach einer On-Board-Lösung von Bottle.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

folgender Minimalbeispiel listet alle nicht-versteckten (Linux-) Dateien in einem fix vorgegebenen Verzeichnis, stellt diese als Link dar und stellt sie als Download bereit:

my_app.py:

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)
Das zugehörige Template "filelister.tpl":

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>
Gruß, noisefloor
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ich würde über `os.walk().next()` gehen.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

Mit meinem Code kann man auch durch die Unterverzeichnisse navigieren:

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)



Verbesserungen und Feedback gerne erwünscht.

Gruß
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Man sollte prüfen ob man gegen https://de.wikipedia.org/wiki/Directory_Traversal abgesichert ist ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

Man sollte doch nirgends hinkommen wo kein static im dir ist.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also ich finde den Template basierten Ansatz irgend wie hübscher. Speziell das Konkatenieren per "+" finde ich sehr hässlich!

Zudem weiß ich nicht, inwiefern er sinnvoll ist, mehr als ein Verzeichnis darzustellen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Herr Lehmann hat geschrieben:Man sollte doch nirgends hinkommen wo kein static im dir ist.
Hinkommen schon, Downloaden ist was anders. Wobei ich das noch nie ausprobiert habe, ob sowas wie "/pfad/zu/static/../../" funktioniert...

Gruß, noisefloor
Antworten