2011-01-31 9 views
3

私はいくつかのレガシーDjangoコードに取り組んでいます。私は2つのほぼ同一のビューを持っている: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は、ハンドラの1つおよび他のためのFalseためTrueです。

カスタムミドルウェアはありません。また、結果のDjangoデバッグページのスタックトレースは実質的に同じです。

確かに、request.POST.copy()またはrequest.POST._mutable = Trueを使用して/ QueryDictオブジェクトを変更可能にすることができますが、何が原因である可能性がありますかを知りたいと思います。デフォルトでは

答えて

4

が、それは常にFalseする必要があり、Trueに設定するDjangoのコードで唯一の場所はCONTENT_TYPEmultipartで始まる場合のみ発生MultiPartParser.parse、です。 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 

だから、1つのビューがマルチパートの要求を取得しているし、他ではない場合、それは違いを説明してください。

+0

+1:私にそれを打つ方法:) – sdolan

+0

SUNNUVA。どうもありがとうございます! –

関連する問題