Seite 1 von 1
[Bottle]Gehen Templates nur als Datei ?
Verfasst: Montag 8. März 2010, 09:02
von MrNiceTry
Ich habe Template-Strings, die ich gerne direkt an Bottle übergeben möchte.
Als Workaround schreibe ich im Moment eine template.tpl und den Dateinamen übergebe ich dann mit:
Funktioniert, ist aber wenig effektiv !
Gibt es einen Weg zur Direkteinspritzung ?
MrNiceTry
Verfasst: Montag 8. März 2010, 10:18
von Defnull
Warum probierst du es nicht einfach?
Code: Alles auswählen
>>> import bottle
>>> bottle.template('Hello {{world}}', world="MrNiceTry")
[u'Hello ', u'MrNiceTry']
bottle.template und bottle.view nehmen als ersten Parameter entweder einen namen (xy), einen Dateipfad (xy.tpl, ./views/xy.tpl) oder direkt einen Template String entgegen. Alle drei Varianten werden gecached.
Verfasst: Montag 8. März 2010, 17:34
von MrNiceTry
Ich hab schon probiert !
Hat aber nicht funktioniert.
Jetzt ist mir auch klar, warum nicht!
Bei meinen Versuchen hab ich im Templatestring nur einfache HTML-Statements drin gehabt.
Und die lösen nicht die Unterscheidung zwischen der Datei und der String-Variante aus.
Sobald ich aber {{ }} im Template habe funktioniert es.
Das war mir so nicht klar.
Danke.
Verfasst: Montag 8. März 2010, 17:57
von ms4py
MrNiceTry hat geschrieben:
Sobald ich aber {{ }} im Template habe funktioniert es.
Muss nicht unbedingt eine eckige Klammer sein, ich zitiere mal aus dem Quelltext von bottle (Zeile 1520 in akt. git Version):
Code: Alles auswählen
if "\n" in tpl or "{" in tpl or "%" in tpl or '$' in tpl:
Verfasst: Montag 8. März 2010, 18:12
von derdon
Da kann ich gleich nen Verbesserungsvorschlag einreichen
Code: Alles auswählen
>>> tpl = 'bla { blub'
>>> from operator import contains
>>> any(contains(tpl, char) for char in '\n{%$')
True
Verfasst: Montag 8. März 2010, 19:43
von MrNiceTry
Die folgende HTML-Zeile geht also als Datename durch:
- Testzeile 1 <br> Testzeile 2
(So was einfaches hatte ich zum Testen genommen als es schief gegangen ist!)
Vorschlag: Die "< >" noch mit rein nehmen.
Die sind auch sehr signifikant für HTML. Ich hoffe ich habe keine Verwendung der <> in Pfadangaben übersehen.
MrNiceTry
Verfasst: Montag 8. März 2010, 19:49
von MrNiceTry
Zum Vorschlag von derdon:
derdon hat geschrieben:Da kann ich gleich nen Verbesserungsvorschlag einreichen
Code: Alles auswählen
>>> tpl = 'bla { blub'
>>> from operator import contains
>>> any(contains(tpl, char) for char in '\n{%$')
True
Da werden "" und "n" doch als einzelne Zeichen betrachtet, oder ?
Das würde bedeuten, wenn irgendwo ein "" oder ein "n" im Dateipfad ist, wird er zum Template ?
MrNiceTry
Verfasst: Montag 8. März 2010, 19:50
von cofi
Nein, `\n` ist ein Zeichen.
Code: Alles auswählen
In [1]: a = "\n"
In [2]: len(a)
Out[2]: 1
In [3]: a
Out[3]: '\n'
Verfasst: Montag 8. März 2010, 19:53
von MrNiceTry
cofi hat geschrieben:Nein, `\n` ist ein Zeichen.
Code: Alles auswählen
In [1]: a = "\n"
In [2]: len(a)
Out[2]: 1
In [3]: a
Out[3]: '\n'
Dann hab ich gerade was gelernt.
Danke.
Verfasst: Montag 8. März 2010, 19:59
von jbs
derdon hat geschrieben:Da kann ich gleich nen Verbesserungsvorschlag einreichen
Code: Alles auswählen
>>> tpl = 'bla { blub'
>>> from operator import contains
>>> any(contains(tpl, char) for char in '\n{%$')
True
Es ist nur 10x langsamer

Verfasst: Montag 8. März 2010, 20:18
von Defnull
Templates ohne Template-Code machen keinen Sinn, daher suche ich nach häufigen Steuerzeichen '{%$' um Template Strings zu identifizieren. Das Newline ist auch dabei, weil es in Dateinamen nicht vorkommen darf, in Templates aber recht häufig ist. Alles Andere wird als Name identifiziert. Schließlich soll der chinesische Benutzer auch seine chinesischen Schriftzeichen im Dateinamen haben dürfen, wenn sein OS das erlaubt.
'<' könnte man allerdings noch hinzufügen, stimmt.
@derdon: Das kannst du besser

Die any() Lösung sieht weder schöner aus, noch ist sie schneller oder hat sonst irgendwelche Vorteile. Im Gegenteil: Sie ist deutlich langsamer als die sprachnativen 'in' Konstrukte. Der import ist übrigens überflüssig, da "any(c in tpl for c in '\n{%$')" auch ohne contains() hervorragend funktioniert.
Verfasst: Montag 8. März 2010, 20:33
von derdon
Nagut, dann ist sie eben langsamer. Aber dafür ist sie flexibler und sieht bei 10 bis 15 Zeichen besser aus. Und ja: Ich finde es mit any *schöner*

Aber bei bottle spielt Geschwindigkeit eine große Rolle, also lass es einfach so.
Verfasst: Montag 8. März 2010, 20:41
von Defnull
Hab ich eigentlich schon erwähnt, das ich auf meinem neuen Rechner über 25.000 Requests pro Sekunde hin bekommen habe?
Hardware: i5-750, 8GB, P55 Chipsatz
Benchmark: ab -c100 -n1000000
http://localhost:8080/
Setup: pound + 4x (fapws3 + bottle0.7.0a)
Test: "Hello World"
Ergebnis: ~25.800 Requests/Sekunde; 0 Fehler
Verfasst: Montag 8. März 2010, 21:06
von Dav1d
Ja hast du

Verfasst: Montag 8. März 2010, 21:12
von Hyperion
Defnull hat geschrieben:
Hardware: i5-750, 8GB, P55 Chipsatz
*sabber*

Verfasst: Montag 8. März 2010, 21:43
von Defnull
Dav1d hat geschrieben:Ja hast du

menno

Verfasst: Montag 5. April 2010, 11:28
von apollo13
Defnull hat geschrieben:Hab ich eigentlich schon erwähnt, das ich auf meinem neuen Rechner über 25.000 Requests pro Sekunde hin bekommen habe?

Kann mir bitte jemand mal den Sinn von absolut sinnlosen Benchmarks erklären?
Verfasst: Montag 5. April 2010, 13:43
von Defnull
Sie sind fast so sinnvoll wie auf einen ein Monat alten Thread mit OffTopic zu antworten.
Verfasst: Dienstag 6. April 2010, 10:19
von apollo13
Hihi, eiskalt erwischt, das kommt davon wenn man das Forum nicht hin und wieder als gelesen markiert
