Skip to main content
 首页 » 编程设计

Jquery ajax json 获取由 Flask Web 框架传递的调用之调用失败

2025年12月25日25rubylouvre

我正在尝试一个简单的 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 会产生跨域冲突。因此,如果您从 flask View 输出 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"}) 

我不确定是否有办法使用 flask 中的直接 json,可能有。但是,由于 jsonp 也更安全,所以我认为最好还是这样做。

请您参考如下方法:

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

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