Изменить значение тела в запросе django - PullRequest
0 голосов
/ 05 августа 2020

Я хочу обновить значение значения тела json в сообщении Request в моем django API (также используя rest framework), прямо сейчас я пытаюсь сделать это с помощью настраиваемое промежуточное ПО. Это мое промежуточное ПО.

def CustomMiddleware(get_response):
    def middleware(request):

        print('request: ', request, ' type: ', type(request), ' vars: ', vars(request))
        print('request: ', request.body)
        body = json.loads(request.body)
        body['attr'] = str(body['attr'])+'abc'
        request.body = json.dumps(body)
        response = get_response(request)
        return response

return middleware

Итак, когда я делаю POST-запрос к своему API, я получаю следующую ошибку:

File "/path/models_masking/mask_middleware.py", line 37, in middleware
    request.body = json.dumps(request_updated)
AttributeError: can't set attribute

Я прочитал и обнаружил, что request объект неизменен, поэтому я не уверен, смогу ли я скопировать, чтобы запросить объект, изменить копию, а затем отправить ее в функцию get_response, или, может быть, есть лучший подход для этого, может быть, декоратор для моих классов APIView.

Может ли кто-нибудь помочь мне с элегантным решением для этого?

EDIT

Значение 'attr' + 'ab c' равно новое значение, которое используется во многих частях кодовой базы, моя основная проблема заключается в том, что я не хочу изменять это значение во многих функциях, которые находятся во многих конечных точках запроса, поэтому моей первой идеей было обновить значение запросов на автоматическое изменение значения attr во всех запросах, вместо обновления каждого из них.

Возможно, это новый вопрос, но может ли кто-нибудь дать лучшее решение моей проблемы , Буду признателен.

1 Ответ

2 голосов
/ 05 августа 2020

Я согласен с другими людьми, что не принято изменять тело запроса, но если вам действительно нужно, вы можете установить request._body, поскольку 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")

            # Limit the maximum request data size that will be handled in-memory.
            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
...