Данные в request.body не могут быть найдены request.data - Django Rest Framework
Я пишу приложение на django. Я пытаюсь вызвать мой django rest framework извне и ожидаю ответа. Я использую запросы для отправки некоторых данных в функцию в DRF следующим образом:
j=[i.json() for i in AttachmentType.objects.annotate(text_len=Length('terms')).filter(text_len__gt=1)]
j = json.dumps(j)
url = settings.WEBSERVICE_URL + '/api/v1/inference'
headers = {
'Content-Disposition': f'attachment; filename={file_name}',
'callback': 'http://localhost',
'type':j,
'x-api-key': settings.WEBSERVICE_API_KEY
}
data = {
'type':j
}
files = {
'file':file
}
response = requests.post(
url,
headers=headers,
files=files,
json=data,
)
В DRF я использую объект запроса для получения данных.
class InferenceView(APIView):
"""
From a pdf file, extract infos and return it
"""
permission_classes = [HasAPIKey]
def post(self, request):
print("REQUEST FILE",request.FILES)
print("REQUEST DATA",request.data)
callback = request.headers.get('callback', None)
# check correctness of callback
msg, ok = check_callback(callback)
if not ok: # if not ok return bad request
return build_json_response(msg, 400)
# get zip file
zip_file = request.FILES.get('file', None)
parsed = json.loads(request.data.get('type', None).replace("'","\""))
Проблема в том, что данные в DRF принимаются неправильно. Все, что я отправляю из requests.post, не принимается. Я отправляю файл и JSON вместе. Файл почему-то принимается, а другие данные - нет. Если я пытаюсь сделать что-то вроде
request.data.update({"type":j})
В DRF JSON корректно добавляется к данным, так что это не проблема с самим JSON, который я пытаюсь отправить. Другое дело, request.body показывает, что JSON каким-то образом присутствует в теле, но request.data не может его найти. Я не хочу использовать request.body напрямую, потому что не могу понять, почему он присутствует в теле, но не виден request.data.
В этой строке
response = requests.post(
url,
headers=headers,
files=files,
json=data,
)
замените json=data на data=data
вот так:
response = requests.post(
url,
headers=headers,
files=files,
data=data,
)