利用Flask解决跨源数据共享问题

对于以下ajaxFlask发布请求(我如何使用从ajax发布到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 );
    }   
});

我得到一个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.

我尝试用以下两种方式解决它,但似乎没有任何工作。

  • 使用Flask-CORS
  • 这是一个用于处理CORSFlask扩展,它应该使得跨源AJAX成为可能。

  • http://flask-cors.readthedocs.org/en/latest/
  • 如何在flask和heroku中启用CORS
  • 当应用jwt auth包装器时,Flask-cors包装器不工作。
  • Javascript - 没有'Access-Control-Allow-Origin'标题出现在请求的资源上
  • 我的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()
    
  • 使用特定的Flask Decorator
  • 这是一个官方的Flask代码片断,它定义了一个装饰器,它应该允许CORS装饰它的功能。

  • http://flask.pocoo.org/snippets/56/
  • Python Flask跨站点HTTP POST - 不适用于特定允许的来源
  • http://chopapp.com/#351l7gc3
  • 我的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()
    

    你能给一些说明为什么是这样吗?


    @马特:

    它像一个冠军,经过修改一下你的代码

    # 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()
    

    我用localhost替换了*。 由于我在许多博客和博文中阅读过,您应该允许访问特定的域


    你可以用一个简单的方法得到结果:

    @app.route('your route', methods=['GET'])
    def yourMethod(params):
        response = flask.jsonify({'some': 'data'})
        response.headers.add('Access-Control-Allow-Origin', '*')
        return response
    

    那么,我面临同样的问题。 对于可能登陆此页面的新用户。 只要按照他们的官方文件。

    安装烧瓶

    pip install -U flask-cors
    

    然后在应用程序初始化后,使用默认参数初始化flask-cors

    from flask import Flask
    from flask_cors import CORS, cross_origin
    
    app = Flask(__name__)
    CORS(app)
    
    @app.route("/")
    def helloWorld():
       return "Hello, cross-origin-world!"
    
    链接地址: http://www.djcxy.com/p/88653.html

    上一篇: Solve Cross Origin Resource Sharing with Flask

    下一篇: Hybridauth + composer: how to add custom providers