Bottle: Micro Web Framework

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Klar ist das ok :) Und eine gute Idee auch noch.
Bottle: Micro Web Framework + Development Blog
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Hallo

Kurze Ja/Nein Frage in Bezug auf dieses Thema:

ist Bottle überhaupt geeignet, für eine Webpage, welche mehrere Seiten und Unterseiten hat, JS und jQuery einsetzt und ein Kontaktformular?
(Oder wäre etwas größeres wie Django vorteilhafter?)
deets

Dafuer ist es schon geeignet. Programmieren koennen muss man aber immer noch - ich denke, *da* haperts eher. Kann natuerlich sein, das Django schon so viel Abstraktionen mitbringt, dass man da mit weniger Kenntnissen aehnlich weit kommt.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

lackschuh hat geschrieben:ist Bottle überhaupt geeignet, für eine Webpage, welche mehrere Seiten und Unterseiten hat, JS und jQuery einsetzt und ein Kontaktformular?
(Oder wäre etwas größeres wie Django vorteilhafter?)
Der Einsatz von JavaScript ist kein Problem. JavaScript sendet ja vom Client aus im Endeffekt auch nur Requests die vom Framework angenommen und delegiert werden. Prinzipiell ist das nichts wirklich anderes als das "normale" Aufrufen einer Webseite.
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Hallo

Kurze Frage bezüglich active link (css): ich habe ein Menü. Die einzelnen Kategorien stehen in einer Liste

Code: Alles auswählen

menu = [

['home'],
['kontakt'],
['blabla']
]
Im Template wird das Menü wie folgt eingebunden

Code: Alles auswählen

<div class="menu_nav">
        <ul>
          %for row in menu:
          <li> <a href="{{row[0]}}">{{row[0]}}</a> </li>
          %end
        </ul>
      </div>
Und in der .css

Code: Alles auswählen

.menu_nav ul a.activ_pfad {
	text-decoration:none;
	color:#990000;
}
Leider wird aber im Menü nicht angezeigt, welcher Link gerade aktiv ist.

Hat jemand eine Idee?
Zuletzt geändert von lackschuh am Montag 25. Juni 2012, 14:15, insgesamt 2-mal geändert.
deets

1. das ist eine HTML-Frage
2. das hat doch nix mit bottle zu tun, mach dafuer wahlweise einen eigenen Thread auf, oder frag in einem web-spezifischeren Forum nach.
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

deets hat geschrieben:1. das ist eine HTML-Frage
Das hat doch nichts mit HTML zu tun. Das ist eine Python/Bottle-Frage, in der geklärt werden muss, wie ich den aktiven Pfad definiere und ihm eine CSS-Klasse mit auf die Reise gebe.
Zuletzt geändert von lackschuh am Montag 25. Juni 2012, 15:49, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Na Du musst Deine Menüstruktur irgend wie so erweitern, dass neben dem Pfad auch der aktive Menüpunkt eingetragen wird - oder Du übergibst diesen getrennt.

Dann kannst Du im Template in der Schleife eine `if`-Abfrage einbauen und wenn der aktuell gerenderte Link mit dem aktiven übereinstimmt, dann änderst Du entsprechend die CSS-Klasse. Ich kenne die Template-Engine von Bottle jetzt nicht näher, aber so in der Art ginge das sicher.

Wenn man die Struktur geeignet anpasst, so kann man wohl auch auf das `if` verzichten, also etwa in der Art:

Code: Alles auswählen

menu = [
    ('home', 'menu')
    ('kontakt', 'active'),
    ('blabla', 'menu'),
]
Dabei steht zuerst der Pfad und danach die Klasse.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Moin,

folgende Problematik:
Ich ziehe aus einer API ein image und reiche dieses an ein template weiter um es dort mit html <img src... anzuzeigen.
So nu ist es ja so das BottlePy das alles cachet... demnach wird das Bild nicht angezeigt.

Ist es möglich für diesen einen Teil der Anwendung den cache zu deaktivieren?

Denn ich habe wenig Lust die Dateien lokal zu speichern... und dann als static einzubinden...

Ich hoffe ich habe mich verständlich ausgedrückt... :)

Ergänzend: Wenn man die Bilder (der Link ist ja da) in einem anderen Tab öffnet, und dann die Seite wo es eigentlich sein sollte neu aufruft ist das Bild da... was ich jedoch noch nicht getestet habe ist dieses verhalten auf unterschiedlichen clients...



Gruß und danke!
Zuletzt geändert von seishin am Samstag 7. Juli 2012, 14:01, insgesamt 1-mal geändert.
BlackJack

@seishin: Ich denke Du interpretierst da etwas falsch. Bottle cachet nicht alles, sondern nur Templates und zwar *unausgefüllte*. Sonst wäre es echt schwierig dynamische Webseiten damit zu realisieren.

Was heisst denn Du reichst das Bild an ein Template weiter? Direkt im Template kannst Du ein Bild nur als „data”-URL einbauen. Tust Du das? Ansonsten musst Du bei <img src=…> eine URL angeben unter der das Bild vom Browser angefordert werden kann *nachdem* er das ausgefüllte Template bekommen hat. Das ist dann eine weitere, separate Anfrage vom Browser.
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.
Antworten