Hallo,
gibt es für Bottle ein Script zum Directory listing ähnlich wie bei Apache?
Directory listing mit Bottle
- noisefloor
- User
- Beiträge: 4149
- 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
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
-
- 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.
Aber werd mich wohl selber mal daran setzen.
- noisefloor
- User
- Beiträge: 4149
- 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
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
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...
- noisefloor
- User
- Beiträge: 4149
- 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
@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
-
- 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
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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.

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- noisefloor
- User
- Beiträge: 4149
- 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:
Das zugehörige Template "filelister.tpl":
Gruß, noisefloor
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)
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>
-
- User
- Beiträge: 81
- Registriert: Samstag 14. August 2010, 22:20
Mit meinem Code kann man auch durch die Unterverzeichnisse navigieren:
Verbesserungen und Feedback gerne erwünscht.
Gruß
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ß
- 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 

-
- User
- Beiträge: 81
- Registriert: Samstag 14. August 2010, 22:20
Man sollte doch nirgends hinkommen wo kein static im dir ist.
- 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.
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
assert encoding_kapiert
- noisefloor
- User
- Beiträge: 4149
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Gruß, noisefloor
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.
Gruß, noisefloor