2015-02-11 62 views
6

我对Python很陌生,但是我有和Node应用程序一样的问题。我想提出一个非常标准的jQuery AJAX请求我的Python的服务器:Python Flask Cors问题

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这个错误console:

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) 

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

回答

2

在路由装饰器之后使用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

+0

我看了一下这些文档今日早盘并试图几个不同的配置。添加@cross_origin对我目前的配置没有帮助。 – 2015-02-11 18:10:19

+0

对于JSON,以前您需要指定允许的标题。现在放松了,应该可以直接使用。如果您有任何问题,请告诉我。 – 2015-05-03 19:02:32

+0

我正在尝试实现这一点。我使用@cors装饰器,仍然得到 – Addinall 2017-01-12 05:52:36

0

以下解决方案为我工作。 我包括一个方法,将添加您需要的标题,然后提出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的编译,所以你可能需要编辑它。

0

这里是如何让你的手脏了由全部由自己处理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) 
0

试试这个:

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

我已经试过@cross_origin教程瓶网站上,然而,它并不适合我。

但是好像你可以在稍后添加标题到你的响应中。

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

from flask import Flask, request 
from sklearn.externals import joblib 

app = Flask(__name__) 
1

烧瓶有flask-cors模块。 以下是代码片段以及过程。通过点击this link

+0

这是对Flask的最新更新吗?我有一段时间没有写Python。 – 2016-12-14 14:03:48

5

我想别人的建议和答案后

from flask import Flask 
from flask_cors import CORS, cross_origin 

app = Flask(__name__) 
CORS(app) 

@app.route("/") 
def helloWorld(): 
    return "Hello world" 

查看更多:

  1. pip install -U flask-cors

  2. 加入这行的烧瓶中的应用。这是我使用的,它的作品。

    步骤:

    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) 
    
  3. 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来回。

+0

这一个为我工作。谢谢! – Kerem 2017-08-22 12:10:08

+0

在我的情况下,阿贾克斯设置添加类似的报头额外的头字段:{ \t \t \t \t“访问控制允许来源”:“*” \t \t \t}, – Abhilash 2017-11-02 13:52:27

0

请使用@cross_origin(产地=“*”)在你的Python文件

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)