Получение данных из 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
.
Я пытаюсь найти способ сделать то же самое для всех видов запросов.