AngularJS $http.post и Python CGI FieldStorage

У меня проблема с параметрами $https.post в AngularJS. Я читал, что AngularJS создает JSON для параметров. Поэтому я применил решение, найденное здесь:

https://stackoverflow.com/questions/12190166/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.

[Изменить]

Вывод console.log для objData:

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. К сожалению, это ограничение, что я не могу использовать веб-фреймворки.

апи/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 у меня нет проблем.

Возможно, одним из решений может быть обработка запроса POST непосредственно в Python без использования cgi.FieldStorage.


person Nicola    schedule 10.01.2014    source источник
comment
Что содержит objData на стороне js?   -  person Raphaël Braud    schedule 10.01.2014
comment
Я отредактировал ответ, чтобы показать значение objData   -  person Nicola    schedule 10.01.2014
comment
Хорошо, предположения моих ответов были неверными, но, кстати, это не полностью делает ответ недействительным :)   -  person Raphaël Braud    schedule 10.01.2014


Ответы (1)


Насколько я вижу, на стороне js objData содержит {"first": "test", "second": "test2"}.

В качестве первой рекомендации я бы порекомендовал упростить вашу жизнь, используя ключи objData в качестве ключей POST, выполнив что-то подобное на стороне клиента js (я предполагаю, что ключи objData не начинаются с символа подчеркивания, чтобы на стороне сервера , вы можете различать клавиши action и obj):

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

Потенциальная проблема заключается в том, что ваша функция вставки является довольно общей, objData может быть чем угодно (так что sth кроме словаря js), моя вторая рекомендация будет состоять в том, чтобы сначала сериализовать ваши objData как строку json (для этого вы можете найти библиотеки js), затем отправьте {действие: 'insert', 'jsondata': json_string}. На стороне python вам придется десериализовать json_string, что довольно просто с модулем json.

Таким образом, вы можете использовать как классический POST (‹-> не полные данные формы в кодировке json), так и некоторые вещи json.

ХТН

person Raphaël Braud    schedule 10.01.2014
comment
Насчет 2-й рекомендации, спасибо, отлично работает. Не знаю, почему я не подумал об этом раньше! Что касается 1-й рекомендации, не могли бы вы пояснить? В чем реальная выгода? - person Nicola; 10.01.2014
comment
Если вы уверены, что objData является словарем Javascript, 1-я рекомендация позволяет избежать JSON-сериализации на стороне JS и десериализации на стороне Python, что дает вам несколько микросекунд: p, и еще один момент заключается в том, что это обычный POST, тогда как 2-я рекомендация создает некоторая связь между клиентом и сервером (которые должны говорить на одном языке). - person Raphaël Braud; 11.01.2014