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

странно _mutable является True для одного из обработчиков и False для другого.

Не существует специального промежуточного программного обеспечения, и трассировка стека на полученной странице отладки Django практически одинакова.

Несомненно, я могу обойти эту проблему, используя request.POST.copy() или request.POST._mutable = True, чтобы изменить// QueryDict объект, но я хотел бы знать, что может быть причиной этого.

ответ

4

По умолчанию он должен быть всегда False, единственное место в коде Джанго, который устанавливает его True находится в MultiPartParser.parse, что только произойдет, если CONTENT_TYPE начинается с multipart.

От _load_post_and_files в HttpRequest:

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

+0

SUNNUVA. Спасибо огромное! –

Смежные вопросы