La modification de Dictionnaire dans Django Session Ne doit Pas Modifier la Session
Je suis le stockage des dictionnaires dans ma session référencée par une clé de chaîne:
>>> request.session['my_dict'] = {'a': 1, 'b': 2, 'c': 3}
Le problème que j'ai rencontré, c'est que quand j'ai modifié le dictionnaire directement, la valeur ne serait pas changé au cours de la prochaine requête:
>>> request.session['my_dict'].pop('c')
3
>>> request.session.has_key('c')
False
# looks okay...
...
# Next request
>>> request.session.has_key('c')
True
# what gives!
- Je ne peux pas croire que je viens de passer une heure et demi arraché de débogage ce avant de trouver cette question. Merci de poser cette question et merci pour toutes les réponses. Vous avez sauvé mes nerfs et le reste de ma journée.
Vous devez vous connecter pour publier un commentaire.
Comme l' états de documentation, une autre option est d'utiliser
qui que cela se produise à chaque demande, de toute façon. Peut-être la peine si cela se passe beaucoup de choses dans votre code, j'imagine que l'occasionnel charge supplémentaire ne serait pas beaucoup et c'est beaucoup moins que le potentiel de problèmes du fait de la négligence de l'inclusion de la
ligne à chaque fois.
Je m'excuse pour "poser" une question dont je connais déjà la réponse, mais c'était assez frustrant que je pensais que la réponse doit être enregistrée sur stackoverflow. Si quelqu'un a quelque chose à ajouter à mon explication je vais le prix de la "réponse". Je ne pouvais pas trouver la réponse par la recherche basée sur le problème, mais après une recherche basée sur la réponse, j'ai trouvé que mon "problème" est comportement documenté. S'avère également une autre personne a eu ce problème.
Il s'avère que SessionBase est un objet de type dictionnaire qui garde une trace de quand de le modifier avec les touches, et définit manuellement un attribut
modified
(il y a aussi unaccessed
). Si vous vous trompez dans les objets dans les clés, cependant, SessionBase n'a aucun moyen de savoir que les objets sont modifiés, et par conséquent, vos changements ne sont pas stockés dans quel backend vous utilisez. (Je suis en utilisant une base de données backend; je suppose que ce problème s'applique à tous les backends, cependant). Ce problème peut ne pas s'appliquer à des modèles, depuis le backend est probablement stocker une référence du modèle (et donc recevoir tout change quand il chargé le modèle de la base de données), mais le problème ne s'appliquent à des dictionnaires (et peut-être toute autre base de python les types qui doivent être entièrement stockées dans la session magasin.)Le truc, c'est qu'à chaque fois que vous modifiez des objets à la session et la session ne sera pas un avis, vous devez indiquer explicitement à la session qu'il est modifié:
Espère que cela aide quelqu'un.
La façon dont je suis arrivé c'était pour encapsuler toute pop-actions sur la séance, dans une méthode qui prend soin des détails (cette méthode accepte un paramètre affichage de sorte que les variables de session peut être spécifique à la vue):
Je ne suis pas trop surpris par cela. Je pense que c'est juste comme modifier le contenu d'un tuple:
Mais merci quand même.