Seite 6 von 30

Verfasst: Freitag 31. Juli 2009, 16:38
von noisefloor
Hallo,

gibt es eigentlich eine Möglichkeit, in Bottle eine individuelle Fehlerseite für nicht exisiterende Routen zu machen?

Wenn z.B. die Routen '/' , '/spam' und '/egg' exisitieren und jemand '/foo' aufruft z.B. zu sagen: "Sorry, die Seite gibt es nicht"?

Hatte mal in Schnelldurchgang '/:#.*#' Als Route probiert, geht aber wohl nicht.

Gruß, noisefloor

Verfasst: Freitag 31. Juli 2009, 16:41
von Dauerbaustelle
noisefloor hat geschrieben:gibt es eigentlich eine Möglichkeit, in Bottle eine individuelle Fehlerseite für nicht exisiterende Routen zu machen?
Jo, einfach ein view mit dem Dekorator @error(nummer) versehen. zB:

Code: Alles auswählen

@error(404):
def not_found():
    # blah

Verfasst: Samstag 1. August 2009, 13:59
von KingZero
Mal eine Frage. Lässt sich bottle auch auf Google Apps Engine einsetzen?

Verfasst: Samstag 1. August 2009, 14:58
von Defnull
Sollte eigentlich gehen:

Code: Alles auswählen

    from google.appengine.ext.webapp import util
    util.run_wsgi_app(bottle.default_app())
(Edit) ich bastel grad an einer Unterstützung für Multipart in Python3. Leider ist der wsgi Standard unter 3.x etwas kaputt. Zum Beispiel kommt cgi.FieldStorage und urllib.parse_qs nicht mit bytes klar und wsgi.input unterstützt keinen size-Parameter bei readline. Wenn ich Pech habe, muss ich die Multipart-Unterstützung selbst entwickeln (wie es z.B. werkzeug tut). Die 1000 Zeilen wird das wohl sprengen...

Verfasst: Sonntag 2. August 2009, 11:42
von noisefloor
Hallo,

wie binde ich denn Bottle 0.5.6 an mod_wsgi?

Mit 0.4.14 funktionierte es ja wie auf Seite 3 beschrieben, bei 0.5.x gibt es ja scheinbar nicht mehr den WSGIHandler...?

Gruß, noisefloor

Verfasst: Sonntag 2. August 2009, 12:03
von noisefloor
Hallo,

ok, wer lesen kann ist klar im Vorteil... Es heißt jetzt default_app()

Mit dem Adapter:

Code: Alles auswählen

import sys
sys.path = ['/home/jochen/mr/'] + sys.path
from mr import default_app

def application(environ, start_response):
    return default_app()
bekommt ich aber im Apache den Fehler:
[Sun Aug 02 12:58:24 2009] [error] [client 127.0.0.1] mod_wsgi (pid=8037): Exception occurred processing WSGI script '/home/jochen/mr/adapter.wsgi'.
[Sun Aug 02 12:58:24 2009] [error] [client 127.0.0.1] TypeError: 'Bottle' object is not iterable
Gruß, noisefloor

Verfasst: Sonntag 2. August 2009, 13:03
von Defnull
bottle.default_app() leifert einen WSGI-Handler zurück. Also entweder

Code: Alles auswählen

def application(environ, start_response):
    return bottle.default_app()(environ, start_response)
oder noch einfacher

Code: Alles auswählen

application = bottle.default_app()

Verfasst: Sonntag 2. August 2009, 20:57
von noisefloor
Hallo,

yo, so funktioniert's. Danke. :-)

Noch ein Nachtrag zum Fehler fangen: Der Code von Dauerbaustelle hat einen kleine Fehler, zumindest unter 0.5.x.

So funktioniert es:

Code: Alles auswählen

@error(404)
def fehler(code):
    return 'Die gewählte Seite existiert nicht!'
Man muss der Funktion ein Argument mitgeben (ob man es braucht oder nicht) - sonst gibt's eine Fehlermeldung a la "0 arguments expected, 1 given" - Bug oder Feature? ;-)

Gruß, noisefloor

Verfasst: Montag 17. August 2009, 08:40
von noisefloor
Hallo,

welches ist jetzt eigentlich die höchste Version von Bottle, die noch mit Python 2.5 läuft?

Gruß, noisefloor

Verfasst: Montag 17. August 2009, 09:07
von Defnull
Bottle ist seit 0.5.5 wieder Python2.5 kompatibel. Die aktuelle Version läuft und wird getestet unter 2.5, 2.6, 2.7, 3.0, 3.1 wobei alle 3.x Versionen Probleme mit File Uploads haben, da cgi.FieldStorage unter 3.x kaputt ist.

Die Dokumentation ist in diesem Punkt also falsch *korrigier* :oops:

Verfasst: Montag 17. August 2009, 11:06
von noisefloor
Hallo,

> Die Dokumentation ist in diesem Punkt also falsch
Genau das hatte mich irritiert. :-)

Da ich Bottle auf Ubuntu Hardy 8.04 laufen habe kam es genau auf Python 2.5. Um 3.x kümmere ich mich, wenn der Support für Hardy in 3.75 Jahren ausläuft ;-)

Danke für die schnelle Antwort.

Gruß, noisefloor

Verfasst: Mittwoch 19. August 2009, 11:46
von Dav1d
gibt es für bottle so ne art IRC-Channel, da ich meine Seite gerne mit bottle erstellen würde statt wie bisher mit PHP (Joomla), dafür brauch ich hilfe -.-, hier posten finde ich umständlich

mfg

Verfasst: Mittwoch 19. August 2009, 14:49
von Defnull
Da ich nebenbei Arbeite, habe ich leider keine Zeit ständig im IRC zu sein. Die Dokumentation ist allerdings recht vollständig (siehe Signatur) und für Detailfragen ist dieses Forum hervorragend geeignet :)

Verfasst: Mittwoch 19. August 2009, 15:59
von Dav1d
mh ok, ist das OK wenn ich die Fragen ins Web und Netzwerkprogrmmierungs-uNterfprum schreibe, hier finde ichs ein bisschen unübersichtlich


mfg

Verfasst: Mittwoch 19. August 2009, 21:57
von snafu
@Dav1d: Ich glaube, da wird keiner was gegen haben. ^^

Verfasst: Mittwoch 19. August 2009, 22:02
von lunar
Ich glaube, Dav1d wollte eher wissen, ob defnull Bottle-spezifische Detailfragen auch dann bemerkt, wenn sie nicht in diesem Thread, sondern im allgemeinen Webprogrammierungs-Forum gestellt werden. Schließlich hat dieses Forum keine Mail-Benachrichtigung für neue Beiträge, sondern nur für Antworten in existierenden Threads.

Verfasst: Mittwoch 19. August 2009, 23:40
von Defnull
Ich bin eigentlich recht aktiv in diesem Forum. Ich sollte es also bemerken, wenn die Überschrift interessant klingt ;)

Verfasst: Donnerstag 20. August 2009, 10:29
von Dav1d
http://www.python-forum.de/topic-19976.html <- hat eigentlich mehr mit wsgi zu tun
Ich glaube, Dav1d wollte eher wissen, ob defnull Bottle-spezifische Detailfragen auch dann bemerkt, wenn sie nicht in diesem Thread, sondern im allgemeinen Webprogrammierungs-Forum gestellt werden. Schließlich hat dieses Forum keine Mail-Benachrichtigung für neue Beiträge, sondern nur für Antworten in existierenden Threads.
jo so dachte ich das

mfg

Verfasst: Freitag 21. August 2009, 01:18
von Defnull
So, im Git sind ein paar neue Features :)

Nummer 1) Default-Routen als alternative zu @error(404)

Code: Alles auswählen

from bottle import route, default, request
@route('/test')
def test():
  return 'test'

@default()
def catchall():
  return "You visited %s" % request.path
Nummer 2) Controller-Class Routing (ab Python2.6 auch mit decorator)

Code: Alles auswählen

from bottle import route, BaseController

@route('/my/{action}')
@route('/special/url/:test', action='special')
class MyController(BaseController):
  def test(self):
    return 'This is the test action'

  def special(self, test):
    return 'This action is special'

  def _invisible(self):
    return 'This action is invisible'

Nummer 3) Experimenteller Support für Vererbung bei mako Templates

Verfasst: Freitag 21. August 2009, 11:59
von Dauerbaustelle
1) ich finde die Klammern beim Default (`default()`) nicht so schön, die sind imho unnötig

2) Was bringt das Controller-Class-Routing? ;-)