Как отправить данные из React в Django API - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь добавить некоторые данные в базу данных с помощью django. В качестве внешнего интерфейса я использую React.

Таким образом, fetch запрос выглядит следующим образом:

const data = {
  name: formData.name,
  email: formData.email,
  title: formData.title,
  message: formData.message
};

fetch("/some/some_view/", {
  method: 'POST',
  headers: {
    'Accept': 'application/json, text/plain, */*',
    "Content-Type": "application/json"
  },
  body: JSON.stringify(data),
})
  .then((response) => response.json())
  .then((data) => {
  debugger;
  console.log('Success:', data);
})
  .catch((error) => {
  debugger;
  console.error('Error:', error);
});

И в Django у меня есть вид следующим образом:

@csrf_exempt
def some_view(request):
    if request.method == 'GET':
        return HttpResponse('Unauthorized', status=400)
    if request.method == 'POST':
        #TODO: Add security
        item = json.loads(request.POST.get('body'), object_hook=json_util.object_hook)
        pdb.set_trace()
        return HttpJsonOk()

В request.POST я получаю данные для отправки следующим образом:

<QueryDict: {u'{"name":"dsdsd","email":"dsdsd@dsds.com","title":"dsds jflj ","message":"dlkj lksj kmsdkk fljs m"}': [u'']}>

Но я ожидаю, что они будут в request.POST.get('body'), но там я ничего не получаю.

Есть идеи?

1 Ответ

0 голосов
/ 16 января 2020

request.POST содержит результат анализа request.body в виде закодированного содержимого. Обратите внимание, что реальное содержимое запроса на самом деле находится в request.body (распечатайте его, чтобы узнать, как оно выглядит).

Теперь ваш фронт ответа публикует json содержимое содержимое не закодировано в форме, поэтому вы НЕ МОЖЕТЕ получить эти данные из request.POST - как вы, очевидно, можете понять из того, как выглядит запрос:

 <QueryDict: {u'{"name":"dsdsd","email":"dsdsd@dsds.com","title":"dsds jflj ","message":"dlkj lksj kmsdkk fljs m"}': [u'']}>

Как видите, синтаксический анализ не выполнен (поскольку это не закодировано в форме), что приводит к тому, что все переданные json используются в качестве ключа, без ассоциированного значения.

IOW, предложение LinnTroll на самом деле является правильным решением - тем, которое используется любой средой REST (DRF, беспокойный и т. Д. c) FWIW -: просто используйте request.body, точка.

Но мне нужны данные в request.POST.get ('body')

Вы не можете, потому что в request.POST нет клавиши 'body'. Период.

...