4

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

我存储request.GET在会话中:

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

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

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

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

如果我将 urlencoded 字符串存储在会话中,而不是 QueryDict,则一切正常:

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

这是一个错误吗?

4

2 回答 2

0

这已经很老了,但是由于同样的问题,我偶然发现了自己,我想为那些通过搜索找到这个问题的人提供一个解决方案。核心问题是Django 用于会话数据的默认序列化django.contrib.sessions.serializers.JSONSerializer程序: . 这个序列化程序不知道与多个值关联的键(对于它们,应该使用的getlist()方法),这导致每个键只使用最后一个值。QueryDict

有两种可能的解决方案:

  • 在存储和检索会话时 手动腌制和取消腌制request.GET或对象;request.POST
  • 或者,通过切换到django.contrib.sessions.serializers.PickleSerializer.
于 2022-01-13T12:09:39.610 回答
-1

这不是错误。如果您查看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()因为您正在使用已使用适当的键/值初始化的 QueryDict。

于 2011-08-15T17:45:06.433 回答