Ajax POST и Django Tastypie - PullRequest
       0

Ajax POST и Django Tastypie

8 голосов
/ 22 августа 2011
curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"latlong": "test"}' http://localhost:8000/geo/api/geolocation/

Выше работает нормально, но когда я пытаюсь повторить POST в ajax ниже, я получаю ошибку 500.

$.ajax({
  type: 'POST',
  url: 'http://localhost:8000/geo/api/geolocation/',
  data: '{"latlong": "test"}',
  success: latlongSaved(),
  dataType: "application/json",
  processData:  false,
});

Сообщение об ошибке:

{"error_message": "The format indicated 'application/x-www-form-urlencoded' had no available deserialization method. Please check your ``formats`` and ``content_types`` on your Serializer." .... }

Стоит отметить, что это междоменный домен, и я использую django-crossdomainxhr-middleware.py, найденный через git: gist

Если я добавлю тип контента к вызову ajax, как это:

contentType: "application/json"

Я получаю эту ошибку обратно:

XMLHttpRequest cannot load http://localhost:8000/geo/api/geolocation/. Request header field Content-Type is not allowed by Access-Control-Allow-Headers.
Request URL:http://localhost:8000/geo/api/geolocation/
Request Method:OPTIONS
Status Code:200 OK
Request Headersview source
Access-Control-Request-Headers:Origin, Content-Type, Accept
Access-Control-Request-Method:POST
Origin:http://localhost:3000
Response Headersview source
Access-Control-Allow-Methods:POST,GET,OPTIONS,PUT,DELETE
Access-Control-Allow-Origin:*
Content-Type:text/html; charset=utf-8
Date:Tue, 23 Aug 2011 07:59:49 GMT
Server:WSGIServer/0.1 Python/2.6.1

Ответы [ 3 ]

7 голосов
/ 23 августа 2011

Вы явно объявляете тип своего контента в своем вызове на curl, но вы не конкретизируете свой вызов jQuery.ajax().

Обновите свой JavaScript, чтобы точно определить, каким будет тип контента:

$.ajax({
  type: 'POST',
  url: 'http://localhost:8000/geo/api/geolocation/',
  data: '{"latlong": "test"}',
  success: latlongSaved(),
  dataType: "application/json",
  processData:  false,
  contentType: "application/json"
});
3 голосов
/ 21 февраля 2012

Добавьте XsSharing (https://gist.github.com/1164697) к settings.py:

MIDDLEWARE_CLASSES = [
    ...,
    'django-crossdomainxhr-middleware.XsSharing'
]

Затем используйте следующий javascript для вызова ajax:

$.ajax({
  type: 'POST',
  url: 'http://localhost:8000/geo/api/geolocation/',
  data: '{"latlong": "test"}',
  success: latlongSaved(),
  contentType:'application/json',
  dataType: 'application/json',
  processData: false,
});

Обратите внимание, что data должно бытьправильно сформированная строка JSON, иначе jQuery будет молча игнорировать вызов ajax и ничего не делать.

За кадром стоит то, что вызов ajax сначала отправит OPTIONS /geo/api/geolocation/. Поскольку заголовок ответа изменяется XsSharingПромежуточное программное обеспечение, jQuery выдаст еще один POST /geo/api/geolocation запрос, который выполняет фактическое создание.

3 голосов
/ 23 августа 2011

Я добавил XS_SHARING_ALLOWED_HEADERS в промежуточное ПО, и это решило проблему.

https://gist.github.com/1164697

...