2011-01-31 13 views
3

我正在处理一些传统的Django代码。我有两个几乎相同的观点:Django - 有时request.POST是可变的,有时它不是

@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 

奇怪_mutableTrue的处理器之一,False为其他。

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

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

回答

4

默认情况下,它应该永远是False,在Django的代码,将其设置为TrueMultiPartParser.parse,只发生,如果CONTENT_TYPE开始与multipart的唯一地方。

_load_post_and_filesHttpRequest

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 

所以,如果一个观点越来越多的请求,另一种是不, 那会解释差异。

+0

+1:击败我的方式:) – sdolan 2011-01-31 23:18:27

相关问题