如何在中间件中更新Django HttpRequest的主体

11 投票
1 回答
6283 浏览
提问于 2025-04-18 00:31

我有一个PUT请求,想在我的中间件里更新一些参数的值。我知道不能直接访问PUT参数,所以我通过 request.body 来获取它们。

一旦这些值更新完,我需要把这个 request 传递给视图。但是,如果我在我的中间件里尝试这样做:

request.body = new_content

我会得到:

AttributeError: can't set attribute

有没有办法在中间件里更新这些参数并把它们传递出去呢?

1 个回答

15

request.body 是在HttpRequest类中定义的一个property(属性)。

下面是body属性的代码样子:

@property
def body(self):
    if not hasattr(self, '_body'):
        if self._read_started:
            raise RawPostDataException("You cannot access body after reading from request's data stream")
        try:
            self._body = self.read()
        except IOError as e:
            six.reraise(UnreadablePostError, UnreadablePostError(*e.args), sys.exc_info()[2])
        self._stream = BytesIO(self._body)
    return self._body

我将使用的方法是修改process_request方法中的_body属性。这里的返回值是None,因为我希望Django继续通过中间件处理这个请求,直到到达合适的视图。

class MidddlewareWithHttpPutRequest:
    def process_request(self, request):
        data = getattr(request, '_body', request.body)
        request._body = data + '&dummy_param=1'
        # if you call request.body here you will see that new parameter is added
        return None

撰写回答