How to Solve CORS for python-eve

[ ]

Recently, I am building a rest api for mongodb via python-eve. Everything works like charm, except my browser is complaining

Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.

Some googling indicates it is a problem of Cross-Origin Resource Sharing (CORS), where python-eve, by default, doesn’t support PUT method cross origin. To do that, I found a solution from stackoverflow, where I made a small modification:

@app.after_request
def after_request(response):
  response.headers.set('Access-Control-Allow-Origin', '*')
  response.headers.set('Access-Control-Allow-Headers', 'Content-Type,Authorization')
  response.headers.set('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS')
  return response

Note, I use set instead of add there, as I found when I use add, I get response with two Access-Control-Allow-Methods, where one is empty the other one has value as I specify here.

Now my response head is like

Access-Control-Allow-Headers:Content-Type,Authorization,If-Match
Access-Control-Allow-Methods:GET,PUT,POST,DELETE,OPTIONS
Access-Control-Allow-Origin:*
Access-Control-Expose-Headers:
Access-Control-Max-Age:21600
Content-Length:179
Content-Type:application/json
Date:Wed, 06 Sep 2017 02:36:56 GMT
Server:Eve/0.7.4 Werkzeug/0.11.15 Python/3.5.2
Vary:Origin

instead of

Access-Control-Allow-Headers:
Access-Control-Allow-Methods:
Access-Control-Allow-Origin:
Access-Control-Expose-Headers:
Access-Control-Max-Age:21600
Content-Length:0
Content-Type:text/html; charset=utf-8
Date:Wed, 06 Sep 2017 02:35:41 GMT
Server:Eve/0.7.4 Werkzeug/0.11.15 Python/3.5.2
Vary:Origin
Written on September 5, 2017