Seite 1 von 2

Cookies und Colubrid

Verfasst: Mittwoch 15. Februar 2006, 11:45
von beyama
Kann mir jemand hier oder im wiki ein Beispiel geben wie ich bei Colubrid mit Cookies arbeiten kann ?
Ich bin Anfänger und durch dieses Forum im Zusammenhang mit Python und Webprogrammierung auf colubrid gestoßen, ich probiere schon seit einer weile damit rum habe aber keinen Erfolg.

Danke im Voraus

Verfasst: Mittwoch 15. Februar 2006, 11:52
von jens
Das ist eine gute Frage, die ich mir auch demächst mal stellen muß, bis dahin kann ich dir allerdings nicht weiter helfen :(

Schau dir mal die Sourcen an:
http://wsgiarea.pocoo.org/trac/browser/ ... ls.py#L235
http://wsgiarea.pocoo.org/trac/browser/ ... st.py#L202

IMHO ist self.request.COOKIE ein Art Dict...

Verfasst: Mittwoch 15. Februar 2006, 17:24
von mitsuhiko
jens hat geschrieben:IMHO ist self.request.COOKIE ein Art Dict...
Aber nur eine Art. Es ist ein Cookie Objekt. Beschrieben ist es hier: http://docs.python.org/lib/module-Cookie.html

Es ist aber leicht Verändert und merkt sich automatisch die Änderungen und passt die Header an. Also braucht man kein setcookie wie in PHP.

Verfasst: Mittwoch 15. Februar 2006, 18:20
von jens
Das schreit mal wieder nach einem neuen Beispiel unter [wiki]Colubrid[/wiki]
:lol:

Verfasst: Donnerstag 16. Februar 2006, 11:07
von beyama
Gut, also ist self.request.COOKIES ein Cookie-Objekt abgeleitet von dem Cookiemodul aus Python.
Wenn ich jetzt so was mache wie self.request.COOKIES['id'] = '12345' dann erscheint im Header an den Client auch ein "Set-Cookie:id=12345;",
wie aber bekomme ich denn den Cookie "ausgelesen" ?
Ein self.request.COOKIES.load(os.environ['HTTP_COOKIE']) fällt doch flach oder übersehe ich hier was ?
Mal eine ganz andere Frage wegen der Mühen zum umstieg auf wsgi, ist es zu erwarten das z.B. mod_python irgendwann wsgi unterstützt oder
muss man davon ausgehen das es bezogen auf Apache nur als cgi bzw. fastcgi laufen wird ?

Verfasst: Donnerstag 16. Februar 2006, 11:47
von jens
beyama hat geschrieben:wie aber bekomme ich denn den Cookie "ausgelesen" ?
Ich hab mich noch nicht damit beschäftigt, aber was spuckt ein self.request.echo(self.request.COOKIES) aus?
Ich schätze du kannst wie auf ein dict auf die cookies zugreifen...

Verfasst: Donnerstag 16. Februar 2006, 12:24
von mitsuhiko

Code: Alles auswählen

self.request.COOKIES['mein_cookie'].value
:wink:

Verfasst: Donnerstag 16. Februar 2006, 12:33
von beyama
Ich weiß nicht genau was es mit dem echo auf sich hat, aber ich vermute das es etwas ausgibt.
Mein Problem ist aber nicht wie ich an Daten ran komme die ich in das Cookieobjekt gesteckt habe bzw. wie ich sie an den Client sende (die Header werden ja automatisch angepasst), mein Problem ist wie ich die Cookiedaten vom Client wieder zurück bekomme.
Was ja bei der Standard Cookie-Klasse mit der Methode read() passiert.

Verfasst: Donnerstag 16. Februar 2006, 13:31
von jens
(haben sich die Postings überschnitten?)

self.request.echo(txt) ist quasi das selbe wie self.request.write(str(txt)) :)

Verfasst: Donnerstag 16. Februar 2006, 13:39
von mitsuhiko
jens hat geschrieben:self.request.echo(txt) ist quasi das selbe wie self.request.write(str(txt)) :)
Nicht ganz. Eher das hier:

Code: Alles auswählen

    def echo(self, *args):
        if not args:
            raise ArgumentError, 'no data given'
        for arg in args:
            self.write(str(arg))
:wink:

Verfasst: Donnerstag 16. Februar 2006, 13:58
von jens
Ah! Cool, das wußte ich noch nicht... sehr praktisch!

Verfasst: Donnerstag 16. Februar 2006, 14:31
von beyama
Ja Postings haben sich überschnitten. Ich kann zu meiner Schande
an der Stelle nicht mitreden, da ich nicht weiß was dieses *args
bedeutet (ich denke da immer an Zeiger), aber wie gesagt ich bin Python
Anfänger und meine Motivation die Sprache zu lernen liegt momentan
Primär in der Webprogrammierung ansonsten bin ich eher an Embeddedsachen
interessiert, aber egal.

Ich habe gerade einfach das Problem das ich nicht weiß wie ich die
Cookie-Daten vom Client wieder zurück bekomme.

Verfasst: Donnerstag 16. Februar 2006, 15:05
von mitsuhiko
Du willst also Daten zum Webbrowser des Users schicken?
Schau dir mal dieses Beispiel an:

Code: Alles auswählen

from colubrid import BaseApplication, execute
from time import time

class Application(BaseApplication):

    def process_request(self):
        if 'zeit' in self.request.COOKIES:
            t = self.request.COOKIES['zeit'].value
            self.request.write('Dein Letzter Besuch war um %s.' % t)
        else:
            self.request.COOKIES['zeit'] = time()
            self.request.write('Das ist dein Erster Besuch.')

app = Application

if __name__ == '__main__':
    execute()
self.request.write('string') schickt einfach Daten zum Client. (Falls du das meinst)

Verfasst: Donnerstag 16. Februar 2006, 15:14
von jens
Ab in's Wiki damit! :lol:

Verfasst: Donnerstag 16. Februar 2006, 17:08
von beyama
Ich meine schon das in deinem Code-Beispiel, aber das funktioniert (bei mir) nicht.
Ich habe es erst versucht, in das ein zu flechten was ich bis jetzt mit colubrid
gebaut hab, ging aber nicht, dann habe ich deine Variante ausprobiert und sie ging ebenfalls nicht.
Man kommt immer wieder bei "Das ist dein Erster Besuch." raus.
Wenn ich mir die http Header anschaue, dann sehe ich das Firefox
zwar das set-cookie... bekommt aber es nicht wieder zurück gibt.
Auch wenn ich dem Browser so einstelle das er mich vor dem annehmen
von Cookies fragt, reagiert er gar nicht auf den Cookie von Colubrid.
Ich kann mir das nicht erklären.

Verfasst: Donnerstag 16. Februar 2006, 17:22
von jens
So, ich hab es auch mal ausprobiert... Es klappt bei mir einwandfrei... Mach doch mal ein self.request.debug_info() und schau dort nach, ob COOKIE Informationen vorhanden sind...

Verfasst: Donnerstag 16. Februar 2006, 17:53
von beyama
Sehr komisch, ich habe es gerade noch mal probiert und mit Firefox
geht es nicht, mit links2 allerdings funktioniert es.
Ich habe keine Idee woran das liegt ich habe jedenfalls auf anderen
Seiten keine Probleme mit Firefox und Cookies.

EDIT:
Nach dem ich es unter Safari und Firefox auf anderen Rechnern probiert habe und es überall ging habe ich mein Firefox
zurück gesetzt, nun geht es auch auf meinem Arbeitsrechner. Keine Ahnung woran es lag.

Vielen Dank für eure Hilfe.

Verfasst: Freitag 5. Mai 2006, 06:14
von jens
blackbird hat geschrieben:

Code: Alles auswählen

from colubrid import BaseApplication, execute
from time import time

class Application(BaseApplication):

    def process_request(self):
        if 'zeit' in self.request.COOKIES:
            t = self.request.COOKIES['zeit'].value
            self.request.write('Dein Letzter Besuch war um %s.' % t)
        else:
            self.request.COOKIES['zeit'] = time()
            self.request.write('Das ist dein Erster Besuch.')

app = Application

if __name__ == '__main__':
    execute()
Bei colubrid v1.0 wurde das wohl geändert:
http://wsgiarea.pocoo.org/colubrid/docu ... management
example:

Code: Alles auswählen

response.set_cookie('username', 'myname', domain='.mydomain.com')
To remove existing cookies use response.delete_cookie:

Code: Alles auswählen

response.delete_cookie('username')
Nur mal so als Anmerkung, weil ich gerade auch cookies behandeln will ;)

Verfasst: Freitag 5. Mai 2006, 07:25
von jens
So, ich hab mal ein Beispiel für colubrid 1.0 gemacht: [wiki]Colubrid/Cookie Handling[/wiki]

Es gibt allerdings ein Bug beim löschen von Cookies: http://trac.pocoo.org/ticket/28

Aber das ist sicher schnell behoben... (Oder hab ich was falsch gemacht???)

EDIT: Ist es eigentlich normal, das man ein cookie direkt nach dem setzten nicht lesen kann??? Also das:

Code: Alles auswählen

        self.response.set_cookie(self.CookieName, Text)

        if self.page_msg_debug == True:
            CookieData = self.request.cookies[self.CookieName].value
            self.page_msg("test Cookie: '%s'" % CookieData)

Verfasst: Freitag 5. Mai 2006, 11:00
von jens
@blackbird: Kann es sein, das man ein cookie nicht mehr innerhalb einer middleware setzten kann?
Wenn ich mir das recht überlege, ist das wohl auch logisch, denn zu dem Zeitpunkt wurde der Header schon verschickt, oder???

Allerdings wäre es IMHO nett, wenn dann eine exception geworfen wird! Ich hab eine ganze weile gebraucht, bis ich das herraus gefunden hab...