代码之家  ›  专栏  ›  技术社区  ›  wfgeo

Ajax GET request to Flask服务失败并返回奇怪的空对象,但是当粘贴到地址栏中时,相同的URL可以工作

  •  0
  • wfgeo  · 技术社区  · 8 年前

    我通过jquery收到了一个ajax请求,如下所示:

    $.ajax({
        headers: {"Content-Type": "application/json"},
        url: '127.0.0.1:5000/runNetwork?schema=moscow&consumer=BUILDING_1',
        dataType: 'jsonp',
        success: function(response) {
            console.log(response);
        },
        error: function(response, error) {
            console.log(response);
            console.log(error);
        }
    });
    

    这是它想要得到的服务,写在烧瓶里:

    from flask import Flask, jsonify, abort, request
    
    app = Flask(__name__)
    
    
    #Example query: 127.0.0.1:5000/runNetwork?schema=moscow&consumer=BUILDING_1
    @app.route('/runNetwork', methods=['GET'])
    def run_network():
        summary = request.args.get('schema')
        change = request.args.get('consumer')
    
        json = jsonify({"schema" : summary, "consumer" : change})
        return json
    
    if __name__ == "__main__":
        app.run(debug=True)
    

    当我试图单击执行ajax请求的按钮时,它失败了,我得到了一个看起来不包含任何信息的奇怪对象:

    {…}
    abort: function abort()
    always: function always()
    catch: function catch()
    done: function add()
    fail: function add()
    getAllResponseHeaders: function getAllResponseHeaders()
    getResponseHeader: function getResponseHeader()
    overrideMimeType: function overrideMimeType()
    pipe: function pipe()
    progress: function add()
    promise: function promise()
    readyState: 0
    setRequestHeader: function setRequestHeader()
    state: function state()
    status: 0
    statusCode: function statusCode()
    statusText: "error"
    then: function then()
    __proto__: Object { … }
    

    我可以扩展所有这些选项,但它们都包含 length 以及 name 属性,长度始终为0或1,名称只是要返回的对象中的项的名称(即 abort 有一个 名称 属性已调用 中止 .

    我觉得很困惑的是,当我复制并粘贴完全相同的URL时,似乎没有什么问题( 127.0.0.1:5000/runNetwork?schema=moscow&consumer=BUILDING_1 )在浏览器中,我可以毫无问题地获取JSON。

    我真的不知道在这一点上还能做什么,烧瓶日志上没有其他的信息。

    我刚刚注意到的另一点是,请求甚至似乎没有发送到服务器,因为运行flask服务器的Pycharm控制台正在打印:

    127.0.0.1 - - [11/Jun/2018 20:46:10] "GET /runNetwork?schema=moscow&consumer=BUILDING_1 HTTP/1.1" 200 -

    每当我将查询输入到地址栏时,但当我试图通过ajax请求访问它时,它不会出现。

    我越来越沮丧和绝望,所以我试图从服务器上得到一些东西-任何东西-回来。我将请求更改为如下所示的POST类型:

    from flask import Flask, jsonify, abort, request, Response
    
    app = Flask(__name__)
    
    #Example query: 127.0.0.1:5000/runNetwork?schema=moscow&consumer=BUILDING_1
    @app.route('/runNetwork', methods=['GET', 'POST'])
    def run_network():
    
        foo = request.form['foo']
        json = jsonify({"schema": foo})
        return json
    
    
    if __name__ == "__main__":
        app.debug = True
        app.run(host='0.0.0.0', port=5005, threaded=True)
    

    $.ajax({
            url: "127.0.0.1:5005/runNetwork",
            method: "POST",
            data: { foo : "bar" },
            success: function(response) {
                console.log(response);
            },
            error: function(response, error) {
                console.log(response)
                console.log(error);
            }
        });
    

    它仍然返回相同的错误。

    找到解决方案

    一直都在我眼皮底下。烧瓶服务器地址需要加上前缀 http:// 在ajax请求中:

     $.ajax({
            url: "http://127.0.0.1:5005/runNetwork",
            method: "POST",
            data: { foo : "bar" },
            success: function(response) {
                console.log(response);
            },
            error: function(response, error) {
                console.log(response)
                console.log(error);
            }
        });
    

    之所以将它粘贴到地址栏中,是因为Firefox非常有帮助,并且在导航之前自动预置地址。

    0 回复  |  直到 8 年前