[bottle] OO oder andere Möglichkeit für gemeinsame Variablen

Django, Flask, Bottle, WSGI, CGI…
Antworten
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Gibt es irgendeine elegantere Möglichkeit für bottle um gemeinsame Variablen in den einzelnen Funktionen nutzen zu können. Bisher gelingt mir das nur über den outer scope, aber ich finde diese Lösung nicht besonders elegant.

Am liebsten wäre mir der Einsatz von OO, dass ich also die route-dekorierten Funktionen als Methoden definieren kann.

Gibts da irgendwelche Möglichkeiten oder vielleicht auch eine ganz simple Lösung, die mir gar nicht in den Sinn gekommen ist?

Gruß ice
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Was verstehst du denn unter gemeinsamen Variablen, bzw. was ist ihnen abgespeichert?
[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]
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Im Prinzip ist das ja egal... ;)
Aber hier mal ein Ausschnitt vom aktuellen Stand.

http://paste.pocoo.org/show/187415/

Ich habe halt eine Menge von Variablen, die ich in mehreren Route-Funktionen benötige (z.B. "lang_text"). Und der Zugriff über den Outer-Scope finde ich einfach nicht optimal. Würde stattdessen gerne Attribute verwenden. (Im konkreten Fall in der __init__ die ini-Dateien lesen und in den Methoden dann darauf zugreifen).
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Das ist eigentlich kein Problem:

Code: Alles auswählen

class MyApp(object):
  def my_callback(self):
    return 'HelloWorld'

instance = MyApp()
bottle.route('/')(instance.my_callback)
Nur der route-Decorator funktioniert natürlich nicht innerhalb einer Klassendefinition, da zu dem Zeitpunkt noch keine Instanz existiert und die Methode noch ungebunden ist. Außerdem wäre das Verhalten von Route undefiniert, wenn man mehr als eine Instanz anlegen würde. Du kannst die Routen also erst definieren, wenn du bereits eine Instanz deiner Klasse hast.

Wenn du wirklich Objekt orientiert arbeiten willst, solltest du dir vielleicht mal eines der MVC Frameworks anschauen. Die setzten OO deutlich konsequenter durch. Bottle ist nicht auf OO ausgelegt.
Bottle: Micro Web Framework + Development Blog
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Oh man, eigentlich klar, dass es so funktionieren muss.
War irgendwie auf den Decorator fixiert. *kopfschüttel*

Hab noch eine Alternative, so find ich das ganze eigentlich ziemlich nett vom Ansatz her:

Code: Alles auswählen

import bottle

class BottleServer(object):
    def __init__(self):
        bottle.route('/')(self.index)
        
    def index(self):
        return 'HelloWorld'
        
    def start(self):
        bottle.run()

server = BottleServer()
server.start()
Warum ich direkt an bottle interessiert bin:
Ich bin gerade am Experimentieren, eine GWT UI mit einem Pythonserver zu verknüpfen. GWT bringt direkte JSON-Unterstützung und bottle auch. Alle "großen" Frameworks bringen für diesen Anwendungsfall schon eine relativ hohe Abstraktion. Ich denke, mit bottle ist die Anbindung viel einfacher zu realisieren.
Das einzige, was bottle derzeit meiner Meinung noch fehlt, ist ein gutes Login-System, aber daran bist du ja momentan dran.

Mein geplantes System wäre dann:
GWT + bottle + sqlalchemy + cherrypy

Wobei ich mir beim Webserver noch nicht sicher bin. Hab irgendwo auch was negatives über CherryPy gelesen. Was würdest du mir als Deployment-Server für bottle empfehlen? (Läuft evt. unter Windows!)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

ice2k3 hat geschrieben: Wobei ich mir beim Webserver noch nicht sicher bin. Hab irgendwo auch was negatives über CherryPy gelesen.
Das lass mal nicht den Gerold hören :-D
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

ice2k3 hat geschrieben:Wobei ich mir beim Webserver noch nicht sicher bin. Hab irgendwo auch was negatives über CherryPy gelesen. Was würdest du mir als Deployment-Server für bottle empfehlen? (Läuft evt. unter Windows!)
Das ist ziemliche Geschmackssache. Alle wirklich schnellen Server (fapws3, tornado) laufen jedenfalls nicht ohne Weiteres unter Windows. Die reinen Python Server dagegen sind alle gleich langsam. Ich persönlich finde CherryPy nur doof, wenn man es als Framework nutzt. Die Serverkomponenten sind ganz in Ordnung. Ob sie nun besser oder schlechter ist als Server X vermag ich nicht zu sagen. Das hier wäre vielleicht noch interessant:

http://bottle.paws.de/page/2009-12-19_C ... erformance
Bottle: Micro Web Framework + Development Blog
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Defnull hat geschrieben:Das ist ziemliche Geschmackssache. Alle wirklich schnellen Server (fapws3, tornado) laufen jedenfalls nicht ohne Weiteres unter Windows. Die reinen Python Server dagegen sind alle gleich langsam. Ich persönlich finde CherryPy nur doof, wenn man es als Framework nutzt. Die Serverkomponenten sind ganz in Ordnung. Ob sie nun besser oder schlechter ist als Server X vermag ich nicht zu sagen. Das hier wäre vielleicht noch interessant:
Das Bottleneck wird bei meinem Projekt sowieso die komplexen Datenbankabfragen sein und mit einer sehr kleinen Userzahl (<10) laufen. Da ist der Server dann auch gar nicht so wichtig, oder?
Hab mich bisher mit cherrypy auch nicht wirklich auseinander gesetzt. Neben einem kurzen Blick auf das Tut ein kurzer Test mit "server=CherryPyServer" und das wars. Viel mehr will ich mich an der Stelle auch nicht auseinandersetzen, solange das performancemäßig alles problemlos läuft.

(Meine erste Beispiel GWT App läuft auf bottle außerdem problemlos :-) ).

Edit: Hier noch der Code, falls jemand interessiert ist. Die Test-App ist der "StockWatcher" aus dem GWT Tutorial. Statt dem Servlet und dem PHP JSON läuft das ganze eben aus bottle. Man kann das Tutorial 1:1 übernehmen, lediglich die URL für den HTTP Request muss angepasst werden.

http://paste.pocoo.org/show/187690/
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du könntest das auch so lösen:

Code: Alles auswählen

class Foo(object):
    @classmethod
    @route('/')
    @route('/index.html')
    def bar():
        return 'this is spam'
Achte nur darauf, dass `@classmethod` oben steht und kein `self` erwartet wird, sonst beschwert sich Bottle.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

snafu hat geschrieben:Achte nur darauf, dass `@classmethod` oben steht und kein `self` erwartet wird, sonst beschwert sich Bottle.
Irgendwie widerspricht sich dein Vorschlag mit meiner Ausgangsfrage. Kann damit ja nicht auf Instanzvariablen zugreifen, obwohl ich das eigentlich will. (Ja, in meinem GWT Beispiel benötige ich das nicht, ich weiß. Aber in Zukunft schon ;-) )
Antworten