bottle -> Probleme mit dem Einbinden von Resourcen

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
powered_by_coffee
User
Beiträge: 22
Registriert: Freitag 13. August 2010, 14:25

Moin Moin!
Wie muss ich den Pfad behandeln, wenn ich unter Bottle in meinem Template z.B. ein Bild einbinden möchte.
Hab versucht ein Bild einzubinden aber in der Preview nachher findet er das Bild nicht und gibt logischerweise den Alt=""-Text aus.

Das Bild liegt in meinem Templateordner.
Habs einmal mit
<img src="captcha.JPG" alt="Are you human?" />
und mit
<img src="templates/captcha.JPG" alt="Are you human?" />
versucht. Beides leider vergebens.

Oder mach ich gerade ein riesigen Denkfehler? :)

Ps.
Absolute Pfade (z.B. "http://www.google.de/intl/en_com/images/srpr/logo1w.png") funktionieren.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Du musst das Bild natürlich entweder über Bottle oder direkt mittels dem Webserver bereitstellen, sonst funktioniert das natürlich nicht. Schau dir mal den Abschnitt zu "static files" in der Bottle-Doku genauer an.

Edit: http://bottle.paws.de/docs/dev/tutorial ... atic-files
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Benutzeravatar
powered_by_coffee
User
Beiträge: 22
Registriert: Freitag 13. August 2010, 14:25

....sonst funktioniert das natürlich nicht.
Das kann ich nicht zu 100% nachvollziehen.
Wenn ich ein Bild im Projektordner habe, muss ich das doch irgendwie über ein relativen Pfad ansprechen können?

Mfg p_b_c
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wie läuft deine Applikation denn? Eingebauter Server, mod_wsgi...?

Gruß, noisefloor
Benutzeravatar
powered_by_coffee
User
Beiträge: 22
Registriert: Freitag 13. August 2010, 14:25

Derzeit noch über den "Server", den Bottle.py mitliefert.
Also localhost.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

powered_by_coffee hat geschrieben:Wenn ich ein Bild im Projektordner habe, muss ich das doch irgendwie über ein relativen Pfad ansprechen können?
Nein, bottle ist doch kein Webserver. Wenn du die URL '/image.png' aufrufst und dafür ein Bild haben willst, musst du bei bottle eine Route definieren und das Bild als "static file" zurückgeben.
In der Regel erledigt man das durch einen speziellen Ordner für "static files", der dann entweder durch bottle selbst (wie in der Doku gezeigt) oder einen Webserver bereitgestellt wird.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Benutzeravatar
powered_by_coffee
User
Beiträge: 22
Registriert: Freitag 13. August 2010, 14:25

Ok alles klar.
Danke.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn du es nicht über static_file machen möchtest muss du dir halt noch lokal einen Webserver aufsetzen.

Das geht mit Python ganz einfach, indem du im Verzeichnis, wo die Bilder liegen, den Befehl

Code: Alles auswählen

python -m SimpleHTTPServer
ausführst. Dadurch startet unter 'http://0.0.0.0:8000' ein Webserver, der den (gesamten!) Inhalt des Verzeichnisses liefert.

Im Template funktioniert dann auch

Code: Alles auswählen

<img src="http://0.0.0.0:8000/pfad/zum/bild/captcha.png
WICHTIG: hängt der Rechner am Netz, ist das Verzeichnis auch darüber erreichbar!

Gruß, noisefloor
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Die Bilder nicht durch Bottle sondern direkt von einen Webserver ausliefern zu lassen bringt erst etwas, wenn Bottle selbst auch hinter diesem webserver hängt. Sonst hast du ja zwei Server laufen und sehr hässliche URIs für die Bilder.

Es gibt also zusammengefasst zwei sinnvolle Möglichkeiten:

- Bilder (und anderes statisches Zeug) über Bottle mit einer extra route und 'return static_file()' ausliefern. Das ist schnell genug für die meisten Anforderungen. Außerdem hat das den Voreil, das man 'schöne' URLs für seine Bilder bekommt, selbst wenn sie in zig unterordnen oder sogar in ner Datenbank versteckt sind.
- Wenn Bottle eh durch einen Apache oder anderen Webserver geschliffen wird (mod_proxy, mod_wsgi) wird, kann der auch die Arbeit machen. Dazu konfiguriert man den Webserver so, das er Dateien aus bestimmten Verzeichnissen direkt aus liefert, statt vorher Bottle zu fragen. Besonders bei sehr vielen oder sehr großen Dateien (Download-Seite) ist das von Vorteil, da der ganze Datenhaufen nicht erst durch nen Python Script genudelt werden muss.
Bottle: Micro Web Framework + Development Blog
Antworten