2015-02-11 13 views
6

Tôi là người mới với Python, nhưng tôi đã gặp vấn đề tương tự khi làm việc với các ứng dụng Node. Tôi đang thực hiện một yêu cầu jQuery AJAX khá tiêu chuẩn để Python sever địa phương của tôi:Python Flask Cors Issue

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); 
     } 

tôi có thể xác nhận rằng các dấu hiệu biến được xác nhận như thế này:

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

Nhưng tôi nhận được lỗi này từ javascript của tôi bảng điều khiển:

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. 

Tôi đã phát hiện ra rằng khi tôi tạo ứng dụng Node là lỗi cors. Trang mà tôi đang chạy yêu cầu jQuery AJAX từ http. Dưới đây là các bộ phận của mã Python của tôi mà tôi tin rằng tôi đang cấu hình sai:

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' 

Và con đường:

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

    return 'something' 

My Python lỗi cũng được trả lại một lỗi vì yêu cầu không bao giờ làm cho nó dòng mã này:

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

Tôi có thể khắc phục điều đó sau. Dù sao, không ai có bất cứ đề nghị cho các cấu hình Cors cho Python?

Trả lời

2

sử dụng trang trí cors sau trang trí đường.

đây là một đoạn trích từ tài liệu ...

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

bây giờ, dường như bạn đang sử dụng json, nếu đó là trường hợp, bạn nên có khả năng chỉ đọc tài liệu vì nó đặc biệt đề cập đến trường hợp sử dụng này, và những gì cors_headers để thiết lập ... nó dưới màn hình đầu tiên, nhưng tài liệu này được viết tốt và dễ hiểu.

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

+0

tôi đã xem xét những tài liệu sớm hôm nay và cố gắng cấu hình khác nhau. Thêm @cross_origin không hỗ trợ cấu hình hiện tại của tôi. –

+0

Trong trường hợp của JSON, trước đây bạn cần xác định các tiêu đề được cho phép. Điều này bây giờ là thoải mái và nên làm việc out-of-the box. Vui lòng cho tôi biết nếu bạn có bất kỳ vấn đề nào. –

+0

Tôi cũng đang cố thực hiện điều đó. Tôi sử dụng trang trí @cors và vẫn nhận được – Addinall

0

Các giải pháp dưới đây làm việc cho tôi. Tôi đã bao gồm một phương pháp sẽ thêm tiêu đề cần thiết cho bạn và sau đó nâng cao phản hồi HTTP. Ví dụ:

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) 

Lưu ý: Phương thức trên không biên dịch để bạn có thể phải chỉnh sửa.

0

Sau đây là cách để có được bàn tay của bạn bẩn bằng cách xử lý chi tiết CORS tất cả bởi chính mình:

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

Hãy thử điều này:

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

Tôi đã thử @cross_origin hướng dẫn trên trang web Flask, tuy nhiên, nó không hiệu quả với tôi.

Nhưng có vẻ như bạn có thể thêm tiêu đề vào phản hồi của mình sau.

Đây là mã còn lại của tôi mà tôi nghĩ rằng nó có thể hữu ích.

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

app = Flask(__name__) 
1

Bình có mô-đun flask-cors. Sau đây là đoạn mã cũng như quy trình.

  1. pip install -U flask-cors

  2. Thêm dòng này trong ứng dụng bình của bạn:

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

Xem thêm bằng cách nhấp vào this link

+0

Đây có phải là bản cập nhật gần đây cho Flask không? Tôi đã không viết Python trong một thời gian. –

5

Sau khi tôi đã cố gắng khác gợi ý và câu trả lời. Đây là những gì tôi sử dụng, hoạt động.

bước:

  1. pip install flask flask-cors

  2. Sao chép và dán này trong app.py tập tin

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

Lưu ý: hãy chắc chắn trong cấu hình ajax của khách hàng của bạn có những điều sau đây:

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

Nếu một điều kỳ diệu, support_credentials=True chỉ có nghĩa là nó sẽ gửi cookie dọc theo trọng tải qua lại.

+0

Điều này làm việc cho tôi. Cảm ơn! – Kerem

+0

Trong trường hợp của tôi, thiết lập ajax bổ sung thêm lĩnh vực tiêu đề như tiêu đề: { \t \t \t \t 'Access-Control-Allow-Origin': '*' \t \t \t}, – Abhilash

0

Vui lòng sử dụng @cross_origin (origin = '*') trong file python của bạn

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)