Đối với ajax
yêu cầu bài đăng sau cho Flask
( làm cách nào tôi có thể sử dụng dữ liệu được đăng từ ajax trong flask? ):
$.ajax({
url: "http://127.0.0.1:5000/foo",
type: "POST",
contentType: "application/json",
data: JSON.stringify({'inputVar': 1}),
success: function( data ) {
alert( "success" + data );
}
});
Tôi gặp Cross Origin Resource Sharing (CORS)
lỗi:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'null' is therefore not allowed access.
The response had HTTP status code 500.
Tôi đã thử giải quyết nó theo hai cách sau đây, nhưng dường như không có cách nào hiệu quả.
- Sử dụng Flask-CORS
Đây là một Flask
tiện ích mở rộng để xử lý CORS
giúp AJAX có nhiều nguồn gốc trở nên khả thi.
- http://flask-cors.readthedocs.org/en/latest/
- Cách kích hoạt CORS trong flask và heroku
- Trình bao bọc bình cors không hoạt động khi áp dụng trình bao bọc xác thực jwt.
- Javascript - Không có tiêu đề 'Access-Control-Allow-Origin' có trên tài nguyên được yêu cầu
PythonServer.py của tôi bằng cách sử dụng giải pháp này:
from flask import Flask
from flask.ext.cors import CORS, cross_origin
app = Flask(__name__)
cors = CORS(app, resources={r"/foo": {"origins": "*"}})
app.config['CORS_HEADERS'] = 'Content-Type'
@app.route('/foo', methods=['POST','OPTIONS'])
@cross_origin(origin='*',headers=['Content-Type','Authorization'])
def foo():
return request.json['inputVar']
if __name__ == '__main__':
app.run()
- Sử dụng Trình trang trí bình cụ thể
Đây là đoạn mã Flask chính thức xác định một trình trang trí sẽ cho phép CORS
các chức năng mà nó trang trí.
- http://flask.pocoo.org/snippets/56/
- Python Flask cross site HTTP POST - không hoạt động đối với các nguồn gốc được phép cụ thể
- http://chopapp.com/#351l7gc3
PythonServer.py của tôi bằng cách sử dụng giải pháp này:
from flask import Flask, make_response, request, current_app
from datetime import timedelta
from functools import update_wrapper
app = Flask(__name__)
def crossdomain(origin=None, methods=None, headers=None,
max_age=21600, attach_to_all=True,
automatic_options=True):
if methods is not None:
methods = ', '.join(sorted(x.upper() for x in methods))
if headers is not None and not isinstance(headers, basestring):
headers = ', '.join(x.upper() for x in headers)
if not isinstance(origin, basestring):
origin = ', '.join(origin)
if isinstance(max_age, timedelta):
max_age = max_age.total_seconds()
def get_methods():
if methods is not None:
return methods
options_resp = current_app.make_default_options_response()
return options_resp.headers['allow']
def decorator(f):
def wrapped_function(*args, **kwargs):
if automatic_options and request.method == 'OPTIONS':
resp = current_app.make_default_options_response()
else:
resp = make_response(f(*args, **kwargs))
if not attach_to_all and request.method != 'OPTIONS':
return resp
h = resp.headers
h['Access-Control-Allow-Origin'] = origin
h['Access-Control-Allow-Methods'] = get_methods()
h['Access-Control-Max-Age'] = str(max_age)
if headers is not None:
h['Access-Control-Allow-Headers'] = headers
return resp
f.provide_automatic_options = False
return update_wrapper(wrapped_function, f)
return decorator
@app.route('/foo', methods=['GET','POST','OPTIONS'])
@crossdomain(origin="*")
def foo():
return request.json['inputVar']
if __name__ == '__main__':
app.run()
Bạn có thể vui lòng cho một số chỉ dẫn về lý do tại sao lại như vậy không?