Python Flask Cors问题

我对Python很陌生,但我在使用Node应用程序时遇到了同样的问题。 我正在向我的本地Python服务器发出一个非常标准的jQuery AJAX请求:

init: function(callback) { var token = _config.get_token(); $.ajax({ url: 'http://localhost:5000/api/ia/v1/user_likes', type: 'POST', contentType: 'application/json', datatype: 'json', data: token }) .done(function(data) { callback(data); }) .fail(function(err) { callback(err); }); callback(token); } 

我可以确认变量令牌是这样确认的:

 Object {access_token: "791415154.2c0a5f7.4d707361de394512a29682f9cb2d2846", campaign_id: "102"} 

但我从我的JavaScript控制台收到此错误:

 XMLHttpRequest cannot load http://localhost:5000/api/ia/v1/user_likes. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://s3.amazonaws.com' is therefore not allowed access. The response had HTTP status code 500. 

我发现当我构建Node应用程序时,这是一个cors错误。 我运行jQuery AJAX请求的页面是http。 以下是我认为我配置错误的Python代码部分:

 from flask import Flask, request, redirect from flask.ext.cors import CORS, cross_origin app = Flask(__name__) cors = CORS(app) app.config['CORS_HEADERS'] = 'application/json' 

路线:

 @app.route("/api/ia/v1/user_likes", methods=['POST', 'OPTIONS']) def user_likes(): validate = validate_request(request.data) return 'something' 

我的Python错误也返回错误,因为请求永远不会进入这行代码:

 def validate_request(object_from_user): load_object = json.loads(object_from_user) 

我可以稍后解决。 无论如何,有没有人对Python的Cors配置有任何建议?

在我尝试了别人的建议和答案之后。 这是我使用的,有效的。

脚步:

  1. pip install flask flask-cors

  2. 将其复制并粘贴到app.py文件中

 from flask import Flask, jsonify from flask_cors import CORS, cross_origin app = Flask(__name__) CORS(app, support_credentials=True) @app.route("/login") @cross_origin(supports_credentials=True) def login(): return jsonify({'success': 'ok'}) if __name__ == "__main__": app.run(host='0.0.0.0', port=8000, debug=True) 
  1. python app.py

注意:请确保在客户端的ajax配置中具有以下内容:

 $.ajaxSetup({ type: "POST", data: {}, dataType: 'json', xhrFields: { withCredentials: true }, crossDomain: true, contentType: 'application/json; charset=utf-8' }); 

如果有人想知道, support_credentials=True只是意味着它来回传送有效载荷中的cookie。

在路径装饰器之后使用cors装饰器。

这是文档中的一个片段……

 @app.route("/") @cross_origin() # allow all origins all methods. def helloWorld(): return "Hello, cross-origin-world!" 

现在,看起来你正在使用json,如果是这种情况,你应该只是阅读文档,因为它特别提到了这个用例,以及要设置的cors_headers …它在首屏下面,但是这个文档编写得很好而且很简单了解。

http://flask-cors.readthedocs.org/en/latest/#using-json-with-cors

以下是通过自己处理CORS细节来解决问题的方法:

 handle_result = {'result': True, 'msg': 'success'} try: # origin, where does this request come from, like www.amazon.com origin = flask.request.environ['HTTP_ORIGIN'] except KeyError: origin = None # only accept CORS request from amazon.com if origin and origin.find('.amazon.com') > -1: resp = flask.make_response(str(handle_result)) resp.headers['Content-Type'] = 'application/json' h = resp.headers # prepare headers for CORS authentication h['Access-Control-Allow-Origin'] = origin h['Access-Control-Allow-Methods'] = 'GET' h['Access-Control-Allow-Headers'] = 'X-Requested-With' resp.headers = h return resp return flask.abort(403) 

Flask有烧瓶 – cors模块。 以下是代码片段和过程。

  1. pip install -U flask-cors

  2. 在烧瓶应用程序中添加以下行:

     from flask import Flask from flask_cors import CORS, cross_origin app = Flask(__name__) CORS(app) @app.route("/") def helloWorld(): return "Hello world" 

点击此链接查看更多内容

以下解决方案对我有用。 我添加了一个方法,它将为您添加所需的标头,然后引发HTTP响应。 例如:

 def some_method(response_data, status_code): response_data = //here you can manipulate the data, JSONify, convert arrays into objects or vice versa headers = { "Content-Type": "application/json", "Access-Control-Allow-Origin": '*', "Access-Control-Allow-Methods": 'PUT, GET, POST, DELETE, OPTIONS', "Access-Control-Allow-Headers": 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token' } //THEN RAISE HTTPResponse raise HTTPResponse(status, headers, body) 

注意:上面的方法不是python编译,所以你可能需要编辑它。

试试这个:

 @app.after_request def add_headers(response): response.headers.add('Access-Control-Allow-Origin', '*') response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization') 

我在Flask网站上尝试了@cross_origin教程,然而,它对我不起作用。

但似乎您可以稍后在回复中添加标题。

这是我剩下的代码,我认为它可能有用。

 from flask import Flask, request from sklearn.externals import joblib app = Flask(__name__) 

请在你的python文件中使用@cross_origin(origin =’*’)

 from flask import Flask, jsonify from flask_cors import CORS, cross_origin app = Flask(__name__) @app.route("/login", methods = ['GET']) @cross_origin(origin='*') def login(): return jsonify({'success': 'ok'}) if __name__ == "__main__": app.run(host='0.0.0.0', port=8000, debug=True)