如何将Flask请求的JSON数据转换为字典?

19

我在使用JQuery ajax方法和Flask时遇到了困难,尝试使用ajax调用来检索一些表单。

我的js代码如下:

$.ajax({
       type: 'POST',
       url: '/projects/dummyName',
       data: JSON.stringify("{'ajax': 'True'}"),
       contentType: 'application/json;charset=UTF-8',
       dataType: 'html',
       success: function(responseData, textStatus, jqXHR) {
           $("#myform").text(responseData);
         },
       error: function (responseData, textStatus, errorThrown) {
           alert('Error: '+errorThrown + ". Status: "+textStatus);
       }
}); 

基本上,我正在添加数据参数以便让服务器方法知道这是一个ajax调用。但是我就是无法将该数据作为dict在服务器端获取。我已经尝试了很多方法,但无法使其工作。

这是虚拟的服务器方法:

@app.route('/projects/<name>', methods=['GET', 'POST'])
def projects(name=None):
    print(request.json)
    print(request.json['ajax'])
    if name:
        project = db.getProject(name)
        form = ProjectForm(project)

        if request.json['ajax'] == True:
            return render_template("myform.html", form=form)
        else:
            return render_template("projectView.html", form=form)
    else:
        return render_template("projects.html")

因此,request.json返回一个字符串:

{'ajax': 'True'}

当尝试访问json ['ajax']时,应用程序崩溃,我收到了一个BAD RESPONSE错误消息。我以为它会给我一个python字典,否则request.json和request.data之间有什么区别,如果两者都是字符串。

如何使用所有通过ajax调用传递的数据获取python字典?这取决于我如何定义contentType吗?这取决于是否使用JSON.stringify吗?

非常感谢您的帮助! 谢谢


你看过这个链接吗?http://flask.pocoo.org/docs/patterns/jquery/ 我已经实现了它,效果非常好! - dvreed77
1个回答

20

由于请求的媒体类型,数据被放入了request.json中。我认为您正在寻找get_json

@app.route('/projects/<name>', methods=['GET', 'POST'])
def projects(name=None):
    req_json = request.get_json()
    print(req_json['ajax'])
    if name:
        project = db.getProject(name)
        form = ProjectForm(project)

        if req_json['ajax']:
            return render_template("myform.html", form=form)
        return render_template("projectView.html", form=form)
    return render_template("projects.html")

目前我无法访问我的开发机,所以我还没有进行测试,但从文档的理解来看,它应该可以工作。


1
最终我使用了$.get()来检索表单并在request.args中传递'isajax'参数,这样就不会与WTForms解析表单参数时发生冲突。最后我使用$.post()来发送表单内容。 这似乎是最好的方法,因为要求表单或HTML更像是一个GET而不是一个POST,在头部主体中发送JSON数据,只是为了请求某些东西。 感谢您的帮助! - Sebastian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接