从AngularJS发布到GAE Python

时间:2014-07-17 03:35:56

标签: python angularjs

我尝试设置一个AngularJS前端,以便在GAE上与Python后端进行通信。我有以下代码:

//Angular factory
app.factory('turn', function($http, $q){
   return{  
     get : function(){
        var deferred = $q.defer()
        var url = 'save'
        $http.get(url).success(function(data){
            deferred.resolve(data)
        })
        return deferred.promise
    },
    save : function(data){
        $http({
            method: 'post',
            url: 'save',
            data: data,
            headers:{'Content-type': 'application/json'}

        }).success(function(response){
            return response
        }).error(function(response){
            return response
        })

    }

}//close return
})//close factory

#Python back end
class Data(webapp2.RedirectHandler):
def get(self):
    self.response.headers['Content-Type'] = 'application/json'
    data = {"success": 'Yes', "payload": "You got it"}
    json.dump(data, self.response.out)

def post(self):
    logging.info(self.request.get('name'))
    data = self.request.get('payload')
    data = {'response': data}
    logging.info(data)
    self.response.headers['Content-Type'] = 'application/json'
    json.dump(data, self.response.out)

// Line of code which fires the process and should display the response.
$scope.message = turn.save({name:'Neil', payload: 'payload'}).response

get方面工作正常,但Post在开发服务器上不起作用。

由于我的状态代码为200,当我查看实际消息时(使用Chrome开发工具/网络),消息似乎正确形成,看起来信息是在Headers Request Payload和Response上。

然而,Python后端和Angular前端都无法读取数据。

更新:已经深入挖掘了webapp2文档并提出了这个看起来有点像黑客攻击的解决方案:

def post(self):
    data = self.request.POST.items()[0][0]
    data = json.loads(data)
    data = {'response': data['name']}      
    self.response.headers['Content-Type'] = 'application/json'
    json.dump(data, self.response.out)

出于某种原因,来自Angular的整个Post Json数据作为第一个元组的关键部分进入Webapp2 MultiDict。然后需要将其删除并运行json库以转换为我现在可以使用的字典。

在Angular端对代码进行了一些小的调整,以便控制器现在可以处理结果

工厂现在读取:

save : function(data){
        return $http({
            method: 'post',
            url: 'save',
            data: data,
            headers:{'Content-Type': 'application/x-www-form-urlencoded'}               
        })
    }

请注意Content-Type中的更改。这是发送到webapp2的数据的首选类型。

控制器呼叫:

turn.save({name:'Neil', payload: 'payload'}).then(function(response){
        $scope.message=response.data.response

    })

现在正确地将信息发送到后端并向前端发送响应。请注意,我从后端创建和发送的实际Json数据位于response.data。我不得不查看整个响应,找到它的放置位置。

我会放弃这个,因为我确信我不是唯一一个遇到这个问题的人。

0 个答案:

没有答案