我正在研究一些遗留的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
对象变得可变,但我想知道是什么导致这种情况。
答案 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)
...
parser = MultiPartParser(META, post_data, self.upload_handlers, self.encoding)
return parser.parse()
self._post = QueryDict('', mutable=True)
...
return self._post, self._files
因此,如果一个视图获得多部分请求而另一个视图没有,则可以解释差异。