使用Appengine用python解码JSON

使用Appengine用python解码JSON,python,json,google-app-engine,webapp2,Python,Json,Google App Engine,Webapp2,我有以下代码从简单的3输入表单检索值: //retrieves data from a form var $form = $( this ), prgname= $form.find('input[name="prg"]').val(), startDate = $("#startdate").datepicker({ dateFormat: 'yy-mm-dd' }).val(), endDate = $("#enddate").datepicker({ dateFor

我有以下代码从简单的3输入表单检索值:

//retrieves data from a form
var $form = $( this ),
    prgname= $form.find('input[name="prg"]').val(),
    startDate = $("#startdate").datepicker({ dateFormat: 'yy-mm-dd' }).val(),
    endDate = $("#enddate").datepicker({ dateFormat: 'yy-mm-dd' }).val();
以下代码将请求发送到服务器:

var request = $.ajax({
      url: "/prg/",
      type: "post",
  data: JSON.stringify({prg:  prgname, start:startDate, end:endDate}),
  contentType: 'application/json',
  dataType: 'json',
      success: function() {},
      error: function (jqXHR, textStatus, errorThrown){};
在服务器端,我使用python和webapp2执行以下操作(这里是我不确定的地方)

当我得到响应时,它跳过success函数并直接返回错误

记录错误值我没有得到任何有意义的东西:

the error is:
The text status is:error
The jqXHR is:[object Object] 
Chrome的控制台显示错误:

Resource interpreted as Document but transferred with MIME type application/json:
我查了一下,发现上面的解决方案不起作用,我认为这是服务器端代码的错误:

self.response.headers.add_header('content-type', 'application/json', charset='utf-8')
如果我注释掉上面的行,我在chrome中不会得到错误,我只会在空白页上以以下格式返回正确值的响应:

[{"msg": "Successfully saved to the database", "class": "success"}]
在上面的例子中,它确实保存到了数据库中,所以除了标题之外,我似乎找不到任何错误,只是不知道如何继续

编辑 错误似乎来自服务器端,我删除了以下行: event.preventDefault()

从我的脚本来看,它导致了所有的问题,现在至少我清楚地知道了问题所在。这是因为错误地获取了发布的数据,我该如何以正确的方式进行?我尝试了以下方法:

json_data = self.request.GET.items()
decoded = json.loads(json_data)
var request = $.ajax({
    url: "/some/url/",
    type: "POST",
    data: JSON.stringify([{someval: val1, someval2:val2, someval3:val3}]),
    contentType: "application/json",
    dataType: 'json',
    beforeSend: function() {
        $('#loading-div').show();
    },
    complete: function(){
        $('#loading-div').hide();
    },
    success: function(response, textStatus, jqXHR){}
});
jdata = json.loads(cgi.escape(self.request.body))
    for vals in jdata:
        val1 = vals['someval']
        val2 = vals['someval2']
        val3 = vals['someval3']
但我收到一个TypeError:以下行中需要字符串或缓冲区:
json_data=self.request.GET.items()

查看调试器。您在帖子(webapp2 multidict)中收到一个JSON字符串。您必须使用json.loads对该字符串进行解码,从而生成一个python对象

以下是我发送和接收json的jquery代码:

function gaeQuery(request) {
    var url = "/query";
    var payload = {'jsondata' : JSON.stringify(request)};
    $.post(
    url, 
    payload, 
    function(response) {
        procesResponse(response);
    },  // succes response callback 
    'json',  // response contains JSON content, and will be decoded in a js object
    {
        contentType: "application/json;charset=utf-8", // send JSON content
        timeout: 20000,
        tryCount: 0,
        retryLimit: 3, // max 3 retries             
        error: function(xhr, textStatus, errorThrown) { // error handling callback
            if (textStatus === 'timeout') {
                this.tryCount++;
                if (this.tryCount <= this.retryLimit) { //try again until retryLimit
                    $.ajax(this);
                    return;
                }
                alert('We have tried ' + this.retryLimit + ' times and it is still not working. We give in. Sorry.');
                return;
            }
            if (xhr.status === 500) { // internal server error
                alert('Oops! There seems to be a server problem, please try again later.');
            } 
            else {
                alert('Oops! There was a problem, sorry.'); // something went wrong
            }
        }
    }
    );
}
功能请求(请求){
var url=“/query”;
var payload={'jsondata':JSON.stringify(请求)};
美元邮政(
网址,
有效载荷,
功能(响应){
过程响应(响应);
},//成功响应回调
'json',//响应包含json内容,将在js对象中解码
{
contentType:“application/json;charset=utf-8”,//发送json内容
超时:20000,
tryCount:0,
retryLimit:3,//最多重试3次
错误:函数(xhr,textStatus,errorshown){//错误处理回调
如果(textStatus==“超时”){
this.tryCount++;

if(this.tryCountOK,所以我设法解决了这个问题,并认为我将发布对我有用的答案,以帮助寻找此信息的任何人,因为webapp2文档在“获取”发布的json数据方面没有那么大的帮助

在客户端,我做了以下工作:

json_data = self.request.GET.items()
decoded = json.loads(json_data)
var request = $.ajax({
    url: "/some/url/",
    type: "POST",
    data: JSON.stringify([{someval: val1, someval2:val2, someval3:val3}]),
    contentType: "application/json",
    dataType: 'json',
    beforeSend: function() {
        $('#loading-div').show();
    },
    complete: function(){
        $('#loading-div').hide();
    },
    success: function(response, textStatus, jqXHR){}
});
jdata = json.loads(cgi.escape(self.request.body))
    for vals in jdata:
        val1 = vals['someval']
        val2 = vals['someval2']
        val3 = vals['someval3']
我无法立即找出问题的原因是,我删除了以下一行,同时删除了一些注释行,这些注释行阻止了页面在发布后重定向。这就是所有奇怪、不相关和没有帮助的错误消息的来源:

event.preventDefault();
在服务器端,要获取发布到appengine的json数据,请执行以下操作:

json_data = self.request.GET.items()
decoded = json.loads(json_data)
var request = $.ajax({
    url: "/some/url/",
    type: "POST",
    data: JSON.stringify([{someval: val1, someval2:val2, someval3:val3}]),
    contentType: "application/json",
    dataType: 'json',
    beforeSend: function() {
        $('#loading-div').show();
    },
    complete: function(){
        $('#loading-div').hide();
    },
    success: function(response, textStatus, jqXHR){}
});
jdata = json.loads(cgi.escape(self.request.body))
    for vals in jdata:
        val1 = vals['someval']
        val2 = vals['someval2']
        val3 = vals['someval3']
以上是问题的根源,我做得不对,没有客户端的前一行,就没有办法解决它

不管怎样,一旦您有了数据,您就可以对其进行任何处理,并且一旦完成并需要发送回json响应,请添加以下行:

//the data would look something like this 
data = {'return_value': val1, 'return_value2': val2,
        'return_value3': val3, 'return_value4': val4}

        return_data = json.dumps(data)
        self.response.headers.add_header('content-type', 'application/json', charset='utf-8')
        self.response.write(return_data)
几乎忘了在客户端再次使用jquery直接访问从服务器发送回来的变量…执行如下操作:

 success: function(response, textStatus, jqXHR){
        console.log(response.return_value);
        console.log(response.return_value2);
        console.log(response.return_value3);
 }

希望这将有助于寻找此信息的人。

Ok在服务器端获取发布的数据时出现的错误您知道正确的方法是什么吗?请参阅docs::jsondata=self.request.POST['jsondata']是的,这在webapp2文档中没有很好的记录。您可能希望json内容在request.POST变量中。