PrestonDocks
PrestonDocks

Reputation: 5408

Python Flask unable to get past CORS

I have the following script written in python

from flask import Flask, request, jsonify
from flask_cors import CORS, cross_origin

app = Flask(__name__)
CORS(app, resources=r'/chat', headers='Content-Type')


@app.route("/chat")
def chat():
  print(request)
  request.get_data()
  data = json.loads(request.data)
  response = chatbot.get_response(str(data['message']))
  response_data = response.serialize()
  response = jsonify({'data': response_data})
  return response
app.run(host="0.0.0.0", port=8900, debug=True)

I am calling this API from a JavaScript frontend running on http://localhost:8080

I am using Google Chrome and get the following error

Access to XMLHttpRequest at 'http://localhost:8900/chat/' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

I also get the following the log message in the Python Console for each request

127.0.0.1 - - [19/Mar/2020 15:12:00] "?[33mOPTIONS /chat/ HTTP/1.1?[0m" 404 -

I am getting really frustrated because even if I change my code to

@app.route("/chat")
def chat():
  print(request)
  request.get_data()
  data = json.loads(request.data)
  response = chatbot.get_response(str(data['message']))
  response_data = response.serialize()
  response = jsonify({'data': response_data})
  response.headers.add('Access-Control-Allow-Origin', '*')
  response.headers.add('Access-Control-Allow-Headers', 'append,delete,entries,foreach,get,has,keys,set,values,Authorization')
  response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS')
  return response

I still get the same error.

Upvotes: 0

Views: 1612

Answers (1)

Bets
Bets

Reputation: 586

Can you try setting the headers like this instead?

from flask import Flask, request, jsonify
from flask_cors import CORS, cross_origin

app = Flask(__name__)
CORS(app, resources=r'/chat', headers='Content-Type')


@app.route("/chat")
def chat():
  print(request)
  request.get_data()
  data = json.loads(request.data)
  response = chatbot.get_response(str(data['message']))
  response_data = response.serialize()
  response = jsonify({'data': response_data})
  response.headers['Access-Control-Allow-Origin'] = '*'
  response.headers['Access-Control-Allow-Headers'] = 'append,delete,entries,foreach,get,has,keys,set,values,Authorization'
  response.headers['Access-Control-Allow-Methods'] = 'GET,PUT,POST,DELETE,OPTIONS'
  return response
app.run(host="0.0.0.0", port=8900, debug=True)

Upvotes: 1

Related Questions