Невозможно получить доступ к request.data в фильтре журнала
Я использую Django REST Framework и следую этому ответу django logging - django.request logger and extra context для включения пользовательских данных в мои записи журнала. При попытке получить доступ к record.request.data
внутри filter()
(чтобы сохранить его в record.data
, как предлагается в этом ответе) я получаю RawPostDataException: You cannot access body after reading from request's data stream
. Я перепробовал множество способов, но ни один из них не помог. Не могу вручную перемотать поток данных запроса, ни получить свежую копию объекта запроса. Я никогда не обращаюсь вручную к request.body
, как советуют избегать в ответах SO. Любая помощь будет принята с благодарностью.
Вот код:
import logging
from rest_framework.request import Request
from rest_framework.settings import api_settings
class RequestInfoFilter(logging.Filter):
def filter(self, record):
parsers = [parser() for parser in api_settings.DEFAULT_PARSER_CLASSES]
authenticators = [
auth() for auth in api_settings.DEFAULT_AUTHENTICATION_CLASSES]
request = Request(
record.request, parsers=parsers, authenticators=authenticators)
record.method = request.method
record.query_params = request.query_params
record.data = request.data # RawPostDataException: You cannot access body after reading from request's data stream
return True
Обратите внимание, что это происходит только при регистрации представлений, которые сами обращаются к request.data
, если они этого не делают, то ошибка не возникает.