Skip to content

# Using CORS with Blueprints

Flask-CORS supports blueprints out of the box. Simply pass a `blueprint` instance to the CORS extension, and everything will just work.

    """
    Flask-Cors example
    ===================
    This is a tiny Flask Application demonstrating Flask-Cors, making it simple
    to add cross origin support to your flask app!

    :copyright: (c) 2016 by Cory Dolphin.
    :license:   MIT/X11, see LICENSE for more details.
    """
    from flask import Flask, jsonify, Blueprint
    import logging
    try:
        from flask_cors import CORS  # The typical way to import flask-cors
    except ImportError:
        # Path hack allows examples to be run without installation.
        import os
        parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        os.sys.path.insert(0, parentdir)

        from flask_cors import CORS

    api_v1 = Blueprint('API_v1', __name__)

    CORS(api_v1) # enable CORS on the API_v1 blue print

    @api_v1.route("/api/v1/users/")
    def list_users():
        '''
            Since the path matches the regular expression r'/api/*', this resource
            automatically has CORS headers set. The expected result is as follows:

            $ curl --include -X GET http://127.0.0.1:5000/api/v1/users/ \
                --header Origin:www.examplesite.com
            HTTP/1.0 200 OK
            Access-Control-Allow-Headers: Content-Type
            Access-Control-Allow-Origin: *
            Content-Length: 21
            Content-Type: application/json
            Date: Sat, 09 Aug 2014 00:26:41 GMT
            Server: Werkzeug/0.9.4 Python/2.7.8

            {
                "success": true
            }

        '''
        return jsonify(user="joe")

    @api_v1.route("/api/v1/users/create", methods=['POST'])
    def create_user():
        '''
            Since the path matches the regular expression r'/api/*', this resource
            automatically has CORS headers set.

            Browsers will first make a preflight request to verify that the resource
            allows cross-origin POSTs with a JSON Content-Type, which can be simulated
            as:
            $ curl --include -X OPTIONS http://127.0.0.1:5000/api/v1/users/create \
                --header Access-Control-Request-Method:POST \
                --header Access-Control-Request-Headers:Content-Type \
                --header Origin:www.examplesite.com
            >> HTTP/1.0 200 OK
            Content-Type: text/html; charset=utf-8
            Allow: POST, OPTIONS
            Access-Control-Allow-Origin: *
            Access-Control-Allow-Headers: Content-Type
            Access-Control-Allow-Methods: DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT
            Content-Length: 0
            Server: Werkzeug/0.9.6 Python/2.7.9
            Date: Sat, 31 Jan 2015 22:25:22 GMT

            $ curl --include -X POST http://127.0.0.1:5000/api/v1/users/create \
                --header Content-Type:application/json \
                --header Origin:www.examplesite.com

            >> HTTP/1.0 200 OK
            Content-Type: application/json
            Content-Length: 21
            Access-Control-Allow-Origin: *
            Server: Werkzeug/0.9.6 Python/2.7.9
            Date: Sat, 31 Jan 2015 22:25:04 GMT

            {
              "success": true
            }

        '''
        return jsonify(success=True)

    public_routes = Blueprint('public', __name__)

    @public_routes.route("/")
    def helloWorld():
        '''
            Since the path '/' does not match the regular expression r'/api/*',
            this route does not have CORS headers set.
        '''
        return '''<h1>Hello CORS!</h1> Read about my spec at the
    <a href="http://www.w3.org/TR/cors/">W3</a> Or, checkout my documentation
    on <a href="https://github.com/corydolphin/flask-cors">Github</a>'''

    logging.basicConfig(level=logging.INFO)
    app = Flask('FlaskCorsBlueprintBasedExample')
    app.register_blueprint(api_v1)
    app.register_blueprint(public_routes)

    if __name__ == "__main__":
        app.run(debug=True)