AngularJS $ http.post和Python CGI FieldStorage

时间:2014-01-10 09:37:25

标签: python json angularjs post cgi

我对AngularJS上的$ https.post参数有问题。我读到AngularJS正在为params创建一个JSON。 所以我应用了这里找到的解决方案:

AngularJS - Any way for $http.post to send request parameters instead of JSON?

http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/

但我仍然遇到Python CGI的问题。

[编辑]

为objData:

输出console.log
Object {hostname: "test", id_venue: 20}

检查请求有效负载:

action: "insert",
objData: { first: "test", second:"test2" }

[/编辑]

网站电话

angular.module('myApp.services', [])
    .service('MyService', ['$http', '$q', function ($http, $q) {
        this.insert = function (objData){
            console.log(objData);
            var deferred = $q.defer();
            $http.post('api/api.py', { action: 'insert', objData: objData }).success(function (data, status, headers, config) {
                deferred.resolve(data);
            }).error(function (response) {
                deferred.reject("error");
            });
            return deferred.promise;
        };
   }])

服务器端代码由Python和CGI构成。不幸的是,我不能使用Web框架。

API / api.py

import cgi
params = cgi.FieldStorage()

print 'Content-type: application/json'
print
print params
print params['objData'].value

检查请求标头和响应,我显然有一个KeyError:

FieldStorage(None, None, [MiniFieldStorage('action', 'insert'), MiniFieldStorage('objData[first]', 'test'), MiniFieldStorage('objData[second]', 'test2')])
KeyError: 'objData'

有关如何在Python CGI FieldStorage上正确读取params的任何解决方案。 或者使用AngularJS正确发送它们的任何方式? 使用$ http.get我没有任何问题。

也许一个解决方案可以直接在Python中处理POST请求而不使用cgi.FieldStorage。

1 个答案:

答案 0 :(得分:0)

据我所知,在js方面,objData似乎包含{“first”:“test”,“second”:“test2”}。

作为第一个建议,我建议通过在js客户端上使用objData键作为POST键来使你的生活变得更轻松(我假设objData键不以下划线开头,所以在在服务器端,你可以在action和obj键之间做出改变):

params = {_action:'insert'};
_.extend(params, objData); // using underscore or lodash
[...]
$http.post('api/api.py', params)

潜在的问题是你的插入函数非常通用,objData可以是任何东西(所以除了js dictionnary之外),我的第二个建议是首先将你的objData序列化为json字符串(你可以找到js libs for这个),然后发送{action:'insert','jsondata':json_string}。 在python方面,你将不得不反序列化json_string,使用json模块非常容易。

因此,你可以使用经典的POST(< - >不是完整的json编码的表单数据)和一些json的东西。

HTH