[Bottle] Frage zu Cookies

Django, Flask, Bottle, WSGI, CGI…
Antworten
orschiro
User
Beiträge: 60
Registriert: Donnerstag 11. Dezember 2008, 16:10
Kontaktdaten:

Hallo Leute,

ein an sich simples Problem, bei der mir die Dokumentation aber leider bisher nicht helfen konnte.

Folgender Sachverhalt:

Ich lese per request.POST['lang_id'] die übermittelte Sprache ein und würde diese gerne als Session wie folgt speichern.

Code: Alles auswählen

  
language = request.POST['lang_id']
response.set_cookie('language', language, ...)
Dies sollte laut Doku auch funktionieren, nur, wie lese ich die Variable samt Inhalt wieder aus, um sie in einer anderen @route wieder verwenden zu können?

Verzeiht die vielleicht simple Frage, aber für einen Anfänger wie mich macht es Spaß, sich da Stück für Stück voranzuarbeiten. ;)

Grüße und Danke
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Bottle stores cookies sent by the client in a dictionary called request.COOKIES.
http://bottle.paws.de/page/docs#cookies
[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]
orschiro
User
Beiträge: 60
Registriert: Donnerstag 11. Dezember 2008, 16:10
Kontaktdaten:

Upps, schon in jungen Jahren derart blind. :oops:

Danke dir, das bringt mich in die richtige Richtung. Ich verstehe allerdings nicht, wieso der Cookie einen anderen Wert ausgibt, als erwartet.

Code: Alles auswählen

language = request.POST['lang_id']
response.COOKIES['language'] = language
return language, request.COOKIES['language']
Nun wäre eigentlich eine Übereinstimmung zu erwarten, zurückgegeben wird allerdings "deen".

Schicke ich den Post ein weiteres Mal ab, stimmt es hingegen.

Woran könnte das liegen?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Einmal gibst du die Sprache vor und einmal nach dem setzen der Sprache aus. Wenn es vorher de ist und du es dann auf en setzt, kommt deen raus ;)
[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]
orschiro
User
Beiträge: 60
Registriert: Donnerstag 11. Dezember 2008, 16:10
Kontaktdaten:

Ich verstehe nicht ganz was du meinst. Ich lese doch den request.POST ein und weise ihn einmal language zu (hier wird er noch korrekt übermittelt) und speichere language als Cookie (dort stimmt es dann aber nicht mehr).

Es macht auch keinen Unterschied, wenn ich beiden direkt den request.POST zuweise.

Code: Alles auswählen

    language = request.POST['lang_id']
    response.COOKIES['language'] = request.POST['lang_id']
    return language, request.COOKIES['language']
Du verstehst meinen Gedankengang? Oder verstehe ich da etwas gänzlich falsch? *g*
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

Du weist response.COOKIES zu, gibts aber request.COOKIES aus. Und letzteres ist bis zum nächsten request immer noch das, was vom client gesendet wurde.
http://www.felix-benner.com
orschiro
User
Beiträge: 60
Registriert: Donnerstag 11. Dezember 2008, 16:10
Kontaktdaten:

So langsam beginne ich zu verstehen. Was mich nur wundert, über localhost:8080/ funktioniert der Sprachwechsel wunderbar, wo hingegen ich bei localhost:8080/:name/ das richtige Template zwar über den @post, aber nicht über die @route anzeigen kann.

Am besten zeige ich euch mal meinen vollständigen Code bis daher:

Code: Alles auswählen

@post('/:name/')
@post('/:name')
@post('/')
def language_select(name='index'):
    title = name.capitalize()
    language = request.POST['lang_id']
    response.set_cookie('language', language)
    try: content = open("docs/" + language + "/" + name + ".md").read()
    except:
        content = open("error.md").read()
        return template("view", title="Seite nicht gefunden", content=content)

    return template("templates/" + language + "/view", title=title, content=content)

@route('/')
@route('/:name')
@route('/:name/')
def view(name='index', language='de'):
    title = name.capitalize()
    try: language = request.COOKIES["language"]
    except: pass 
    try: content = open("docs/" + language + "/" + name + ".md").read()
    except:
        content = open("error.md").read()
        return template("view", title="Seite nicht gefunden", content=content)

    return template("templates/" + language + "/view", title=title, content=content)
Der relevante Temlateausschnitt, ein mal für Deutsch, und einmal für Englisch:

Code: Alles auswählen

#Englisches Template
<form action="." method="post"><select size="1" class="sprache" id="lang_id" name="lang_id" onChange="javascript:submit()">

<option value="de" >German</option>
<option value="en" selected>English</option>
</select></form>

#Deutsches Template
<form action="." method="post"><select size="1" class="sprache" id="lang_id" name="lang_id" onChange="javascript:submit()">

<option value="de" selected>German</option>
<option value="en">English</option>
</select></form>
An diesen sollte es meiner Meinung nach aber nicht liegen oder?

Und nochmals danke für eure Hilfe und Geduld. :)
Antworten