Bottle: Micro Web Framework
- 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
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?)
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?)
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.
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 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?)
Hallo
Kurze Frage bezüglich active link (css): ich habe ein Menü. Die einzelnen Kategorien stehen in einer Liste
Im Template wird das Menü wie folgt eingebunden
Und in der .css
Leider wird aber im Menü nicht angezeigt, welcher Link gerade aktiv ist.
Hat jemand eine Idee?
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']
]
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>
Code: Alles auswählen
.menu_nav ul a.activ_pfad {
text-decoration:none;
color:#990000;
}
Hat jemand eine Idee?
Zuletzt geändert von lackschuh am Montag 25. Juni 2012, 14:15, insgesamt 2-mal geändert.
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.
2. das hat doch nix mit bottle zu tun, mach dafuer wahlweise einen eigenen Thread auf, oder frag in einem web-spezifischeren Forum nach.
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.deets hat geschrieben:1. das ist eine HTML-Frage
Zuletzt geändert von lackschuh am Montag 25. Juni 2012, 15:49, insgesamt 1-mal geändert.
- 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:
Dabei steht zuerst der Pfad und danach die Klasse.
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'),
]
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
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!
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.
@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.
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.
Ja ich reiche einfach nur den image link ans Template:
Dann im Template:
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?
Code: Alles auswählen
return template('detail', image=image)
Code: Alles auswählen
<img src="{{image}}" alt="load image" width="214px" height="317px" /><br>
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?
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.)....
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.)....
@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?
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
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: 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.
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.
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.
Aber ich werde heute Abend mal eine kleine Anwendung scripten.
Evtl. fallen dann ja auch die Tomaten...
Werde aber auf jedenfall berichten.
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/')
Evtl. fallen dann ja auch die Tomaten...
Werde aber auf jedenfall berichten.
Sodalum:
example.py
views/details.tpl
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.
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)
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>
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.