How to enable CORS in flask and heroku












26















I am trying to make a cross origin request using jquery but it keeps being reject with the message




XMLHttpRequest cannot load http://... No 'Access-Control-Allow-Origin'
header is present on the requested resource. Origin ... is therefore
not allowed access.




I am using flask, heroku, and jquery



the client code looks like this:



$(document).ready(function() {
$('#submit_contact').click(function(e){
e.preventDefault();
$.ajax({
type: 'POST',
url: 'http://...',
// data: [
// { name: "name", value: $('name').val()},
// { name: "email", value: $('email').val() },
// { name: "phone", value: $('phone').val()},
// { name: "description", value: $('desc').val()}
//
// ],
data:"name=3&email=3&phone=3&description=3",
crossDomain:true,
success: function(msg) {
alert(msg);
}
});
});
});


on the heroku side i am using flask and it is like this



from flask import Flask,request
from flask.ext.mandrill import Mandrill
try:
from flask.ext.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.ext.cors import CORS
app = Flask(__name__)

app.config['MANDRILL_API_KEY'] = '...'
app.config['MANDRILL_DEFAULT_FROM']= '...'
app.config['QOLD_SUPPORT_EMAIL']='...'
app.config['CORS_HEADERS'] = 'Content-Type'

mandrill = Mandrill(app)
cors = CORS(app)

@app.route('/email/',methods=['POST'])
def hello_world():
name=request.form['name']
email=request.form['email']
phone=request.form['phone']
description=request.form['description']

mandrill.send_email(
from_email=email,
from_name=name,
to=[{'email': app.config['QOLD_SUPPORT_EMAIL']}],
text="Phone="+phone+"nn"+description
)

return '200 OK'

if __name__ == '__main__':
app.run()









share|improve this question



























    26















    I am trying to make a cross origin request using jquery but it keeps being reject with the message




    XMLHttpRequest cannot load http://... No 'Access-Control-Allow-Origin'
    header is present on the requested resource. Origin ... is therefore
    not allowed access.




    I am using flask, heroku, and jquery



    the client code looks like this:



    $(document).ready(function() {
    $('#submit_contact').click(function(e){
    e.preventDefault();
    $.ajax({
    type: 'POST',
    url: 'http://...',
    // data: [
    // { name: "name", value: $('name').val()},
    // { name: "email", value: $('email').val() },
    // { name: "phone", value: $('phone').val()},
    // { name: "description", value: $('desc').val()}
    //
    // ],
    data:"name=3&email=3&phone=3&description=3",
    crossDomain:true,
    success: function(msg) {
    alert(msg);
    }
    });
    });
    });


    on the heroku side i am using flask and it is like this



    from flask import Flask,request
    from flask.ext.mandrill import Mandrill
    try:
    from flask.ext.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.ext.cors import CORS
    app = Flask(__name__)

    app.config['MANDRILL_API_KEY'] = '...'
    app.config['MANDRILL_DEFAULT_FROM']= '...'
    app.config['QOLD_SUPPORT_EMAIL']='...'
    app.config['CORS_HEADERS'] = 'Content-Type'

    mandrill = Mandrill(app)
    cors = CORS(app)

    @app.route('/email/',methods=['POST'])
    def hello_world():
    name=request.form['name']
    email=request.form['email']
    phone=request.form['phone']
    description=request.form['description']

    mandrill.send_email(
    from_email=email,
    from_name=name,
    to=[{'email': app.config['QOLD_SUPPORT_EMAIL']}],
    text="Phone="+phone+"nn"+description
    )

    return '200 OK'

    if __name__ == '__main__':
    app.run()









    share|improve this question

























      26












      26








      26


      13






      I am trying to make a cross origin request using jquery but it keeps being reject with the message




      XMLHttpRequest cannot load http://... No 'Access-Control-Allow-Origin'
      header is present on the requested resource. Origin ... is therefore
      not allowed access.




      I am using flask, heroku, and jquery



      the client code looks like this:



      $(document).ready(function() {
      $('#submit_contact').click(function(e){
      e.preventDefault();
      $.ajax({
      type: 'POST',
      url: 'http://...',
      // data: [
      // { name: "name", value: $('name').val()},
      // { name: "email", value: $('email').val() },
      // { name: "phone", value: $('phone').val()},
      // { name: "description", value: $('desc').val()}
      //
      // ],
      data:"name=3&email=3&phone=3&description=3",
      crossDomain:true,
      success: function(msg) {
      alert(msg);
      }
      });
      });
      });


      on the heroku side i am using flask and it is like this



      from flask import Flask,request
      from flask.ext.mandrill import Mandrill
      try:
      from flask.ext.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.ext.cors import CORS
      app = Flask(__name__)

      app.config['MANDRILL_API_KEY'] = '...'
      app.config['MANDRILL_DEFAULT_FROM']= '...'
      app.config['QOLD_SUPPORT_EMAIL']='...'
      app.config['CORS_HEADERS'] = 'Content-Type'

      mandrill = Mandrill(app)
      cors = CORS(app)

      @app.route('/email/',methods=['POST'])
      def hello_world():
      name=request.form['name']
      email=request.form['email']
      phone=request.form['phone']
      description=request.form['description']

      mandrill.send_email(
      from_email=email,
      from_name=name,
      to=[{'email': app.config['QOLD_SUPPORT_EMAIL']}],
      text="Phone="+phone+"nn"+description
      )

      return '200 OK'

      if __name__ == '__main__':
      app.run()









      share|improve this question














      I am trying to make a cross origin request using jquery but it keeps being reject with the message




      XMLHttpRequest cannot load http://... No 'Access-Control-Allow-Origin'
      header is present on the requested resource. Origin ... is therefore
      not allowed access.




      I am using flask, heroku, and jquery



      the client code looks like this:



      $(document).ready(function() {
      $('#submit_contact').click(function(e){
      e.preventDefault();
      $.ajax({
      type: 'POST',
      url: 'http://...',
      // data: [
      // { name: "name", value: $('name').val()},
      // { name: "email", value: $('email').val() },
      // { name: "phone", value: $('phone').val()},
      // { name: "description", value: $('desc').val()}
      //
      // ],
      data:"name=3&email=3&phone=3&description=3",
      crossDomain:true,
      success: function(msg) {
      alert(msg);
      }
      });
      });
      });


      on the heroku side i am using flask and it is like this



      from flask import Flask,request
      from flask.ext.mandrill import Mandrill
      try:
      from flask.ext.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.ext.cors import CORS
      app = Flask(__name__)

      app.config['MANDRILL_API_KEY'] = '...'
      app.config['MANDRILL_DEFAULT_FROM']= '...'
      app.config['QOLD_SUPPORT_EMAIL']='...'
      app.config['CORS_HEADERS'] = 'Content-Type'

      mandrill = Mandrill(app)
      cors = CORS(app)

      @app.route('/email/',methods=['POST'])
      def hello_world():
      name=request.form['name']
      email=request.form['email']
      phone=request.form['phone']
      description=request.form['description']

      mandrill.send_email(
      from_email=email,
      from_name=name,
      to=[{'email': app.config['QOLD_SUPPORT_EMAIL']}],
      text="Phone="+phone+"nn"+description
      )

      return '200 OK'

      if __name__ == '__main__':
      app.run()






      jquery python heroku flask cors






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Aug 31 '14 at 18:15









      LopesLopes

      139127




      139127
























          5 Answers
          5






          active

          oldest

          votes


















          60














          Here is what worked for me when I deployed to Heroku.



          http://flask-cors.readthedocs.org/en/latest/



          $ pip install -U flask-cors



          from flask import Flask
          from flask_cors import CORS, cross_origin
          app = Flask(__name__)
          cors = CORS(app)
          app.config['CORS_HEADERS'] = 'Content-Type'

          @app.route("/")
          @cross_origin()
          def helloWorld():
          return "Hello, cross-origin-world!"





          share|improve this answer





















          • 1





            Plus 1 for hello cross origin world!

            – Simon Nicholls
            Oct 11 '18 at 8:28



















          16














          OK, I don't think the official snippet mentioned by galuszkak should be used everywhere, we should concern the case that some bug may be triggered during the handler such as hello_world function. Whether the response is correct or uncorrect, the Access-Control-Allow-Origin header is what we should concern. So, thing is very simple, just like bellow:



          @blueprint.after_request # blueprint can also be app~~
          def after_request(response):
          header = response.headers
          header['Access-Control-Allow-Origin'] = '*'
          return response


          That is all~~






          share|improve this answer
























          • This approach works without the crap.

            – kirpit
            Sep 21 '17 at 1:18



















          2














          Try the following decorators:



          @app.route('/email/',methods=['POST', 'OPTIONS']) #Added 'Options'
          @crossdomain(origin='*') #Added
          def hello_world():
          name=request.form['name']
          email=request.form['email']
          phone=request.form['phone']
          description=request.form['description']

          mandrill.send_email(
          from_email=email,
          from_name=name,
          to=[{'email': app.config['QOLD_SUPPORT_EMAIL']}],
          text="Phone="+phone+"nn"+description
          )

          return '200 OK'

          if __name__ == '__main__':
          app.run()


          This decorator would be created as follows:



          from datetime import timedelta
          from flask import make_response, request, current_app
          from functools import update_wrapper


          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


          You can also check out this package Flask-CORS






          share|improve this answer


























          • still not working. I already tried that and I also used the Flask-CORS package. I think Flask-CORS is built on top of that

            – Lopes
            Aug 31 '14 at 23:40





















          1














          I've just faced the same issue and I came to believe that the other answers are a bit more complicated than they need to be, so for those who don't want to rely on more libraries or decorators. Here's my approach:



          The preflight



          Before the actual cross domain POST request, the browser will issue an OPTIONS request. This response should not return any body, but only some reassuring headers telling the browser that it's already to do this cross-domain request and it's not part of some cross site scripting attack.



          I wrote a Python function to build this response using the make_response function from the flask module.



          def _build_cors_prelight_response():
          response = make_response()
          response.headers.add("Access-Control-Allow-Origin", "*")
          response.headers.add("Access-Control-Allow-Headers", "*")
          response.headers.add("Access-Control-Allow-Methods", "*")
          return response


          This response is a wildcard one that works for all requests. If you want the additional security gained by CORS, you have to provide a whitelist of origins, headers and methods.



          This response will convince your (Chrome) browser to go ahead and do the actual request.



          However, to read the data returned by the actual response, you have to add one cors header - otherwise the browser blocks it. Example with jsonify



          response = jsonify({"order_id": 123, "status": "shipped"}
          response.headers.add("Access-Control-Allow-Origin", "*")
          return response


          I also wrote a function for that.



          def _corsify_actual_response(response):
          response.headers.add("Access-Control-Allow-Origin", "*")
          return response


          allowing you to return a one-liner.



          Final code:



          from flask import Flask, request, jsonify, make_response
          from models import OrderModel

          flask_app = Flask(__name__)

          @flask_app.route("/api/orders", methods=["POST", "OPTIONS"])
          def api_create_order():
          if request.method == "OPTIONS": # CORS preflight
          return _build_cors_prelight_response()
          elif request.method == "POST": # The actual request following the preflight
          order = OrderModel.create(...) # Whatever.
          return _corsify_actual_response(jsonify(order.to_dict()))
          else
          raise RuntimeError("Wierd - don't know how to handle method {}".format(request.method))

          def _build_cors_prelight_response():
          response = make_response()
          response.headers.add("Access-Control-Allow-Origin", "*")
          response.headers.add('Access-Control-Allow-Headers', "*")
          response.headers.add('Access-Control-Allow-Methods', "*")
          return response

          def _corsify_actual_response(response):
          response.headers.add("Access-Control-Allow-Origin", "*")
          return response





          share|improve this answer































            1














            If you want to enable CORS for all routes, then just install flask_cors extension (pip3 install -U flask_cors) and wrap app like this: CORS(app).



            That is enough to do it (I tested this with a POST request to upload an image, and it worked for me):



            from flask import Flask
            from flask_cors import CORS
            app = Flask(__name__)
            CORS(app) # This will enable CORS for all routes


            Important note: if there is an error in your route, let us say you try to print a variable that does not exist, you will get a CORS error related message which, in fact, has nothing to do with CORS.






            share|improve this answer

























              Your Answer






              StackExchange.ifUsing("editor", function () {
              StackExchange.using("externalEditor", function () {
              StackExchange.using("snippets", function () {
              StackExchange.snippets.init();
              });
              });
              }, "code-snippets");

              StackExchange.ready(function() {
              var channelOptions = {
              tags: "".split(" "),
              id: "1"
              };
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using("snippets", function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader: {
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              },
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              });


              }
              });














              draft saved

              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f25594893%2fhow-to-enable-cors-in-flask-and-heroku%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              5 Answers
              5






              active

              oldest

              votes








              5 Answers
              5






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              60














              Here is what worked for me when I deployed to Heroku.



              http://flask-cors.readthedocs.org/en/latest/



              $ pip install -U flask-cors



              from flask import Flask
              from flask_cors import CORS, cross_origin
              app = Flask(__name__)
              cors = CORS(app)
              app.config['CORS_HEADERS'] = 'Content-Type'

              @app.route("/")
              @cross_origin()
              def helloWorld():
              return "Hello, cross-origin-world!"





              share|improve this answer





















              • 1





                Plus 1 for hello cross origin world!

                – Simon Nicholls
                Oct 11 '18 at 8:28
















              60














              Here is what worked for me when I deployed to Heroku.



              http://flask-cors.readthedocs.org/en/latest/



              $ pip install -U flask-cors



              from flask import Flask
              from flask_cors import CORS, cross_origin
              app = Flask(__name__)
              cors = CORS(app)
              app.config['CORS_HEADERS'] = 'Content-Type'

              @app.route("/")
              @cross_origin()
              def helloWorld():
              return "Hello, cross-origin-world!"





              share|improve this answer





















              • 1





                Plus 1 for hello cross origin world!

                – Simon Nicholls
                Oct 11 '18 at 8:28














              60












              60








              60







              Here is what worked for me when I deployed to Heroku.



              http://flask-cors.readthedocs.org/en/latest/



              $ pip install -U flask-cors



              from flask import Flask
              from flask_cors import CORS, cross_origin
              app = Flask(__name__)
              cors = CORS(app)
              app.config['CORS_HEADERS'] = 'Content-Type'

              @app.route("/")
              @cross_origin()
              def helloWorld():
              return "Hello, cross-origin-world!"





              share|improve this answer















              Here is what worked for me when I deployed to Heroku.



              http://flask-cors.readthedocs.org/en/latest/



              $ pip install -U flask-cors



              from flask import Flask
              from flask_cors import CORS, cross_origin
              app = Flask(__name__)
              cors = CORS(app)
              app.config['CORS_HEADERS'] = 'Content-Type'

              @app.route("/")
              @cross_origin()
              def helloWorld():
              return "Hello, cross-origin-world!"






              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited Jul 7 '17 at 13:57









              duan

              4,50132449




              4,50132449










              answered Oct 16 '14 at 3:11









              Daniel RasmusonDaniel Rasmuson

              1,42711534




              1,42711534








              • 1





                Plus 1 for hello cross origin world!

                – Simon Nicholls
                Oct 11 '18 at 8:28














              • 1





                Plus 1 for hello cross origin world!

                – Simon Nicholls
                Oct 11 '18 at 8:28








              1




              1





              Plus 1 for hello cross origin world!

              – Simon Nicholls
              Oct 11 '18 at 8:28





              Plus 1 for hello cross origin world!

              – Simon Nicholls
              Oct 11 '18 at 8:28













              16














              OK, I don't think the official snippet mentioned by galuszkak should be used everywhere, we should concern the case that some bug may be triggered during the handler such as hello_world function. Whether the response is correct or uncorrect, the Access-Control-Allow-Origin header is what we should concern. So, thing is very simple, just like bellow:



              @blueprint.after_request # blueprint can also be app~~
              def after_request(response):
              header = response.headers
              header['Access-Control-Allow-Origin'] = '*'
              return response


              That is all~~






              share|improve this answer
























              • This approach works without the crap.

                – kirpit
                Sep 21 '17 at 1:18
















              16














              OK, I don't think the official snippet mentioned by galuszkak should be used everywhere, we should concern the case that some bug may be triggered during the handler such as hello_world function. Whether the response is correct or uncorrect, the Access-Control-Allow-Origin header is what we should concern. So, thing is very simple, just like bellow:



              @blueprint.after_request # blueprint can also be app~~
              def after_request(response):
              header = response.headers
              header['Access-Control-Allow-Origin'] = '*'
              return response


              That is all~~






              share|improve this answer
























              • This approach works without the crap.

                – kirpit
                Sep 21 '17 at 1:18














              16












              16








              16







              OK, I don't think the official snippet mentioned by galuszkak should be used everywhere, we should concern the case that some bug may be triggered during the handler such as hello_world function. Whether the response is correct or uncorrect, the Access-Control-Allow-Origin header is what we should concern. So, thing is very simple, just like bellow:



              @blueprint.after_request # blueprint can also be app~~
              def after_request(response):
              header = response.headers
              header['Access-Control-Allow-Origin'] = '*'
              return response


              That is all~~






              share|improve this answer













              OK, I don't think the official snippet mentioned by galuszkak should be used everywhere, we should concern the case that some bug may be triggered during the handler such as hello_world function. Whether the response is correct or uncorrect, the Access-Control-Allow-Origin header is what we should concern. So, thing is very simple, just like bellow:



              @blueprint.after_request # blueprint can also be app~~
              def after_request(response):
              header = response.headers
              header['Access-Control-Allow-Origin'] = '*'
              return response


              That is all~~







              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered Aug 22 '17 at 12:55









              zhangqyzhangqy

              25537




              25537













              • This approach works without the crap.

                – kirpit
                Sep 21 '17 at 1:18



















              • This approach works without the crap.

                – kirpit
                Sep 21 '17 at 1:18

















              This approach works without the crap.

              – kirpit
              Sep 21 '17 at 1:18





              This approach works without the crap.

              – kirpit
              Sep 21 '17 at 1:18











              2














              Try the following decorators:



              @app.route('/email/',methods=['POST', 'OPTIONS']) #Added 'Options'
              @crossdomain(origin='*') #Added
              def hello_world():
              name=request.form['name']
              email=request.form['email']
              phone=request.form['phone']
              description=request.form['description']

              mandrill.send_email(
              from_email=email,
              from_name=name,
              to=[{'email': app.config['QOLD_SUPPORT_EMAIL']}],
              text="Phone="+phone+"nn"+description
              )

              return '200 OK'

              if __name__ == '__main__':
              app.run()


              This decorator would be created as follows:



              from datetime import timedelta
              from flask import make_response, request, current_app
              from functools import update_wrapper


              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


              You can also check out this package Flask-CORS






              share|improve this answer


























              • still not working. I already tried that and I also used the Flask-CORS package. I think Flask-CORS is built on top of that

                – Lopes
                Aug 31 '14 at 23:40


















              2














              Try the following decorators:



              @app.route('/email/',methods=['POST', 'OPTIONS']) #Added 'Options'
              @crossdomain(origin='*') #Added
              def hello_world():
              name=request.form['name']
              email=request.form['email']
              phone=request.form['phone']
              description=request.form['description']

              mandrill.send_email(
              from_email=email,
              from_name=name,
              to=[{'email': app.config['QOLD_SUPPORT_EMAIL']}],
              text="Phone="+phone+"nn"+description
              )

              return '200 OK'

              if __name__ == '__main__':
              app.run()


              This decorator would be created as follows:



              from datetime import timedelta
              from flask import make_response, request, current_app
              from functools import update_wrapper


              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


              You can also check out this package Flask-CORS






              share|improve this answer


























              • still not working. I already tried that and I also used the Flask-CORS package. I think Flask-CORS is built on top of that

                – Lopes
                Aug 31 '14 at 23:40
















              2












              2








              2







              Try the following decorators:



              @app.route('/email/',methods=['POST', 'OPTIONS']) #Added 'Options'
              @crossdomain(origin='*') #Added
              def hello_world():
              name=request.form['name']
              email=request.form['email']
              phone=request.form['phone']
              description=request.form['description']

              mandrill.send_email(
              from_email=email,
              from_name=name,
              to=[{'email': app.config['QOLD_SUPPORT_EMAIL']}],
              text="Phone="+phone+"nn"+description
              )

              return '200 OK'

              if __name__ == '__main__':
              app.run()


              This decorator would be created as follows:



              from datetime import timedelta
              from flask import make_response, request, current_app
              from functools import update_wrapper


              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


              You can also check out this package Flask-CORS






              share|improve this answer















              Try the following decorators:



              @app.route('/email/',methods=['POST', 'OPTIONS']) #Added 'Options'
              @crossdomain(origin='*') #Added
              def hello_world():
              name=request.form['name']
              email=request.form['email']
              phone=request.form['phone']
              description=request.form['description']

              mandrill.send_email(
              from_email=email,
              from_name=name,
              to=[{'email': app.config['QOLD_SUPPORT_EMAIL']}],
              text="Phone="+phone+"nn"+description
              )

              return '200 OK'

              if __name__ == '__main__':
              app.run()


              This decorator would be created as follows:



              from datetime import timedelta
              from flask import make_response, request, current_app
              from functools import update_wrapper


              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


              You can also check out this package Flask-CORS







              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited Feb 20 '15 at 22:08









              galuszkak

              403420




              403420










              answered Aug 31 '14 at 19:55









              NewttNewtt

              2,43154375




              2,43154375













              • still not working. I already tried that and I also used the Flask-CORS package. I think Flask-CORS is built on top of that

                – Lopes
                Aug 31 '14 at 23:40





















              • still not working. I already tried that and I also used the Flask-CORS package. I think Flask-CORS is built on top of that

                – Lopes
                Aug 31 '14 at 23:40



















              still not working. I already tried that and I also used the Flask-CORS package. I think Flask-CORS is built on top of that

              – Lopes
              Aug 31 '14 at 23:40







              still not working. I already tried that and I also used the Flask-CORS package. I think Flask-CORS is built on top of that

              – Lopes
              Aug 31 '14 at 23:40













              1














              I've just faced the same issue and I came to believe that the other answers are a bit more complicated than they need to be, so for those who don't want to rely on more libraries or decorators. Here's my approach:



              The preflight



              Before the actual cross domain POST request, the browser will issue an OPTIONS request. This response should not return any body, but only some reassuring headers telling the browser that it's already to do this cross-domain request and it's not part of some cross site scripting attack.



              I wrote a Python function to build this response using the make_response function from the flask module.



              def _build_cors_prelight_response():
              response = make_response()
              response.headers.add("Access-Control-Allow-Origin", "*")
              response.headers.add("Access-Control-Allow-Headers", "*")
              response.headers.add("Access-Control-Allow-Methods", "*")
              return response


              This response is a wildcard one that works for all requests. If you want the additional security gained by CORS, you have to provide a whitelist of origins, headers and methods.



              This response will convince your (Chrome) browser to go ahead and do the actual request.



              However, to read the data returned by the actual response, you have to add one cors header - otherwise the browser blocks it. Example with jsonify



              response = jsonify({"order_id": 123, "status": "shipped"}
              response.headers.add("Access-Control-Allow-Origin", "*")
              return response


              I also wrote a function for that.



              def _corsify_actual_response(response):
              response.headers.add("Access-Control-Allow-Origin", "*")
              return response


              allowing you to return a one-liner.



              Final code:



              from flask import Flask, request, jsonify, make_response
              from models import OrderModel

              flask_app = Flask(__name__)

              @flask_app.route("/api/orders", methods=["POST", "OPTIONS"])
              def api_create_order():
              if request.method == "OPTIONS": # CORS preflight
              return _build_cors_prelight_response()
              elif request.method == "POST": # The actual request following the preflight
              order = OrderModel.create(...) # Whatever.
              return _corsify_actual_response(jsonify(order.to_dict()))
              else
              raise RuntimeError("Wierd - don't know how to handle method {}".format(request.method))

              def _build_cors_prelight_response():
              response = make_response()
              response.headers.add("Access-Control-Allow-Origin", "*")
              response.headers.add('Access-Control-Allow-Headers', "*")
              response.headers.add('Access-Control-Allow-Methods', "*")
              return response

              def _corsify_actual_response(response):
              response.headers.add("Access-Control-Allow-Origin", "*")
              return response





              share|improve this answer




























                1














                I've just faced the same issue and I came to believe that the other answers are a bit more complicated than they need to be, so for those who don't want to rely on more libraries or decorators. Here's my approach:



                The preflight



                Before the actual cross domain POST request, the browser will issue an OPTIONS request. This response should not return any body, but only some reassuring headers telling the browser that it's already to do this cross-domain request and it's not part of some cross site scripting attack.



                I wrote a Python function to build this response using the make_response function from the flask module.



                def _build_cors_prelight_response():
                response = make_response()
                response.headers.add("Access-Control-Allow-Origin", "*")
                response.headers.add("Access-Control-Allow-Headers", "*")
                response.headers.add("Access-Control-Allow-Methods", "*")
                return response


                This response is a wildcard one that works for all requests. If you want the additional security gained by CORS, you have to provide a whitelist of origins, headers and methods.



                This response will convince your (Chrome) browser to go ahead and do the actual request.



                However, to read the data returned by the actual response, you have to add one cors header - otherwise the browser blocks it. Example with jsonify



                response = jsonify({"order_id": 123, "status": "shipped"}
                response.headers.add("Access-Control-Allow-Origin", "*")
                return response


                I also wrote a function for that.



                def _corsify_actual_response(response):
                response.headers.add("Access-Control-Allow-Origin", "*")
                return response


                allowing you to return a one-liner.



                Final code:



                from flask import Flask, request, jsonify, make_response
                from models import OrderModel

                flask_app = Flask(__name__)

                @flask_app.route("/api/orders", methods=["POST", "OPTIONS"])
                def api_create_order():
                if request.method == "OPTIONS": # CORS preflight
                return _build_cors_prelight_response()
                elif request.method == "POST": # The actual request following the preflight
                order = OrderModel.create(...) # Whatever.
                return _corsify_actual_response(jsonify(order.to_dict()))
                else
                raise RuntimeError("Wierd - don't know how to handle method {}".format(request.method))

                def _build_cors_prelight_response():
                response = make_response()
                response.headers.add("Access-Control-Allow-Origin", "*")
                response.headers.add('Access-Control-Allow-Headers', "*")
                response.headers.add('Access-Control-Allow-Methods', "*")
                return response

                def _corsify_actual_response(response):
                response.headers.add("Access-Control-Allow-Origin", "*")
                return response





                share|improve this answer


























                  1












                  1








                  1







                  I've just faced the same issue and I came to believe that the other answers are a bit more complicated than they need to be, so for those who don't want to rely on more libraries or decorators. Here's my approach:



                  The preflight



                  Before the actual cross domain POST request, the browser will issue an OPTIONS request. This response should not return any body, but only some reassuring headers telling the browser that it's already to do this cross-domain request and it's not part of some cross site scripting attack.



                  I wrote a Python function to build this response using the make_response function from the flask module.



                  def _build_cors_prelight_response():
                  response = make_response()
                  response.headers.add("Access-Control-Allow-Origin", "*")
                  response.headers.add("Access-Control-Allow-Headers", "*")
                  response.headers.add("Access-Control-Allow-Methods", "*")
                  return response


                  This response is a wildcard one that works for all requests. If you want the additional security gained by CORS, you have to provide a whitelist of origins, headers and methods.



                  This response will convince your (Chrome) browser to go ahead and do the actual request.



                  However, to read the data returned by the actual response, you have to add one cors header - otherwise the browser blocks it. Example with jsonify



                  response = jsonify({"order_id": 123, "status": "shipped"}
                  response.headers.add("Access-Control-Allow-Origin", "*")
                  return response


                  I also wrote a function for that.



                  def _corsify_actual_response(response):
                  response.headers.add("Access-Control-Allow-Origin", "*")
                  return response


                  allowing you to return a one-liner.



                  Final code:



                  from flask import Flask, request, jsonify, make_response
                  from models import OrderModel

                  flask_app = Flask(__name__)

                  @flask_app.route("/api/orders", methods=["POST", "OPTIONS"])
                  def api_create_order():
                  if request.method == "OPTIONS": # CORS preflight
                  return _build_cors_prelight_response()
                  elif request.method == "POST": # The actual request following the preflight
                  order = OrderModel.create(...) # Whatever.
                  return _corsify_actual_response(jsonify(order.to_dict()))
                  else
                  raise RuntimeError("Wierd - don't know how to handle method {}".format(request.method))

                  def _build_cors_prelight_response():
                  response = make_response()
                  response.headers.add("Access-Control-Allow-Origin", "*")
                  response.headers.add('Access-Control-Allow-Headers', "*")
                  response.headers.add('Access-Control-Allow-Methods', "*")
                  return response

                  def _corsify_actual_response(response):
                  response.headers.add("Access-Control-Allow-Origin", "*")
                  return response





                  share|improve this answer













                  I've just faced the same issue and I came to believe that the other answers are a bit more complicated than they need to be, so for those who don't want to rely on more libraries or decorators. Here's my approach:



                  The preflight



                  Before the actual cross domain POST request, the browser will issue an OPTIONS request. This response should not return any body, but only some reassuring headers telling the browser that it's already to do this cross-domain request and it's not part of some cross site scripting attack.



                  I wrote a Python function to build this response using the make_response function from the flask module.



                  def _build_cors_prelight_response():
                  response = make_response()
                  response.headers.add("Access-Control-Allow-Origin", "*")
                  response.headers.add("Access-Control-Allow-Headers", "*")
                  response.headers.add("Access-Control-Allow-Methods", "*")
                  return response


                  This response is a wildcard one that works for all requests. If you want the additional security gained by CORS, you have to provide a whitelist of origins, headers and methods.



                  This response will convince your (Chrome) browser to go ahead and do the actual request.



                  However, to read the data returned by the actual response, you have to add one cors header - otherwise the browser blocks it. Example with jsonify



                  response = jsonify({"order_id": 123, "status": "shipped"}
                  response.headers.add("Access-Control-Allow-Origin", "*")
                  return response


                  I also wrote a function for that.



                  def _corsify_actual_response(response):
                  response.headers.add("Access-Control-Allow-Origin", "*")
                  return response


                  allowing you to return a one-liner.



                  Final code:



                  from flask import Flask, request, jsonify, make_response
                  from models import OrderModel

                  flask_app = Flask(__name__)

                  @flask_app.route("/api/orders", methods=["POST", "OPTIONS"])
                  def api_create_order():
                  if request.method == "OPTIONS": # CORS preflight
                  return _build_cors_prelight_response()
                  elif request.method == "POST": # The actual request following the preflight
                  order = OrderModel.create(...) # Whatever.
                  return _corsify_actual_response(jsonify(order.to_dict()))
                  else
                  raise RuntimeError("Wierd - don't know how to handle method {}".format(request.method))

                  def _build_cors_prelight_response():
                  response = make_response()
                  response.headers.add("Access-Control-Allow-Origin", "*")
                  response.headers.add('Access-Control-Allow-Headers', "*")
                  response.headers.add('Access-Control-Allow-Methods', "*")
                  return response

                  def _corsify_actual_response(response):
                  response.headers.add("Access-Control-Allow-Origin", "*")
                  return response






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Oct 18 '18 at 14:06









                  Niels B.Niels B.

                  3,48111231




                  3,48111231























                      1














                      If you want to enable CORS for all routes, then just install flask_cors extension (pip3 install -U flask_cors) and wrap app like this: CORS(app).



                      That is enough to do it (I tested this with a POST request to upload an image, and it worked for me):



                      from flask import Flask
                      from flask_cors import CORS
                      app = Flask(__name__)
                      CORS(app) # This will enable CORS for all routes


                      Important note: if there is an error in your route, let us say you try to print a variable that does not exist, you will get a CORS error related message which, in fact, has nothing to do with CORS.






                      share|improve this answer






























                        1














                        If you want to enable CORS for all routes, then just install flask_cors extension (pip3 install -U flask_cors) and wrap app like this: CORS(app).



                        That is enough to do it (I tested this with a POST request to upload an image, and it worked for me):



                        from flask import Flask
                        from flask_cors import CORS
                        app = Flask(__name__)
                        CORS(app) # This will enable CORS for all routes


                        Important note: if there is an error in your route, let us say you try to print a variable that does not exist, you will get a CORS error related message which, in fact, has nothing to do with CORS.






                        share|improve this answer




























                          1












                          1








                          1







                          If you want to enable CORS for all routes, then just install flask_cors extension (pip3 install -U flask_cors) and wrap app like this: CORS(app).



                          That is enough to do it (I tested this with a POST request to upload an image, and it worked for me):



                          from flask import Flask
                          from flask_cors import CORS
                          app = Flask(__name__)
                          CORS(app) # This will enable CORS for all routes


                          Important note: if there is an error in your route, let us say you try to print a variable that does not exist, you will get a CORS error related message which, in fact, has nothing to do with CORS.






                          share|improve this answer















                          If you want to enable CORS for all routes, then just install flask_cors extension (pip3 install -U flask_cors) and wrap app like this: CORS(app).



                          That is enough to do it (I tested this with a POST request to upload an image, and it worked for me):



                          from flask import Flask
                          from flask_cors import CORS
                          app = Flask(__name__)
                          CORS(app) # This will enable CORS for all routes


                          Important note: if there is an error in your route, let us say you try to print a variable that does not exist, you will get a CORS error related message which, in fact, has nothing to do with CORS.







                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited Jan 1 at 17:50

























                          answered Jan 1 at 16:52









                          Billal BegueradjBillal Begueradj

                          5,981132844




                          5,981132844






























                              draft saved

                              draft discarded




















































                              Thanks for contributing an answer to Stack Overflow!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f25594893%2fhow-to-enable-cors-in-flask-and-heroku%23new-answer', 'question_page');
                              }
                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              MongoDB - Not Authorized To Execute Command

                              How to fix TextFormField cause rebuild widget in Flutter

                              Npm cannot find a required file even through it is in the searched directory