Mat*_*teo 61 javascript python ajax cors flask
对于以下ajax
发布请求Flask
(如何使用从ajax发布的数据?):
$.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 );
}
});
Run Code Online (Sandbox Code Playgroud)
我收到一个Cross Origin Resource Sharing (CORS)
错误:
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.
Run Code Online (Sandbox Code Playgroud)
我尝试用以下两种方式解决它,但似乎没有一种方法可行.
这是Flask
处理的扩展CORS
,应该使跨源AJAX成为可能.
我的pythonServer.py使用这个解决方案:
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()
Run Code Online (Sandbox Code Playgroud)
这是一个官方的 Flask代码片段,定义了一个装饰器,它应该允许CORS
它装饰的功能.
我的pythonServer.py使用这个解决方案:
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()
Run Code Online (Sandbox Code Playgroud)
你能否说一下为什么会这样?
Sal*_*ali 59
您可以通过简单的方式获得结果:
@app.route('your route', methods=['GET'])
def yourMethod(params):
response = flask.jsonify({'some': 'data'})
response.headers.add('Access-Control-Allow-Origin', '*')
return response
Run Code Online (Sandbox Code Playgroud)
Nag*_*yan 38
好吧,我遇到了同样的问题.适用于可能登陆此页面的新用户.只需按照他们的官方文档.
安装烧瓶
pip install -U flask-cors
Run Code Online (Sandbox Code Playgroud)
然后在应用程序初始化后,使用默认参数初始化flask-cors
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
@app.route("/")
def helloWorld():
return "Hello, cross-origin-world!"
Run Code Online (Sandbox Code Playgroud)
Sat*_*ish 36
@马特:
在对代码进行一些修改后,它就像一个冠军
# initialization
app = Flask(__name__)
app.config['SECRET_KEY'] = 'the quick brown fox jumps over the lazy dog'
app.config['CORS_HEADERS'] = 'Content-Type'
cors = CORS(app, resources={r"/foo": {"origins": "http://localhost:port"}})
@app.route('/foo', methods=['POST'])
@cross_origin(origin='localhost',headers=['Content- Type','Authorization'])
def foo():
return request.json['inputVar']
if __name__ == '__main__':
app.run()
Run Code Online (Sandbox Code Playgroud)
我用localhost替换了*.由于我在许多博客和帖子中阅读,您应该允许访问特定域
注意:cross_origin 的位置要正确,并且依赖项已安装。在客户端,确保指定服务器正在使用的数据类型。例如 application/json 或 text/html
对我来说,下面写的代码有魔力
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)
Run Code Online (Sandbox Code Playgroud)
小智 7
我可能在这个问题上迟到了,但以下步骤解决了问题
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
Run Code Online (Sandbox Code Playgroud)
不妨把这个作为一个答案。我今天遇到了同样的问题,它比预期的更不是问题。添加 CORS 功能后,您必须重新启动 Flask 服务器(ctrl + c
->python manage.py runserver
或您使用的任何方法))以使更改生效,即使代码正确也是如此。否则 CORS 将无法在活动实例中工作。
这是对我来说的样子和它的工作原理(Python 3.6.1,Flask 0.12):
工厂.py:
from flask import Flask
from flask_cors import CORS # This is the magic
def create_app(register_stuffs=True):
"""Configure the app and views"""
app = Flask(__name__)
CORS(app) # This makes the CORS feature cover all routes in the app
if register_stuffs:
register_views(app)
return app
def register_views(app):
"""Setup the base routes for various features."""
from backend.apps.api.views import ApiView
ApiView.register(app, route_base="/api/v1.0/")
Run Code Online (Sandbox Code Playgroud)
视图.py:
from flask import jsonify
from flask_classy import FlaskView, route
class ApiView(FlaskView):
@route("/", methods=["GET"])
def index(self):
return "API v1.0"
@route("/stuff", methods=["GET", "POST"])
def news(self):
return jsonify({
"stuff": "Here be stuff"
})
Run Code Online (Sandbox Code Playgroud)
在我的 React 应用程序 console.log 中:
Sending request:
GET /stuff
With parameters:
null
bundle.js:17316 Received data from Api:
{"stuff": "Here be stuff"}
Run Code Online (Sandbox Code Playgroud)
请注意,Access-Control-Allow-Origin
在 Flask 响应对象中设置标头在许多情况下都很好(例如这种情况),但在提供静态资产时(至少在生产设置中)没有任何影响。这是因为静态资产直接由前端 Web 服务器(通常是 Nginx 或 Apache)提供服务。因此,在这种情况下,您必须在 Web 服务器级别而不是在 Flask 中设置响应标头。
有关更多详细信息,请参阅我不久前写的这篇文章,其中解释了如何设置标题(在我的例子中,我试图对 Font Awesome 资产进行跨域服务)。
此外,正如@Satu 所说,在 JS AJAX 请求的情况下,您可能只需要允许特定域的访问。对于请求静态资产(如字体文件),我认为规则不那么严格,并且更容易接受允许访问任何域。
归档时间: |
|
查看次数: |
80805 次 |
最近记录: |