【问题标题】:Angular resource posts data but not receiving by django viewAngular资源发布数据但django视图未接收
【发布时间】:2015-12-11 06:59:51
【问题描述】:

我已经创建了一个角度资源

var services = angular.module('Services', ['ngResource']).
// SEND_REPLY_SMS
factory('SendSMS', ['$resource', function($resource){
    return $resource('/bulk-sms/reply/', null,
    {
        send: {method: 'POST'},
    }
);
}]);

我把它当做

var data = $scope.data;
SendSMS.send({},data,
   function(data){
       console.log(data);
   },function(error){
       console.log(error);
   }
);

我检查了console.log(data),data包含了数据,浏览器显示post请求已经提交了数据。

但是当我在 django 视图中收到它时,我无法在 django 视图中获取数据,而我的 django 视图是

class ReplySMSView(View):

    def post(self, request):
        data = request.POST.copy()
        print 'post data', request.POST # here data is not printed
        data = dict(data.items())
        return self.process(request, data)

    def get(self, request):
        data = request.GET.copy()
        print 'get data', request.GET # here data is not printed
        data = dict(data.items())
        return self.process(request, data)

    def process(self, request, data):
        dct = {}
        print data 
        model = IncomingMessage
        account = request.user.account
        contacts = data.get('contacts', '')
        contacts = contacts if contacts else get_contacts_by_filter(model, data)
        # TODO: get_contacts_by_filter is not working here for IncomingMessage
        message = data.get('message', '')
        identity = data.get('identity', '')
        if not contacts:
            dct['contacts'] = 'No contacts found.'
        if not message:
            dct['message'] = 'Message is required.'
        if not identity:
            dct['identity'] = 'Identity is required.'
        if dct:
            return HttpResponse(json.dumps(dct), content_type='application/json')
        response = send_bulk_sms(contacts, message, identity, account, module='bulk')
        return HttpResponse(response)

我没有发现这段代码的问题在哪里?

【问题讨论】:

    标签: python angularjs django angular-resource


    【解决方案1】:

    AngularJS 会将序列化为 JSON 的数据发布,但 django 期望接收表单数据。如果您想接收该数据,您可以更改 AngularJS 的默认行为,不使用 POST,而是使用 request.body 获取数据,或者您可以使用一些第三方包,例如 Django REST framework 为您完成工作。

    【讨论】:

      【解决方案2】:

      在调用ajax时,你会在请求体中收到编码的json字符串,所以你需要使用python的json模块对其进行解码以获得python dict。 由于 django 是一个网络框架,它需要来自表单的数据。

      我真的推荐使用这个框架http://www.django-rest-framework.org/

      反正获取post数据在你看来会是这样的:

      (Pdb) request.POST
      <QueryDict: {}>
      (Pdb) import json
      (Pdb) json.loads(request.body)
      {u'operator': u'pepe', u'password': u'1234', u'transport': u'LUUAAA'}
      

      import json
      class ReplySMSView(View):
      
          def post(self, request):
              data = json.loads(request.body)
              print 'post data', request.POST # here data is not printed
              data = dict(data.items())
              return self.process(request, data)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-23
        • 2015-02-02
        • 1970-01-01
        • 1970-01-01
        • 2015-11-25
        • 2011-06-10
        • 2017-04-05
        相关资源
        最近更新 更多