[英]Python Flask Cors Issue
我对 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);
}
在我尝试了其他人的建议和答案之后。 这是我使用的,它有效。
脚步:
pip install flask flask-cors
复制并粘贴到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)
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。
Flask 有flask-cors模块。 以下是代码片段以及过程。
pip install -U flask-cors
在您的烧瓶应用程序中添加以下行:
from flask import Flask from flask_cors import CORS, cross_origin app = Flask(__name__) CORS(app) @app.route("/") def helloWorld(): return "Hello world"
点击此链接查看更多
以下是如何通过自己处理 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)
请在你的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)
在路由装饰器之后使用 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
我尝试了上述所有解决方案,但他们一直对我失败。 我敢肯定,大多数解决方案都会奏效,但是我在客户端应用程序中犯了一个非常明显的错误。 也许这可以为你们中的一些人节省一些调试时间。 我的请求,我通过以下方式调用了我的 REST 服务
'localhost:<port>/<myApi>'
对我来说,修复就像将服务调用为 http... 一样简单:
'http://localhost:<port>/<myApi>'
一个愚蠢的错误。
尝试这个:
@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__)
以下解决方案对我有用。 我包含了一个方法,该方法将添加您所需的标头,然后引发 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编译的,所以你可能需要编辑它。
基于 GyuHyeon Choi 的响应,但添加了return response
和额外的Access-Control-Expose-Headers
对我有用。
@app.after_request
def add_headers(response):
response.headers.add('Content-Type', 'application/json')
response.headers.add('Access-Control-Allow-Origin', '*')
response.headers.add('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS')
response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
response.headers.add('Access-Control-Expose-Headers', 'Content-Type,Content-Length,Authorization,X-Pagination')
return response
在客户端,您只需要确保您的服务器正在处理的数据类型。 例如表单数据或 json。
对我来说,下面写的代码很神奇
from flask import Flask,request,jsonify
from flask_cors import CORS,cross_origin
app=Flask(__name__)
CORS(app, support_credentials=True)
@app.route('/api/test', methods=['POST', 'GET','OPTIONS'])
@cross_origin(supports_credentials=True)
def index():
if(request.method=='POST'):
some_json=request.get_json()
return jsonify({"key":some_json})
else:
return jsonify({"GET":"GET"})
if __name__=="__main__":
app.run(host='0.0.0.0', port=5000)
请注意,如果您的应用程序返回 500 错误,您的浏览器可能会将其理解为 cors 错误,因为烧瓶 cors 仅在返回时添加标头。
因此,如果其他选项不起作用,您可以将烧瓶置于调试模式以验证它是否不仅仅是内部服务器错误。
.flaskenv
FLASK_ENV=development
我已经使用以下命令安装了 Flask,并使用了这样的声明:
pips3.6 install --user flask-cors
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.