【问题标题】:Jquery ajax json get call delivered by Flask web framework - call failsJquery ajax json 获取由 Flask Web 框架传递的调用 - 调用失败
【发布时间】:2013-04-21 17:37:22
【问题描述】:

我正在尝试一个简单的 jquery ajax 调用来获取 json 数据。但是,调用失败了,我不太明白为什么。

代码如下。对我来说似乎没问题。

$(document).ready(function() {

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

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

编辑烧瓶使用

这里的问题是我正在使用 Flask 并返回一个 json 对象。但是,一旦您尝试使用 jquery 进行 ajax 调用,返回纯 json 会产生跨域冲突。因此,如果您从烧瓶视图输出 jsonp 会容易得多。为此,您可以使用下面的 sn-p(来自此处: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 也更安全,所以我认为最好还是这样做。

【问题讨论】:

  • 这是一个跨域问题。跨域 url 需要使用 CORS 或 JSONP。

标签: jquery ajax json jsonp flask


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-08-14
    • 2010-10-29
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    相关资源
    最近更新 更多