Seite 1 von 1
[Bottle] Frage zu Cookies
Verfasst: Mittwoch 3. März 2010, 00:13
von orschiro
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
Verfasst: Mittwoch 3. März 2010, 00:26
von jbs
Bottle stores cookies sent by the client in a dictionary called request.COOKIES.
http://bottle.paws.de/page/docs#cookies
Verfasst: Mittwoch 3. März 2010, 01:40
von orschiro
Upps, schon in jungen Jahren derart blind.
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?
Verfasst: Mittwoch 3. März 2010, 01:47
von jbs
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

Verfasst: Mittwoch 3. März 2010, 01:53
von orschiro
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*
Verfasst: Mittwoch 3. März 2010, 07:40
von tordmor
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.
Verfasst: Mittwoch 3. März 2010, 11:34
von orschiro
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.
