【问题标题】:Ajax post Json data received in unexpected format in flaskAjax 发布在烧瓶中以意外格式收到的 Json 数据
【发布时间】:2015-03-14 07:23:49
【问题描述】:

您好,我正在尝试将带有 json 数据的 ajax 发布请求发送到烧瓶应用程序。尝试使用 request.get_json() 但它返回一个 NoneType 对象但 request.form 返回字典。

我的json数据有点

var JsonData = {
    dd_token : "abcd" ,
    file_name : "abcd.mp4",
    configuration : [ { video : { aspect_ratio: 4:3, format :mp4 } ,
                        audio : { bitrate: 300 , format : mp3 }
                      },
                      { video : { aspect_ratio: 4:3, format :mp4 } ,
                        audio : { bitrate: 300 , format : mp3 }
                      },
                    ]
    email : 'abc@example.com'
};

这是我对 Jsondata 的 ajax 发布请求

$('#submit').click(function(event){
    event.preventDefault();
    JsonData.dd_token = data['dd_token'];
    JsonData.file_name = data['file'];
    JsonData.email = $('input[name="email"]').val();
    JsonData.configuration.push(JsonArr);
    var url= window.location.origin+'/post_job';
    $.ajax({
        url: url, 
        method : "POST" , 
        dataType: 'json',
        data : JsonData ,
        success:function(result){
            $("#div1").html(result);
        }});
});

这是我接收 json 数据的烧瓶路由

@app.route('/post_job',methods=['POST'])
def get_job():
  directory = generate_random()  
  json_put(request.form,os.path.join(directory,'convert_to.json'))
  return "Done"

def json_put(data, filename):
    try:
        jsondata = simplejson.dumps(data, indent=4, skipkeys=True, sort_keys=False)
        fobj = open(filename, 'w')
        fobj.write(jsondata)
        fobj.close()
    except Exception as e:
        print 'ERROR writing', filename
        print e
    return

这是jsondump后文件的内容

{
    "configuration[0][1][audio][audio_ff]": "mp3",
    "configuration[0][1][video][video_ff]": "mp4",
    "configuration[0][0][audio][audio_bps]": "100",
    "configuration[0][1][video][video_bps]": "200",
    "configuration[0][0][video][video_ff]": "mp4",
    "file_name": abcd.mp4",
    "configuration[0][0][audio][audio_ff]": "mp3",
    "configuration[0][1][audio][audio_bps]": "100",
    "configuration[0][0][video][video_bps]": "200",
    "configuration[0][1][video][video_fps]": "24",
    "configuration[0][0][video][res_width]": "320",
    "configuration[0][1][audio][audio_freq]": "30000",
    "configuration[0][0][video][res_height]": "240",
    "configuration[0][1][video][aspect_ratio]": "4:3",
    "configuration[0][1][video][res_width]": "320",
    "configuration[0][0][audio][audio_freq]": "30000",
    "configuration[0][1][video][res_height]": "240",
    "configuration[0][0][video][video_fps]": "24",
    "configuration[0][1][audio][audio_vol]": "0",
    "configuration[0][0][audio][audio_vol]": "0",
    "email": "subho.prp@gmail.com",
    "dd_token": "PJUPK4SDCI8OACWHK3F3",
    "configuration[0][0][video][aspect_ratio]": "4:3"
}

这是我的 JsonData 构建过程

$('#save').click(function(event){
    event.preventDefault();
    JsonArr[box_count]=createBox();

});

function createBox()
{var temp = {};
var collection={};

$.each($('#video :input'),function(index,value){
collection[value.name] = value.value;
//other processing
});
temp['video']=collection;
collection={};
$.each($('#audio :input'),function(index,value){
collection[value.name] = value.value;
//other processing
});
temp['audio']=collection;
collection={};
return temp;
}

【问题讨论】:

  • 您不是在发送 json,而是在发送表单参数。如果将对象传递给data: 属性,jquery 会将其转换为参数字符串。您应该改为将 json 字符串传递给它。
  • 嗨@KevinB 是的,我认为是因为 request.form 正在工作。但我不知道我的 Json 数据在哪里失败。将使用我完整的 json 对象构建功能进行更新。
  • 问题解决了一半。你所说的“json”根本不是json,它是一个对象。但是,您可以使用 JSON.stringify(theObject) 方法将对象转换为 json。
  • “但是,您可以使用 JSON.stringify(theObject) 方法将对象转换为 json。”
  • @KevinB:烧瓶方面有什么变化吗? request.form 不应该正常工作?

标签: jquery python ajax json flask


【解决方案1】:

您当前发布的是一个对象,然后 jquery 会将其转换为参数字符串。如果您想发布 json,请将 json 放入 data 选项并适当设置 contentType。

...
data: JSON.stringify(theData),
contentType: 'application/json',
...

【讨论】:

  • 其实这个链接误导了我。它有dataType:'json'stackoverflow.com/questions/8517071/…
  • dataType 指示服务器返回的内容,contentType 指示您发送的内容。有太多的答案/问题/文章不正确地使用了 $.ajax 属性。请注意,仅设置 contentType 是不够的(服务器并不总是需要)
猜你喜欢
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 2018-12-16
  • 2018-05-17
  • 1970-01-01
  • 2019-12-01
  • 2020-12-20
相关资源
最近更新 更多