bottle: expliztes auslesen

Django, Flask, Bottle, WSGI, CGI…
Antworten
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Ich arbeite gerade ein wenig mit Bottle.
Ich speicher meine Sachen in einer SQL DB.

Wenn ich meine Daten im Template auslese geschieht es so:

%for c in content:
<p>
%for s in c:
{{s}}
%end
</p>
%end

Dann listet er mir alles auf. In der DB gibt es die Spalten "Name", "Adresse", "Sonstiges".
Wie lese ich nun explizit aus, damit ich es besser gestalten kann also quasi so irgendwie:

%for c in content:
<p>
%for s in c:
Name: {{s.name}}
Adresse: {{s.adresse}}
Sonstiges: {{s.sonstiges}}
%end
</p>
%end

Geht das irgendwie?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Das ist ja kein Bottle-Problem sondern in DB-spezifisches.

Was für eine Engine nutzt du denn?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Es geht darum, dass ich unter Python 2.6 + Bottle ein Gästebuch schreiben möchte.
Einträge speicher ich in ner Sql DB.

Bloß nun möchte ich die Einträge-Anzeige ein wenig gestalten:

PeterPan schrieb am 12.12.2010:
Hell worold



=> dachte das geht irgendwie in so einer Form:

{{s.name}} schrieb am {{s.date}}:
{{s.message}}
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Welches modul importierst du denn?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Code: Alles auswählen

   #....
    conn = sqlite3.connect('test.db')
    c = conn.cursor()
    c.execute("SELECT name, msg, datum FROM eintraege")
    result = c.fetchall()
    c.close()
    output = template('show.tpl', content = result)    
    return output
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Es gibt verschiedene Möglichkeiten.

Du kannst auf name, msg, datum mit s[0], s[1], s[2] zugreifen.

Oder du machst es wie hier: http://docs.python.org/library/sqlite3. ... ow_factory

Oder du nimmst ein ORM.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Im Tutorial von bottle steht das doch gut beschrieben und man findet diesen Beispiel-Code:

Code: Alles auswählen

%#template to generate a HTML table from a list of tuples (or list of lists, or tuple of tuples or ...)
<p>The open items are as follows:</p>
<table border="1">
%for row in rows:
  <tr>
  %for r in row:
    <td>{{r}}</td>
  %end
  </tr>
%end
</table>
Du musst eben in einer inneren Schleife über die Tupel iterieren...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Hyperion hat geschrieben:Im Tutorial von bottle steht das doch gut beschrieben und man findet diesen Beispiel-Code:

Code: Alles auswählen

%#template to generate a HTML table from a list of tuples (or list of lists, or tuple of tuples or ...)
<p>The open items are as follows:</p>
<table border="1">
%for row in rows:
  <tr>
  %for r in row:
    <td>{{r}}</td>
  %end
  </tr>
%end
</table>
Du musst eben in einer inneren Schleife über die Tupel iterieren...
Ja daran hab ich mich auch orintiert.
Doch wenn ich das in dieser Form amche, denn klatscht er mir da alles einfach so hintereinander hin. Ich kann da nicht sagen:
%for r in row:
{{Inhalt aus der Spalte Name}} schrieb:
<hr>
{{Inhalt der Spalte Nachricht}}
%end
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dann nimm eben Indexzugriffe, wie jbs beschrieben hat! (Wußte nicht, dass das geht)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Dann nimm eben Indexzugriffe, wie jbs beschrieben hat! (Wußte nicht, dass das geht)
Jop, es funktioniert.
Trotzdem danke!
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Die Frage lautete eigentlich wie entpacke ich Tupel und wtf, warum sind das keine dicts.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Ok noch ne Frage:
Wie handhabt ihr das mit dem Datum wenn ihr etwas in ner SQL DB einträgt?

Die Now() Func. scheint nicht zu gehen :(
BlackJack

@Sync32: Welche `Now()`-Funktion!? In der Dokumentation von SQLite gibt's eine Seite zu den Datums- und Zeitfunktionen. Da gibt's keine `now()`-Funktion, aber Beispiele -- von denen gleich das allererste zeigt, wie man das aktuelle Datum bekommt.

Wobei man das ja eigentlich auch problemlos im Python-Programm erzeugen kann. Dann ist es unabhängig von irgendwelchen SQL-Dialekten oder spezifischen Datenbankeigenheiten.
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

nichts gegen SQLite, aber...

1. MySQL kennt den DictCursor, d.h. ein Execute-Statement bzw. das folgende fetch... liefert ein Dict zurück
2. MySQL kennt die Funktion "timestamp", die denn aktuellen Zeitstempel in eine Zelle einträgt.

Wobei: Wenn das deine einzigen "Probleme" ;-) sind - beide lässt sich mir ein paar Zeilen Python-Code auch realisieren.

Gruß, noisefloor
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Schau dir query_db aus der Flask-Dokumentation ab :D

http://flask.pocoo.org/docs/patterns/sqlite3/#sqlite3

Und mit Jinja2 kannst du auf Dictionaries auch zugreifen wie du willst:

Code: Alles auswählen

d = dict(foo='bar', x='y')
#####
{{ d.foo }} # = bar
{{ d.x }} # = y
the more they change the more they stay the same
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Dav1d hat geschrieben:Schau dir query_db aus der Flask-Dokumentation ab :D

http://flask.pocoo.org/docs/patterns/sqlite3/#sqlite3
Nur etwas Vorsicht: Das Flask Beispiel für query_db() macht ein cur.fetchall(), selbst wenn nur einen einziger Eintrag gebraucht wird. Der db_query(one=True) Parameter wird denkbar schlecht umgesetzt.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das funktioniert doch mit jedem anderen Framework genau so (wenn man nicht gerade genau die "before-request" Funktion braucht).

Das Problem des OP ist doch, wie man das Ergebnis eines SQL-Queries "richtig" in Template bekommt bzw. wie man das Ergebnis des Queries (bei SQLite eine Liste von Tuplen) in ein Dict bekommt. :-)

Gruß, noisefloor
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

@noisefloor, worauf spielst du an? auf app.before/after_request von Flask? Mir ging es nicht darum jemanden zu Flask zu "bekehren" (dazu kenne ich mich selber viel zu wenig aus), sondern auf ein Beispiel in der Flask-Dokumentation hinzuweisen, wie man aus einem SQL-Fetch ein Dictionary macht (query_db).
the more they change the more they stay the same
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Mir ging es nicht darum jemanden zu Flask zu "bekehren" (dazu kenne ich mich selber viel zu wenig aus), sondern auf ein Beispiel in der Flask-Dokumentation hinzuweisen, wie man aus einem SQL-Fetch ein Dictionary macht (query_db).
Axo. Es las' sich so, als ob Flask das Problem lösen würde (was ja nicht so ist).

Ansonsten hast du natürlich recht. :-) Bei mitsuhiko findet man immer interessant Code-Schnippsel jenseits seiner eigentlichen Progs.

Gruß, noisefloor
Antworten