3

我正在创建两个 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();

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

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

name总是None这样。

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

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

而我本来期望这个结果,当我通过“正常”发布请求发送数据时得到这个结果:

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

所以似乎 Django 在 POST 请求中接收到一些东西,指示 Django 将参数解析为一个字符串。知道如何规避这个问题吗?

更新:

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

4

1 回答 1

5

你可以:

  • 摆弄客户端发送数据而不是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.transformResponse 属性。

您可以在此处找到前面提到的示例。

于 2012-10-11T09:03:42.150 回答