Django (DRF) не показывает POST-данные CORS (из интерфейса React) - PullRequest
0 голосов
/ 12 июня 2018

Я использую интерфейс React, взаимодействующий с бэкэндом DRF (Django Rest Framework).

В настоящее время оба работают на своих собственных серверах разработки, поэтому они работают в отдельных доменах.

Я отправляю данные из внешнего интерфейса на сервер, используя метод POST, используя Axios для отправки запроса.

Код, который я использую, можно увидеть ниже.

Проблема:

Кажется, что Django не получает POST-данные.

Как видно из кода ниже, я пытаюсь распечатать полученные данные, но этовот что я вижу в консоли:

[12/Jun/2018 13:33:17] "OPTIONS /order/create HTTP/1.1" 200 0

request.POST:

<QueryDict: {}>

[12/Jun/2018 13:55:47] "POST /order/create HTTP/1.1" 200 2

(кажется нормальным, что печатная информация идет первой в консоли, а строка для этого запроса POST после этого. Даже если оператор print выполняетсяпо запросу POST, а не по запросу OPTIONS. Это поначалу немного смутило меня.)

То, что я уже пробовал:

Я пытался добавить следующий заголовок:

headers: {'Content-Type': 'application/json'}

Я пытался добавить:

withCredentials: true

(закомментировано в моем коде, внизу, если этот пост)

Первоначально это дало мне ошибку об ответе на предпечатный запрос, не содержащий Access-Control-Allow-Credentials 'заголовок со значением' true '.И эту ошибку я исправил, добавив следующее:

CORS_ALLOW_CREDENTIALS = True 

(из приложения Django-cors-headers, установите это в settings.py) https://github.com/ottoyiu/django-cors-headers

и затем добавьте вручнуюзаголовок моего ответа:

response['Access-Control-Allow-Credentials'] = 'true'

Я уже исследовал части о CORS прежде, но снова я прочитал страницу ниже.Кажется, он не дает ответа.

https://www.html5rocks.com/en/tutorials/cors/

Код аксиоса:

checkoutCart: function(submittedValues, products) {

  console.log("checkoutCart")

  console.log(submittedValues)

  console.log(products)

  // let data = {

  //   formData: submittedValues,

  //   productData: products,

  // }

  return axios({

    method: 'post',

    url: 'http://127.0.0.1:8000/order/create',

    data: {

      formData: submittedValues,

      productData: products,

    },

    headers: {'Content-Type': 'application/json'},

    //withCredentials: true,

  })

    .then(function(response) {

      console.log(response)

    })

    .catch(function(error) {

      console.log("error", error)

    })

}

Вид Django:

from django.views.decorators.csrf import csrf_exempt

from django.http import JsonResponse



@csrf_exempt

def handle_order(request):

    if request.method == 'POST':

        print("request.POST:")

        print(request.POST)

    response = JsonResponse({})

    response['Access-Control-Allow-Credentials'] = 'true'

    return response

1 Ответ

0 голосов
/ 12 июня 2018

Вы можете получить данные поста с помощью:

request.body

После того, как вы получите данные поста, вам нужно их декодировать с помощью

request.body.decode('utf-8')

Если вы хотите проанализировать этот набор данных, вы можете использовать библиотеку json для преобразования строки в итеративный формат, используя:

json.loads(your_post_data)

Вот весь рабочий фрагмент:

def handle_order(request):
    if request.method == 'POST':
        unparsed_json = request.body.decode('utf-8') #Get the data and decode it
        postData = loads(unparsed_json) #Convert it to [dict]
        for keys in postData:
            print(keys) #print all the values in the dict
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...