gpt4 book ai didi

Django - 有时 request.POST 是可变的,有时不是

转载 作者:行者123 更新时间:2023-12-01 13:03:01 25 4
gpt4 key购买 nike

我正在处理一些遗留的 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 来解决这个问题,使/a QueryDict 对象可变,但我想知道是什么原因造成的。

最佳答案

默认情况下它应该总是False,Django 代码中唯一将它设置为True 的地方是MultiPartParser.parse。 ,只有当 CONTENT_TYPEmultipart 开头时才会发生。

来自 _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

因此,如果一个 View 收到多部分请求而另一个没有收到,那就可以解释差异。

关于Django - 有时 request.POST 是可变的,有时不是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4857133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com