Получение данных из django.core.handlers.wsgi.WSGIRequest

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

У меня есть код, который делает что-то вроде этого:

class APILogMiddleware:
    ...
    def __call__(self, request):
        request_data = str(getattr(request, 'body', ''))
        response = self.get_response(request)
        try:
             request_data = json.loads(ast.literal_eval(request_data))
             request_data.pop('password', None)
             request_data.pop('email', None)
        except: 
            pass
        logger.info({ 
            'request_data': request_data,
        })
        ...

Но когда я запускаю пост-запрос со следующими конфиденциальными данными, они не исключаются из request_data:

requests.post('some_url/', data={'email':'John.Doe@gmail.com','password': '1234'})

Я пытался решить эту проблему, и обнаружил, что type(request) является <class 'django.core.handlers.wsgi.WSGIRequest'>, и когда я печатаю request.body, я получаю `<class 'bytes'>, выглядящий так:

b'email=John.Doe%John.Doe&password=1234'

Ну, это не было полезно для меня. Я пытался получить данные другим способом с помощью атрибута _post и это работает:

json.loads(json.dumps(getattr(request, '_post', '')))

Но это работает только для запросов методом POST, поскольку для запроса методом PUT я ДЕЙСТВИТЕЛЬНО получаю красиво отформатированные данные JSON под request.body.

Я пытаюсь найти способ сделать то же самое для всех видов запросов.

Вернуться на верх