Django - 有时候是request.POST是可变的,有时候不是

时间:2011-01-31 23:01:59

标签: django django-views

我正在研究一些遗留的Django代码。我有两个几乎相同的观点:

@login_required
def foo(request):
    assert False, "foo mutable=%s" % request.POST._mutable

@login_required
def bar(request):
    assert False, "foo mutable=%s" % request.POST._mutable

奇怪的是,_mutable对于其中一个处理程序为True,对另一个处理程序为False

没有自定义中间件,生成的Django调试页面上的堆栈跟踪实际上是相同的。

当然,我可以通过使用request.POST.copy()request.POST._mutable = True来解决问题,使/ QueryDict对象变得可变,但我想知道是什么导致这种情况。

1 个答案:

答案 0 :(得分:4)

默认情况下,它应始终为False,Django代码中将其设置为True的唯一位置位于MultiPartParser.parse,只有在CONTENT_TYPE时才会出现以multipart开头。

来自HttpRequest中的_load_post_and_files

if self.META.get('CONTENT_TYPE', '').startswith('multipart'):
    self._raw_post_data = ''
    try:
        self._post, self._files = self.parse_file_upload(self.META, self)
        ...

来自parse_file_upload

parser = MultiPartParser(META, post_data, self.upload_handlers, self.encoding)
return parser.parse()

来自MultiPartParser.parse

self._post = QueryDict('', mutable=True)
...
return self._post, self._files

因此,如果一个视图获得多部分请求而另一个视图没有,则可以解释差异。