2017-05-10 5 views
0

Ich möchte eine Python-Liste in meiner Sitzungsvariablen speichern und sie bei nachfolgenden Aufrufe bearbeiten. Ich habe gerade diese (in einer Ansicht):Sitzungsvariable in Django bearbeiten

if 'x' not in request.session: 
    request.session['x'] = [] 
request.session['x'].append('test') 

Dies funktioniert nur auf dem ersten Versuch, das heißt die Sitzung tatsächlich ['test'] unter dict Schlüsseln 'x' nach dem ersten Mal dieser Ansicht aufgerufen wird, enthalten wird. Wenn ich dies jedoch ein zweites Mal versuche, wird die Liste aktualisiert (wie ich beim Debuggen sehen kann), aber der Wert wird nicht beibehalten, wie durch das Debuggen nachfolgender Aufrufe belegt wird: der Wert bleibt ['test'] langfristig, anstatt zu werden ['test','test'].

Ich habe den folgenden Schritt als Workaround gefunden, aber ich bin mir nicht sicher, ob ich versuchen sollte, es zu umgehen: umgeht dieser Code eine vernünftige Einschränkung von Django auferlegt?

temp_var = request.session['x'] 
temp_var.append('test') 
request.session['x'] = temp_var 

Antwort

2

In Django, wie es implementiert ist, wird die Sitzung aktualisiert, wenn es geändert wird.

Dies ist ziemlich einfach für unveränderlichen Typ, da sie immer durch Zuweisungen geändert werden und die Sitzungen __setitem__ aufgerufen wird. Die Sitzung kennt die Änderung.

Wenn Sie ein veränderbares Objekt wie Ihre Liste in der Sitzung speichern, enthält es nur einen Verweis darauf. Wenn die Liste geändert wird, bleibt die Referenz gleich. In der Sitzung wird nichts aufgerufen. Es wird die Veränderung niemals bemerken.

Also, mit Djangos-Sitzungen sollten Sie immer eine Zuweisung verwenden, um Werte zu speichern oder zu ändern.

+0

Es sieht so aus, als hätte ich die Dokumente ein bisschen weiter lesen sollen: https://docs.djangoproject.com/en/1.11/topics/http/sessions/#when-sessions-are-saved – blagae

Verwandte Themen