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:

Ich habe einen Bug gefunden, weis aber nicht ob er auch an deinem Problem schuld ist. Probier mal bitte die neueste Version:

http://github.com/defnull/bottle/raw/master/bottle.py

(einfach ins Projekt-Verzeichnis kopieren)

Ein neuer bugfix Release kommt auch bald, aber erst nach einigen Tests.
Bottle: Micro Web Framework + Development Blog
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

Defnull hat geschrieben:Ich habe einen Bug gefunden, weis aber nicht ob er auch an deinem Problem schuld ist. Probier mal bitte die neueste Version:

http://github.com/defnull/bottle/raw/master/bottle.py

(einfach ins Projekt-Verzeichnis kopieren)

Ein neuer bugfix Release kommt auch bald, aber erst nach einigen Tests.
Hat leider nix verändert, aber oben gezeigte lambda-funktion tut ja prima, und damit kann ich erstmal leben. =)
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Ich glaube, du hast heir einen logischen Fehler bei If-Modified-Since:

Code: Alles auswählen

if ims is not None and ims <= stats.st_mtime:
wohl eher so:

Code: Alles auswählen

if ims is not None and ims >= stats.st_mtime:
Und was ich noch empfehlen würde ist, das reloader-Interval auf 1 zu setzen, 2s ist zu viel.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

done
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Ich brauch nen bisschen Hilfe mit SimpleTemplate...

Ich hab eine Art umgedrehtes %include implementiert. Es gibt folgenden neuen Befehl:

Code: Alles auswählen

%rebase base_template arg1=value1, arg2=value2, ...
Dieser Befehl ist im Grunde das exakte Gegenteil von %include. Mit %include fügt man den Text eines anderen Templates im eigenen Template ein. Mit %rebase sorgt man dafür, das der eigene Text von einem anderen Template eingefügt wird.

Ein auf diese Weise aufgerufenes Base-Template kann nun an einer beliebigen Stelle %include ohne Parameter auf rufen, um den Text des aufrufenen Templates einzufügen. Zusätzlich bekommt das Base-Template die im %rebase Befehl angegebenen Argumente als Template-Variablen übergeben, genau wie es bei einem %include der Fall wäre.

Der %rebase Befehl kann überall im Template stehen, auch in if-Blöcken. Kommt er mehr als einmal vor, zählt der jeweils letzte Aufruf. Das ganze funktioniert auch rekursiv. Das erste Template, das keinen %rebase Befehl mehr enthält, gibt sein Ergebnis schließlich zurück.

Hier mal ein einfaches Beispiel:

Code: Alles auswählen

#start.tpl
%rebase htmlbase title="Hello there"
This is some content.

Code: Alles auswählen

#htmlbase.tpl
<html>
  <head>
    <title>{{title}}</title>
  </head>
  <body>
    %include
  </body>
</html>
<html>



Man kann %rebase mit den Vererbungs-Features von anderen Template-Engines vergleichen (Mako: %inherit). Auch wenn es etwas anders funktioniert, sollte eigentlich das gleiche damit möglich sein. Nun meine Frage: Gibt es etwas, das man mit der Vererbung von Mako/Cheetah machen kann, aber mit mit SimpleTemplate (noch) unmöglich ist? Ist meine Lösung für dieses Problem unvollständig?

Ausprobieren kann man es mit der aktuellen GitHub Version. Es ist aber noch nicht besonders ausgiebig getestet. Wer Bugs findet, bitte melden!
Bottle: Micro Web Framework + Development Blog
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Defnull hat geschrieben:Ich werde demnächst deutlich mehr testen müssen, bevor ich einen Release raus schicke... Bottle wird inzwischen von zu vielen Leuten benutzt, als das ich mir sowas wie 0.6.2 noch öfters erlauben könnte. Sorry dafür.
Hat da gerade jemand automatische Unittests, TDD, BDD und 100% Code Coverage gesagt? :)

Stefan
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Die neuen Features kommen auch erst nach ausgiebigen Tests in ein Release. Die GitHub Version betrachte ich als unstabil.

Momentan verweigert mein Release-Script den Upload nach PyPi, wenn auch nur ein UnitTest schief geht. TDD betreibe ich ebenfalls schon, allerdings nur für neue Features, nicht für Bugfixes, was ich ändern sollte. Im Idealfall müsste ich jeden gefundenen Bug erst durch einen UnitTest ab bilden, bevor ich ihn löse.

BDD ist mir für ein 1-Mann Projekt zu aufwändig. Ich sehe auch den Nutzen für Bottle nicht direkt.

100% Code Coverage habe ich nicht, aber manche Bereiche (Reloader) lassen sich schlecht durch UnitTests ab decken. Und andere Testmechanismen habe ich noch nicht implementiert. Aber das ist ein Gutes Thema: Gibt es gute Testumgebungen für HTTP Anwendungen in Python?
Bottle: Micro Web Framework + Development Blog
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Defnull hat geschrieben:Im Idealfall müsste ich jeden gefundenen Bug erst durch einen UnitTest ab bilden, bevor ich ihn löse.
Kein Konjunktiv :)
Defnull hat geschrieben:BDD ist mir für ein 1-Mann Projekt zu aufwändig. Ich sehe auch den Nutzen für Bottle nicht direkt.
Auch bei 1-Mann-Projekten für das m.E. nach zu besserem API-Design. Das Geheimnis ist, vom Anwendungsfall top->down zu kommen und nicht bottom->up aus dem Gefühl "wäre es nicht gut, wenn ... ginge". YAGNI.
Defnull hat geschrieben:Gibt es gute Testumgebungen für HTTP Anwendungen in Python?
Weiß ich leider nicht. Mocken (ohne da gleich eine extra-Bibliothek zu benutzen) wäre mein erster Gedanke.

Stefan
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Hab ich nicht verstanden, soll "rebase" eine Art "super" sein?
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Verstehe den Sinn und Zweck von rebase auch nicht wirklich - halte ich für ein unsinniges Feature, lasse mich aber gerne auch vom gegenteil überzeugen.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Ich plane für ein Projekt bottle einzusetzen und musste feststellen dass es keine Template Klasse für Jinja gibt. Hat dass einen speziellen Grund oder hatte bisher nur niemand Lust eine zu schreiben?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Du brauchst dafür doch keine Klasse, schreib dir einfach ein `render_template` und gib das immer in den Views zurück.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

DasIch hat geschrieben:Ich plane für ein Projekt bottle einzusetzen und musste feststellen dass es keine Template Klasse für Jinja gibt. Hat dass einen speziellen Grund oder hatte bisher nur niemand Lust eine zu schreiben?
Jup, hatte noch keiner Lust, eine zu schreiben :) Du must nicht zwangsläufig einen Adapter für Junja/Bottle schreiben, aber wenn du es leicht austauschbar haben willst, wäre das schon praktisch.
Bottle: Micro Web Framework + Development Blog
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich habe meinen Patch für Jinja2-Support an das aktuelle Bottle angepasst und auf meinem github-Account hochgeladen.

Stefan
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

sma hat geschrieben:Ich habe meinen Patch für Jinja2-Support an das aktuelle Bottle angepasst und auf meinem github-Account hochgeladen.
Stefan
Danke :) Gleich mal dieses "Fork Queue" Tool von GitHub aus probieren. Wenn ich das richtig verstehe, ist das ein 'git cherrypick' das die Autor-Infos intakt lässt. Sehr praktisch das :D

Edit: Hat hervorragend geklappt. Sogar mit UnitTests :D Muss sich noch zeigen, ob die Jinja2.env wirklich Thread-save ist. Die von Cheetah war es nicht, aber da werden ja auch die Template Variablen über die .env geregelt.
Bottle: Micro Web Framework + Development Blog
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich verstehe diese Fork-Queue nicht. Ich habe gestern bottle geforkt und dennoch bietet er mit zwei Patches von vor 4 Tagen an (von denen "Remove README" nicht funktioniert). Er bietet mir aber auch meine Patches an, die defnull jetzt übernommen hat und sagt - zurecht - die werden nicht passen. Wie soll ich denn jetzt mit meinem Fork up-to-date bleiben?

Ich möchte ja echt git mögen, aber manchmal ist das schon verdammt kompliziert und unübersichtlich.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

sma hat geschrieben:Ich verstehe diese Fork-Queue nicht. Ich habe gestern bottle geforkt und dennoch bietet er mit zwei Patches von vor 4 Tagen an (von denen "Remove README" nicht funktioniert). Er bietet mir aber auch meine Patches an, die defnull jetzt übernommen hat und sagt - zurecht - die werden nicht passen. Wie soll ich denn jetzt mit meinem Fork up-to-date bleiben?

Ich möchte ja echt git mögen, aber manchmal ist das schon verdammt kompliziert und unübersichtlich.
Die ForkQueue von GutHub scheint im Hintergrund 'git cherrypick' zu verwenden. Dadurch werden einzelne Patches (statt alle, wie beim merge) übernommen, aber git erzeugt bei cherrypick neue Patches mit neuen commits, was dazu führt das die Patches doppelt angezeigt werden.
Bei einem 'git merge' würden die commits sauber übernommen, aber dafür müsste ich jeden einzelnen Patch von dir übernehmen, was in diesem Fall geklappt hätte, aber nicht immer geht. Die ForkQueue von GitHub ist zwar schön, aber nicht der Weg, den man mit git normalerweise geht. Ich werds in Zukunft nicht mehr benutzen.

Ich kann ja mal ne Mail zitieren, die ich letzten zu dem Thema geschrieben habe. Ein kleines Git HowTo. Vielleicht hilft das. Aber du hast schon recht, git ist in seinen Einzelheiten sehr gewöhnungsbedürftig und nicht immer intuitiv. Dafür ist es eben sehr mächtig im Vergleich zu anderen Systemen.





First, you create a remote (a shortcut) called 'upstream' that points to my GitHub repository. You only need to do this once:

Code: Alles auswählen

git remote add -f upstream git://github.com/defnull/bottle.git
Then you can create a new clean branch that tracks my remote master branch. You should do this every time you you start working on a new patch, so unrelated patches are in different branches. Git is designed to work with branches. This way I can pull a particular branch without touching the changes you made in other branches.

Code: Alles auswählen

git branch newbranch upstream/master
Now you have a clean copy of my master-branch in 'newbranch', ready to modify. Don't forget to 'git checkout newbranch'.
Before I can pull from your new branch, you have to push it to github. If you followed the GitHub hints, 'origin' should be a remote pointing to your own GitHub fork. So lets push newbranch to origin:

Code: Alles auswählen

git checkout newbranch
git push origin newbranch
Now I can see your new branch and pull from it.

If upstream changes, you can update your local copy with this command. Git knows that your branch is tracking my master branch, so you don't have do specify it again.

Code: Alles auswählen

git pull
If you had made changes to your newbranch already, a 'git pull' would cause a merge of both branches. On conflicts, this would produce another dirty branch. A better way is 'git rebase'. That command saves all your local changes, resets your branch to the HEAD of my master branch, reapplies your changes and let you resolve the conflicts. This way your branch keeps clean and I can pull from it without problems.

I hadn't tested what I just wrote, but I thing it should work as said. Hope, that helps ;)





In deinem Fall ist es etwas komplizierter. Du hast zwei Patches, die du nicht mehr brauchst, da ich sie übernommen habe (auch wen github sie als unterschiedliche commits erkennt, dank des blöden cherrypick). Du kannst sie mit 'git reset --hard HEAD^^' wirft die letzten zwei commits einfach weg. Dann kannst du ein 'git pull' machen um dich auf den neuesten Stand bringe und mit einem 'git push -f' GitHub zwingen, die Änderungen zu übernehmen. Das '-f' ist nötig, da 'git reset' die History verändert, was eigentlich etwas ist, das man vermeiden sollte. Daher ja auch die vielen unterschiedlichen Branches, die man normalerweise nach Herzenslust weg schmeißen und um modeln kann.
Bottle: Micro Web Framework + Development Blog
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

Hi, gibt es eigentlich eine Dokumentation für die Standard Templateengine?
was "%include", "%if" und "%for" etc, tun ist ja relativ offensichtlich, aber wie bottle %def interpretiert ist mir noch nicht ganz schlüssig.. ist das sowas wie ein Block, der HTML enthalten kann?
zb, sowas:

Code: Alles auswählen

%def youtube(id):
    <object width="425" height="344">
        <param name="movie" 
            value="http://www.youtube.com/v/{{id}}&hl=en&" />
        <param name="allowFullScreen" value="true" />
        <param name="allowscriptaccess" value="always" />
        <embed
            src="http://www.youtube.com/v/{{id}}&hl=en&fs=1&"
            type="application/x-shockwave-flash"
            allowscriptaccess="always"
            allowfullscreen="true"
            width="425" height="344" />
    </object>
%end
Oder tut %def etwas völlig anderes?


Ab welcher Version ist eigentlich jinja2 mit Bottle nativ verwendbar? in der jetzigen Version (0.6.3) scheint keine entsprechende Funktion / klasse zu existieren... =/

EDIT:
Mir ist beim testen auch aufgefallen, dass mit der standard templateengine zeichen wie "%" oder "{{" nicht ausgegeben werden kann.
Escapen (zb durch "\%") funktioniert zwar an sich, allerdings hat man dan eben genau das, nämlich "\%" (mit backslash). =(
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

%... starts a line of python code. You don't have to worry about indentions. Bottle handles that for you.
``%def`` Ist also wie in Python eine Funktionsdefinition

Schon versucht die Zeichen mit {{'%'}} und {{'{'}} auszugeben?
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

ice2k3 hat geschrieben:
%... starts a line of python code. You don't have to worry about indentions. Bottle handles that for you.
``%def`` Ist also wie in Python eine Funktionsdefinition
Ah, ja, die gute alte dokumentation ;) Danke dir :)
Schon versucht die Zeichen mit {{'%'}} und {{'{'}} auszugeben?
Noch nicht, aber grad eben schon. Dass ich da nicht eher drauf kam. :roll:
Antworten