Bottle: Micro Web Framework

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Ja ich reiche einfach nur den image link ans Template:

Code: Alles auswählen

return template('detail', image=image)
Dann im Template:

Code: Alles auswählen

<img src="{{image}}" alt="load image" width="214px" height="317px" /><br>
Wie noch ergänzt, wenn das Bild einmal in einem anderen Tab geöffnet wird.
Und man die Seite neu lädt auf welcher es sein sollte... dann ist es da.

Leuchtet ein mit der anderweitigen Anfrage des Browser.
Tjö, aber wie umgehe ich dies, bzw. löse es?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Und was steht in "image"? Doch nicht etwa die Binärdaten der Bilddatei?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Nein, einzig der Link des Bildes.

Man vermag ja auch auf das "Bild" PLatzhalter zu klicken. Rechtsklick Adresse des Bildes kopieren, in einem neuen Tab öffnen und voila das Bild ist da. Lade ich die Seite neu auf der zu erst nur der Platzhalter war ist das Bild auch dort (nachdem ich es in dem anderen Tab einmal aufgerufen habe.)....
BlackJack

@seishin: Was ist denn das für ein Link zu dem Bild? Liegt das *vor* der ganzen Aktion schon vor? Oder wird das erst bei dem Aufruf generiert, der das ausgefüllte Template an den Client schickt? Wird es dafür gespeichert? Falls ja, wo und wie? Verlässt Du Dich dabei vielleicht auf ein implizites `close()` oder `commit()` was zu dem Zeitpunkt wo der Client das Bild anfordert noch nicht durchgeführt wurde, aber kurz danach dann doch?
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Ich hole mir aus der IMDB API... Film-Informationen als JSON.
Aus der Rückgabe von IMDB (JSON) nehme ich mir dann die gewünschten Informationen.

Demnach habe ich nur den Link zum Cover, ich möchte es nicht speichern.
Die Informationen werden bei jedem Aufruf neu bei IMDB abgefragt und in Variablen zwischengespeichert.
Dann wie oben beschrieben ins Template gereicht.

Ich greife ja nicht nur das Bild ab, sondern noch Ranking usw. diese ganzen Informationen werden angezeigt.
Nur das Bild eben nicht. Klar der Browser muss dann erst noch das Bild laden... sollte er ja aber können, da er den Link kennt... Tut er aber nicht, erst nachdem, wie beschrieben.

Deswegen diese Verwirrung... :K
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Meine Vermutung deshalb der Cache, weil im DebugModus und lokal funktioniert das ganze einwandfrei.
Demnach weiß jemand wie ich den Template Cache deaktiviere?
BlackJack

@seishin: Ich sehe nicht was der Template Cache damit zu tun haben soll. Die Templates werden geladen und vom Textformat in eine interne Form umgewandelt. *Das* wird gecachet — *unausgefüllte* Templates. Damit das laden des Template-Quelltextes und das umwandeln in die interne Struktur für ein Template nur einmal gemacht werden muss. Befüllt werden sie immer wieder aufs neue mit Daten.

Ausserdem wäre ein Cache-Effekt eher umgekehrt — es funktioniert beim ersten mal und zeigt bei folgenden Aufrufen alte Daten, eben weil die Daten vom ersten mal im Cache sind.

Schreib doch mal eine minimale Bottle-App an der man das Problem nachvollziehen kann und zeig die mal her.
deets

Welchen Browser benutzt du denn?
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Safari, Firefox, IE... alles getestet. Stets das Selbe.

Richtig BackJack jedoch müssen ja statische Files (css, javascript, images etc.) auch erst als static ganz zu beginn eingebunden werden.

Code: Alles auswählen

@bottle.route('/static/:filename#.*#') 
def static(filename):     
 return bottle.static_file(filename, root='./static/') 
Aber ich werde heute Abend mal eine kleine Anwendung scripten.
Evtl. fallen dann ja auch die Tomaten... :D
Werde aber auf jedenfall berichten.
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Sodalum:

example.py

Code: Alles auswählen

#!/usr/bin/env 
# -*- coding: utf-8 -*-

# mal eben auf die schnelle unerhörte imports...
from bottle import *
import urllib2
import cookielib
import json

@route('/')
def start():
    cj = cookielib.LWPCookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
    opener.addheaders = [('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10')]
    url = "http://www.imdbapi.com/?i=tt0133093"
    html = opener.open(url).read()
    jdata = json.loads(html)

    imdbid = jdata["imdbID"]
    title = jdata["Title"]
    image = jdata["Poster"]
    
    return template('details', imdbid=imdbid, title=title, image=image)


debug(True)
run(host='localhost', port='8080', reloader=True)
views/details.tpl

Code: Alles auswählen

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <title>foobar</title>
</head>
<body>
<hr>
<p>
    IMDBID: {{imdbid}}<br>
    Title: {{title}}<br>
    <img src="{{image}}" alt="load image" width="214px" height="317px" /><br>
</p>
<hr>
</body>
</html>
Bevor nun alle schreien also bei mir geht das, noch:
Es funktioniert lokal.
Als Server benutze ich einen Apache mit mod_wsgi.
Symptom: Bild online nicht da, alles andere schon.
Lädt man das Bild in einem anderen Tab und die Seite auf der es angezeigt werden soll neu, dann auch dort...

Danke für euere Anteilnahme.
Zuletzt geändert von seishin am Dienstag 10. Juli 2012, 20:26, insgesamt 1-mal geändert.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Sicher dass IMDB das Einbinden von Bildern in dieser Weise erlaubt und nicht möglicherweise über den referrer blockt?
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Ja, das wird erlaubt.
Da ich die Anfrage jedes mal neu stelle und keine bedeutende Last darstelle (ist eine Intranet Anwendung, User = 2)...
Umgehe ich ihre Art der "Abwehr" bzw. dauerhaften Einbindung. Sie ändern in gewissen Abständen die image names.

Wenn sie das nicht wollen, dann würden sie denke ich gar keine Bilder durch die API schicken...
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Nein, nicht erlaubt.

Das Problem: öffnet man das Bild und sendet einen referer mit, was die Browser bei eingebundenen Bildern machen, dann bekommt man nen 403 - Referral Denied

Öffnet man das Bild in einem Tab kommt kein refere mit und es geht.
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Hmm, sowas aber auch!
Najut, dennoch vielen Dank!
Antworten