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

发布于 2024-10-15 07:46:35 字数 579 浏览 0 评论 0 原文

我正在处理一些遗留的 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

奇怪的是,对于其中一个处理程序,_mutableTrue,而对于另一个处理程序,_mutableFalse

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

当然,我可以通过使用 request.POST.copy()request.POST._mutable = True 来解决这个问题 QueryDict code> 对象可变,但我想知道是什么原因导致的。

I'm working on some legacy Django code. I have two nearly-identical views:

@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

Strangely _mutable is True for one of the handlers and False for the other.

There is no custom middleware and the stack traces on the resulting Django debug page are practically the same.

Sure, I can get around the problem by using request.POST.copy() or request.POST._mutable = True to make the/a QueryDict object mutable, but I'd like to know what could be causing this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

如歌彻婉言 2024-10-22 07:46:35

默认情况下,它应该始终为 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

因此,如果一个视图正在获取多部分请求,而另一个视图则没有,这就可以解释这种差异。

By default it should always be False, the only place in the Django code that sets it to True is in the MultiPartParser.parse, which only happens if the CONTENT_TYPE starts with multipart.

From _load_post_and_files in 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)
        ...

From parse_file_upload:

parser = MultiPartParser(META, post_data, self.upload_handlers, self.encoding)
return parser.parse()

And from MultiPartParser.parse:

self._post = QueryDict('', mutable=True)
...
return self._post, self._files

So if one view is getting multipart requests and the other is not, that would explain the difference.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文