2011-01-31 36 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

相關問題