Cookies und Colubrid

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

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

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:

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.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das schreit mal wieder nach einem neuen Beispiel unter [wiki]Colubrid[/wiki]
:lol:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
beyama
User
Beiträge: 14
Registriert: Mittwoch 15. Februar 2006, 11:37
Wohnort: Erfurt

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 ?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

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:

Code: Alles auswählen

self.request.COOKIES['mein_cookie'].value
:wink:
TUFKAB – the user formerly known as blackbird
beyama
User
Beiträge: 14
Registriert: Mittwoch 15. Februar 2006, 11:37
Wohnort: Erfurt

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

(haben sich die Postings überschnitten?)

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

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:

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:
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ah! Cool, das wußte ich noch nicht... sehr praktisch!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
beyama
User
Beiträge: 14
Registriert: Mittwoch 15. Februar 2006, 11:37
Wohnort: Erfurt

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.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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)
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ab in's Wiki damit! :lol:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
beyama
User
Beiträge: 14
Registriert: Mittwoch 15. Februar 2006, 11:37
Wohnort: Erfurt

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
beyama
User
Beiträge: 14
Registriert: Mittwoch 15. Februar 2006, 11:37
Wohnort: Erfurt

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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 ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

@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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten