0👍
This is very old, but as I stumbled myself because of the same issue, I want to offer a solution for those reaching this question via a search. The core issue is the default serializer Django uses for the session data: django.contrib.sessions.serializers.JSONSerializer
. This serializer is not aware of keys associated with multiple values (for them, the getlist()
method of QueryDict
should be used), which results in only the last value for each key being used.
There are two possible solutions:
- Either manually pickle & unpickle the
request.GET
orrequest.POST
object when storing & retrieving from a session;- This will call the
__getstate__()
method ofQueryDict
, see also an old Django ticket.
- This will call the
- Or, pickle the whole data of the session, by switching to the
django.contrib.sessions.serializers.PickleSerializer
.
-1👍
This is not a bug. If you take a peek at the QueryDict
definition (see https://github.com/django/django/blob/master/django/http/init.py), it says explicitly that it’s immutable unless you create a copy of it.
To demonstrate this, here’s what I have in my Python shell,
>>> from django.http import QueryDict
>>> q1 = QueryDict('', mutable=False)
>>> q2 = QueryDict('', mutable=True)
>>> q1['next'] = '/a&b/'
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users/kenny/Desktop/Kreybits/locker/python/lib/python2.7/site-packages/django/http/__init__.py", line 357, in __setitem__
self._assert_mutable()
File "/Users/kenny/Desktop/Kreybits/locker/python/lib/python2.7/site-packages/django/http/__init__.py", line 354, in _assert_mutable
raise AttributeError("This QueryDict instance is immutable")
AttributeError: This QueryDict instance is immutable
>>> q2['next'] = '/a&b/'
>>> q2.urlencode()
'next=%2Fa%26b%2F'
The mutable
argument is set to False by default, and since request.session['query_string'] = request.GET
initialized it to an empty QueryDict to begin with, calling urlencode()
only returns you an empty str while the request.session['query_string'] = request.GET.urlencode()
works because you’re working with a QueryDict that has been initialized with the appropriate key/values.
- [Django]-Relational DatabaseError in django postgresql database after deploying project to bitnami
- [Django]-Can't debug django app in VS Code with docker database: 'could not translate host name "db" to address: Name or service not known'
- [Django]-How to use python-social-auth with google only?
- [Django]-TinyMCE popups not loading when using S3 and setting document.domain
- [Django]-Django-compressor + less compress the files but link to original files