Javascript - No 'Access-Control-Allow-Origin' header is present on the requested resource Javascript - No 'Access-Control-Allow-Origin' header is present on the requested resource ajax ajax

Javascript - No 'Access-Control-Allow-Origin' header is present on the requested resource


I have used the flask-cors extension.

Install using pip install flask-cors

Then it's simply

from flask_cors import CORSapp = Flask(__name__)CORS(app)

This will allow all domains


Old question, but for future googlers with this problem, I solved it (and a few other downstream issues having to do with CORS) for my flask-restful app by adding the following to my app.py file:

app = Flask(__name__)api = Api(app)@app.after_requestdef after_request(response):  response.headers.add('Access-Control-Allow-Origin', '*')  response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')  response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS')  return responseif __name__ == '__main__':    app.run()


I got Javascript working with Flask by using this decorator, and adding "OPTIONS" to my list of acceptable methods. The decorator should be used beneath your route decorator, like this:

@app.route('/login', methods=['POST', 'OPTIONS'])@crossdomain(origin='*')def login()    ...

Edit:Link appears to be broken. Here's the decorator I used.

from datetime import timedeltafrom flask import make_response, request, current_appfrom functools import update_wrapperdef crossdomain(origin=None, methods=None, headers=None, max_age=21600,                attach_to_all=True, automatic_options=True):    """Decorator function that allows crossdomain requests.      Courtesy of      https://blog.skyred.fi/articles/better-crossdomain-snippet-for-flask.html    """    if methods is not None:        methods = ', '.join(sorted(x.upper() for x in methods))    # use str instead of basestring if using Python 3.x    if headers is not None and not isinstance(headers, basestring):        headers = ', '.join(x.upper() for x in headers)    # use str instead of basestring if using Python 3.x    if not isinstance(origin, basestring):        origin = ', '.join(origin)    if isinstance(max_age, timedelta):        max_age = max_age.total_seconds()    def get_methods():        """ Determines which methods are allowed        """        if methods is not None:            return methods        options_resp = current_app.make_default_options_response()        return options_resp.headers['allow']    def decorator(f):        """The decorator function        """        def wrapped_function(*args, **kwargs):            """Caries out the actual cross domain code            """            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)            h['Access-Control-Allow-Credentials'] = 'true'            h['Access-Control-Allow-Headers'] = \                "Origin, X-Requested-With, Content-Type, Accept, Authorization"            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