【问题标题】:Issues with Cross-Origin using flask and ajax使用烧瓶和 ajax 的跨域问题
【发布时间】:2017-04-19 18:22:13
【问题描述】:

我遇到了一些关于“跨源请求被阻止”的问题。我试图首先允许来自服务器,而不是来自所有(“*”)。每次在 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); 
            } 
    });
}

感谢您的回答!

【问题讨论】:

    标签: javascript python ajax flask cors


    【解决方案1】:

    这里有错别字:

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

    应该是:

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

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

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

    否则,如果您发送带有值application/jsonContent-Type 请求标头,则会触发您的浏览器执行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 请求(如上所述)——正如前面提到的,只允许 GET 请求是没有意义的。

    【讨论】:

    • 在使用flask_restplus时,我所要做的就是创建一个CORS(...)的对象并使用"Accept": "application/json" ,它就像魅力(y)一样工作
    猜你喜欢
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2013-11-25
    • 2016-06-05
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多