1. ホーム
  2. パイソン

Django リクエストボディの属性を変更する AttributeError: 属性を設定できない

2022-02-10 19:19:19
<パス

結論から言うと、request.bodyの値は以下のコードで変更可能です。

request._body = b'xxxxxxxxxx'









Django リクエストボディの属性を変更する AttributeError: 属性を設定できない

ここで、すべてのHttpリクエストをブロックし、後でhttpボディ(request.body)の値を変更するインターセプターを追加する要件がある。

しかし、それを直接変更すると、次のような例外がスローされます "AttributeError: can't set attribute"

request.body = b'{"key": "value2"}'

Traceback (most recent call last):
  File "D:\Python36\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "D:\Python36\lib\site-packages\django\utils\deprecation.py", line 90, in __call__
    response = self.process_request(request)
  File "C:\Users\Administrator\PycharmProjects\CeleryDemo\CeleryDemo\UserMiddleware.py", line 22, in process_request
    request.body = b'{"key": "value2"}'
AttributeError: can't set attribute

class HttpRequest:
	@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")
	
	        # Limit the maximum request data size that will be handled in-memory.
	        if (settings.DATA_UPLOAD_MAX_MEMORY_SIZE is not None and
	                if (settings.DATA_UPLOAD_MAX_MEMORY_SIZE is not None and int(self.META.get('CONTENT_LENGTH') or 0) > settings.DATA_UPLOAD_MAX_MEMORY_SIZE):
	            raise RequestDataTooBig('Request body exceeded settings.DATA_UPLOAD_MAX_MEMORY_SIZE.')

            try:
                self._body = self.read()
            except IOError as e:
                raise UnreadablePostError(*e.args) from e
            self._stream = BytesIO(self._body)
        return self._body


Django のソースコードを見る

request._body = b'{"key": "value2"}'


このコードでは、そのbodyプロパティが@propertyで変更されているので、読み取り専用のプロパティであることがわかります。ソースコードを見ればわかりますが、bodyプロパティは_bodyから取得しているので、_bodyを変更するだけでOKです。

request._body = b'{"key": "value2"}'