【问题标题】:AngularJS $http.post and Python CGI FieldStorageAngularJS $http.post 和 Python CGI FieldStorage
【发布时间】:2015-01-29 07:43:26
【问题描述】:

我对 AngularJS 上的 $https.post 参数有疑问。我读到 AngularJS 正在为参数创建一个 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 上的参数的任何解决方案。 或者有什么方法可以用 AngularJS 正确发送它们? 使用 $http.get 我没有任何问题。

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

【问题讨论】:

  • js端objData包含什么?
  • 我编辑了答案以显示 objData 值
  • 好的,我的答案假设是错误的,但顺便说一句,它并没有完全使答案无效:)

标签: python json angularjs post cgi


【解决方案1】:

据我所知,在 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 字典之外),我的第二个建议是首先将您的 objData 序列化为 json 字符串(您可以找到 js 库this),然后发送 {action: 'insert', 'jsondata': json_string}。 在 python 方面,您必须反序列化 json_string,这对于 json 模块来说非常容易。

因此,您既可以使用经典的 POST( 不是完整的 json 编码的表单数据)也可以使用一些 json 的东西。

HTH

【讨论】:

  • 关于第二个推荐,谢谢,它非常有效。我不知道为什么我以前没有考虑过!关于第一个建议,你能澄清一下吗?真正的好处是什么?
  • 如果你确定 objData 是一个 Javascript 字典,第一个建议避免在 JS 端进行 JSON 序列化并在 Python 端反序列化,从而给你一些微秒:p 另一点是它是一个“正常”的 POST,而 2nd reco 在客户端和服务器之间创建了一些耦合(必须使用相同的语言)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 2018-03-17
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
相关资源
最近更新 更多