如何使用XHR通过POST将数据作为键值对而不是字符串发送



我正在创建两个POST调用。一个使用django形式,另一个通过资源xhr使用angular js。

角度设置如下:

myModule.factory('gridData', function($resource) {
//define resource class
var root = {{ root.pk }};
var csrf = '{{ csrf_token }}';
return $resource('{% url getJSON4SlickGrid root.pk %}:wpID/', {wpID:'@id'},{
get: {method:'GET', params:{}, isArray:true},
update:{method:'POST', headers: {'X-CSRFToken' : csrf }}
});
});

通过创建这样的xhr帖子请求:

item.$update();

这个post请求按预期发送到服务器,但当我想访问QueryDict时,我无法访问使用传递的数据

name = request.POST.get('name', None)

name总是这样的None

这背后的问题是QueryDict对象被解析得非常奇怪。

print request.POST
<QueryDict: {u'{"name":"name update","schedule":0"}':[u'']}>

而我本可以预料到这个结果,当我通过"正常"的Post请求发送数据时,我得到了这个结果:

<QueryDict: {u'name': [u'name update'], u'schedule': [u'0']}>

因此,Django似乎在POST请求中收到了一些东西,指示Django将参数解析为一个字符串。你知道如何规避吗?

更新:

我在讨论中发现,他们说问题是,如果您提供除MULTIPART_content之外的任何内容类型,则参数将被解析为一个字符串。我检查了POST请求的内容类型send,它实际上被设置为'CONTENT_TYPE': 'application/json;charset=UTF-8'。因此,这很可能就是问题所在。因此,我的问题是:如何将使用angular.js资源创建的xhr post请求的CONTENT_TYPE设置为MULTIPART_CONTENT

您可以:

  • 摆弄客户端发送数据而不是json
  • 使用json.loads(request.raw_post_data).get('name', None)(django<1.4)
  • 使用json.loads(request.body).get('name', None)(django>=1.4)

Angular文档讨论了转换请求和响应

若要在本地覆盖这些转换,请将转换函数指定为配置对象的transformRequest和/或transformResponse属性。若要全局覆盖默认转换,请覆盖$httpProvider的$httpProvider.defaults.transformRequest和$httpProvider/defaults.transformatResponse属性。

您可以在这里找到前面提到的示例。

最新更新