使用flask和ajax的Cross-Origin问题

时间:2017-04-19 18:22:14

标签: python ajax flask cors

我遇到了“Cross-Origin Request Blocked”的问题。我试图首先从服务器,而不是从所有(“*”)。每次在chrome开发人员工具包上都有相同的错误消息。

这是我的烧瓶python代码:

application = Flask(__name__)
application.config.from_object(__name__)
cors = CORS(application, resorces={r'/*': {"origins": '*'}})

@application.route("/get-live-data",methods=['GET'])
@cross_origin()
def live_data():
    con = connect_db()
    cur = con.cursor()
    cur.execute("SELECT * from envoiContinuT")
    sqlite_result = cur.fetchall()
    cle = json.load(open(JSON_STATUS))
    parametres = json.load(open(JSON_PARAMETRES))
    descT = []
    for key in cle["status"]:
        attr = parametres[key]
        if attr["envoiC"] == 1:
            descT.append(attr["description"])
    response = any_response(flask.jsonify(data=descT))
    return response

这是我的Ajax代码:

var baseURL = "http://localhost:8000";

function getLiveData(data){
    //Get the parameters descriptions
    $.ajax({
        method: 'GET',
        url:baseURL + '/get-live-data',
        headers: {
            "Accept" : "application/json",
            "Content-type": "application/json"
        },
        success:function(data){
                console.log(data);
                //populateAccordion(data);    
        },

        error: function(XMLHttpRequest, textStatus, errorThrown) { 
            console.log("Status: " + textStatus); 
            console.log("Error: " + errorThrown); 
            } 
    });
}

感谢您的回答!

1 个答案:

答案 0 :(得分:1)

你这里有一个错字:

cors = CORS(application, resorces={r'/*': {"origins": '*'}})
                         ^^^^^^^^

应该是:

cors = CORS(application, resources={r'/*': {"origins": '*'}})

此外,为 Content-type请求发送GET请求标头毫无意义。 GET请求没有请求正文,因此无需指定内容类型。所以只需这样做:

headers: {
    "Accept" : "application/json",
},

否则,如果您发送的Content-Type请求标头的值为application/json,则会触发您的浏览器执行CORS preflight OPTIONS request,并且您的配置必须允许它:

@application.route("/get-live-data",methods=['GET', 'POST'])
@cross_origin(headers=['Content-Type']) # Send Access-Control-Allow-Headers

但是如果您允许Content-Type请求标头,那么您也可以允许POST请求(如上所述) - 因为前面提到的那样,仅仅为{{1}提供它是没有意义的请求。