在会话中存储QueryDict后不能urlencode()

时间:2011-08-15 15:36:36

标签: django django-sessions

我尝试将此发布到django-users组(http://groups.google.com/group/django-users/browse_thread/thread/8572d7f4075cfe0e),但没有得到回复。也许在这里我会得到更多的帮助。

我将request.GET存储在会话中:

request.session['query_string'] = request.GET

然后我在另一个页面中检索该值并尝试对其进行urlencode 的QueryDict:

context['query_string'] = request.session['query_string'].urlencode()

在我的上下文中我得到了python的字符串表示形式 QueryDict对象而不是预期的key0=value0&key1=value1&... 字符串。

如果,而不是QueryDict,我将urlencoded字符串存储在 会议,当然一切正常:

request.session['query_string'] = request.GET.urlencode()

这是一个错误吗?

1 个答案:

答案 0 :(得分:0)

这不是错误。如果您看一下QueryDict定义(请参阅https://github.com/django/django/blob/master/django/http/init.py),它会明确说明它是不可变的,除非您创建它的副本。

为了证明这一点,这是我在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'

默认情况下mutable参数设置为False,并且由于request.session['query_string'] = request.GET将其初始化为空的QueryDict,因此调用urlencode()只会返回空的str request.session['query_string'] = request.GET.urlencode() 1}}有效,因为您正在使用已使用适当的键/值初始化的QueryDict。