'Sending Response to OPTIONS in Python Flask application
I have a python Flask listener waiting on port 8080. I expect another process to make a series of POST's to this port.The code for listener is as follows.
#!/usr/bin/env python2
from __future__ import print_function
from flask import Flask, request
from werkzeug import secure_filename
from datetime import datetime
import os, traceback, sys
import zlib
import ssl
import json
import os
import base64
app = Flask('__name__')
@app.route('/',methods=['GET','POST','OPTIONS'])
def recive_fe_events():
try:
data = request.get_data()
if request.content_length < 20000 and request.content_length != 0:
filename = 'out/{0}.json'.format(str(datetime.now()))
with open(filename, 'w') as f:
f.write(data)
print('Wrote', filename)
else:
print("Request too long", request.content_length)
content = '{{"status": 413, "content_length": {0}, "content": "{1}"}}'.format(request.content_length, data)
return content, 413
except:
traceback.print_exc()
return None, status.HTTP_500_INTERNAL_SERVER_ERROR
return '{"status": 200}\n'
if __name__ == '__main__':
app.run(host='0.0.0.0',debug=False,port=8080)
However whenever I try to trigger an event to be pushed to the above listener.It seems that I am getting OPTIONS instead of POST.
192.168.129.75 - - [20/May/2015 14:33:45] "OPTIONS / HTTP/1.1" 200 -
192.168.129.75 - - [20/May/2015 14:33:45] "OPTIONS / HTTP/1.1" 200 -
192.168.129.75 - - [20/May/2015 14:33:51] "OPTIONS / HTTP/1.1" 200 -
192.168.129.75 - - [20/May/2015 14:33:51] "OPTIONS / HTTP/1.1" 200 -
The investigation of my client revealed that it expects the following flags in its response to OPTIONS.
Access-Control-Allow-Origin value_1
Access-Control-Allow-Methods value_2
Access-Control-Allow-Headers value_3
How do I format the above response to OPTIONS so that my server can start receiving POST messages from the client.
Solution 1:[1]
This is old, but i'd like to actually answer the question...
In preflight a browser, and probably toolkit, sends an OPTIONS-request to figure out if it's safe to send a POST or PUT. Those are the typical cases...
Note that the headers should be on an OPTIONS-request only, they are redundant in the actual POST/PUT... cases.
I return the following in response-headers for an OPTIONS:
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Max-Age': '300'
You might want to read the spect for more details.
I find the Flask-CORS somewhat redundant, but thats a matter of taste perhaps.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | OriginalHacker |
