从Flask服务器获取Ajax GET后的数据

0 投票
1 回答
1732 浏览
提问于 2025-04-17 20:22

我正在尝试使用Flask和Ajax。在服务器端,我有一个非常简单的网页应用,它的功能是将传入的数字翻倍并返回。我是根据Flask网站上的示例写的。以下是Python代码:

from flask import Flask, request, jsonify

# Initialize the application

app = Flask(__name__)

# Route that receives and processes the Ajax request
@app.route('/')
def index():
    print 'In index()'
    data = request.args.get('data', 0, type=int) 
    print 'Received Ajax post - Data: ', data
    return jsonify(dict(results=str(data*2)))

# Main

if __name__ == '__main__':
    app.run(
            host = '0.0.0.0',
            port = int('8080'),
            debug = True # TODO: Disable debug mode after testing is complete
            )

在客户端,相关的代码片段是:

$('#dataSubmitBtn').button().click(submitAdditionalData);

function submitAdditionalData() {
    var j = $.getJSON(
        'http://127.0.0.1:8080',
        {data: 15}, // Payload
        function(returnedData) { // Success function
            console.log('Data returned from server: ', returnedData.results);
        }
    ).done(function() {
        console.log('Successful execution');
    }).fail(function() {
        console.log('Error');
    }).always(function() {
        console.log('Complete');
    });
    return false;
}

当我运行这个Python类并打开我的网页时,失败和总是会执行的函数会被调用,但成功的函数却从来没有被执行过。不过,如果我在浏览器地址栏输入

http://127.0.0.1:8080/?data=30

我会得到

{

    "results": "60"

}

这是我认为应该得到的结果。问题出在Javascript代码上吗?还是Python代码?也许两者都有问题?

1 个回答

1

正如@SLaks提到的,你试图从另一个域名获取数据,这在同源政策下是不允许的。不过,使用JSONP可以解决这个问题。

要使用JSONP,你需要在服务器端做一些修改。这里有一个关于在Flask中使用JSONP的例子。然后,在客户端,你需要一个callback参数(这个参数是服务器端定义的)。如果你使用jQuery.getJSON,可以查看这里的文档获取更多细节。

撰写回答