Colubrid ObjectApplication und HTTP-Redirect

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
beyama
User
Beiträge: 14
Registriert: Mittwoch 15. Februar 2006, 11:37
Wohnort: Erfurt

Ich habe bei mir das hier ausprobiert:

Code: Alles auswählen

from colubrid import ObjectApplication

class Blog(object):
    def index(self):
        self.on_http_redirect(['http://www.foo.de/bar/'])
    def entry(self, id):
        pass
    def archive(self, year, month=False):
        pass
    archive.container = True

class Pictures(object):
    def index(self):
        pass
    def detail(self):
        pass

class Paste(object):
    def index(self, id=None):
        pass

class DisposeApplication(ObjectApplication):
    root = Blog
    root.pictures = Pictures
    root.paste = Paste
app = DisposeApplication
funktioniert aber nicht im Gegensatz zu BaseApplication wo selbiges problemlos geht.
Ich bekomme die Fehlermeldung: 'Blog' object has no attribute 'on_http_redirect',
was ich nicht verstehe, da es doch von BaseApplication abgeleitet ist(?).
Mache ich statt dessen so was:

Code: Alles auswählen

class Blog(object):
    def index(self):
        self.request.headers['Content-Type'] = 'text/html; charset=utf-8'
        self.request.headers['Location'] = 'http://www.foo.de/bar/'
        self.request.status = 302
    def entry(self, id):
        pass
    def archive(self, year, month=False):
        pass
    archive.container = True
geht es.

Stehe ich irgend wo auf dem Schlauch oder ist es ein fehler in Colubrid ?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

beyama hat geschrieben:

Code: Alles auswählen

class Blog(object):
    def index(self):
        self.on_http_redirect(['http://www.foo.de/bar/'])
Ich bekomme die Fehlermeldung: 'Blog' object has no attribute 'on_http_redirect',
was ich nicht verstehe, da es doch von BaseApplication abgeleitet ist(?).
Nein, du hast von object abgeleitet, was IMHO auch richtig ist, denn ich weiß nicht ob du an der Stelle von BaseApplication ableiten kannst, ich denke nicht, aber probiere es einfach aus...

Nur, was spricht dagegen wenn du es so machst:

Code: Alles auswählen

class Blog(object):
    def index(self):
        self.http_redirect('http://www.foo.de/bar/')
    
    def http_redirect(self, url):
        self.request.headers['Content-Type'] = 'text/html; charset=utf-8'
        self.request.headers['Location'] = url
        self.request.status = 302

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Hehe. Du hast da was gemacht, was zwar funktioniert aber so nicht eingeplant ist ^^

Richtiger weg für einen Redirect ist das raisen einer HttpRedirect Exception:

Code: Alles auswählen

from colubrid import ObjectApplication
from colubrid.exceptions import HttpRedirect

class Blog(object):
    def index(self):
        raise HttpRedirect, 'http://www.foo.de/bar/'
    def entry(self, id):
        pass
    def archive(self, year, month=False):
        pass
    archive.container = True

class Pictures(object):
    def index(self):
        pass
    def detail(self):
        pass

class Paste(object):
    def index(self, id=None):
        pass

class DisposeApplication(ObjectApplication):
    root = Blog
    root.pictures = Pictures
    root.paste = Paste
app = DisposeApplication
Das on_http_redirect gehört nämlich wirklich nur zur DisposeApplication und wird aufgerufen, wenn du die oben genannte Exception wirfst.
TUFKAB – the user formerly known as blackbird
beyama
User
Beiträge: 14
Registriert: Mittwoch 15. Februar 2006, 11:37
Wohnort: Erfurt

Vielen Dank!

Und noch eine kurze Frage,
kommt man von der DisposeApplication Klasse an das request Objekt ?
Mir geht es darum z.B. Cookie oder url abfragen schon an dieser Stelle zu machen.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

beyama hat geschrieben:Vielen Dank!

Und noch eine kurze Frage,
kommt man von der DisposeApplication Klasse an das request Objekt ?
Mir geht es darum z.B. Cookie oder url abfragen schon an dieser Stelle zu machen.
Ja. Du musst nur die __init__ methode überladen:

Code: Alles auswählen

class DisposeApplication(ObjectApplication):
    root = None

    def __init__(self, environ, start_response):
        super(DisposeApplication, self).__init__(environ, start_response)
        self.request.headers["Content-Type"] = "text/plain"
TUFKAB – the user formerly known as blackbird
Antworten