Jquery ajax json得到Flask web框架提供的调用 - 调用失败

时间:2013-04-21 17:37:22

标签: jquery ajax json jsonp flask

我正在尝试使用简单的jquery ajax调用获取json数据。然而,呼叫失败了,我无法理解为什么。

代码如下。对我来说似乎还可以。

$(document).ready(function() {

    function onDataReceived (data){
        alert('test');
    };

    $("button").click(function(){
        $.ajax({
            url: "/test",
            type: "GET",
            dataType: "jsonp",
            success: onDataReceived
        }); 
    });
});

编辑Flask使用

这里的问题是我使用Flask并返回一个json对象。但是,一旦尝试使用jquery执行ajax调用,返回纯json会产生跨域冲突。因此,如果从烧瓶视图输出jsonp会更容易。为此,您可以使用下面的代码段(从这里:http://flask.pocoo.org/snippets/79/)。对于javascript片段,您可以参考上面的那个,我只将dataType从json更改为jsonp。

import json
from functools import wraps
from flask import redirect, request, current_app

def support_jsonp(f): 
"""Wraps JSONified output for JSONP"""
@wraps(f)
 def decorated_function(*args, **kwargs):
  callback = request.args.get('callback', False)
  if callback:
   content = str(callback) + '(' + str(f().data) + ')'
   return current_app.response_class(content, mimetype='application/json')
  else:
   return f(*args, **kwargs)
  return decorated_function

# then in your view
@default.route('/test', methods=['GET'])
@support_jsonp
def test():
 return jsonify({"foo":"bar"})

我不确定是否有办法从烧瓶中直接使用json,可能有。然而,由于jsonp也更安全,我认为无论如何都会更好。

1 个答案:

答案 0 :(得分:2)

这不起作用,因为远程脚本返回JSON,而不是JSONP。为了能够执行跨域AJAX调用,远程服务器需要支持CORS或JSONP。请与您尝试使用的远程API的作者联系,或阅读文档以了解它是否支持它。

您在请求中指定了dataType: "jsonp"这一事实使得jQuery向远程域发送callback查询字符串参数,期望它将响应包装在其中。如果没有,则远程域不支持JSONP,或者可能以不同方式调用回调参数。