cors python flask
método de aborto en Flask-Restful ignorando las opciones de CORS (1)
Tengo una API Flask-Restful configurada con algunas opciones de CORS:
api = Api()
api.decorators=[cors.crossdomain(origin=''*'', headers=[''accept'', ''Content-Type''])]
...
api.init_app(app)
Mi API acepta solicitudes POST
que pueden fallar si los datos en la solicitud no son válidos:
class myAPI(Resource):
def post(self):
args = request.get_json()
if args.get(''something''):
return {''message'': ''Request worked, data received!'',
''something'': args[''something'']}
else:
abort(500, "Error: Data must contain a ''something'' field!")
Cuando realizo una solicitud POST
exitosa a mi API, puedo ver que las opciones CORS están configuradas correctamente:
...
* upload completely sent off: 81 out of 81 bytes
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Content-Type: application/json
< Content-Length: 205
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: HEAD, GET, POST, OPTIONS
< Access-Control-Max-Age: 21600
< Access-Control-Allow-Headers: ACCEPT, CONTENT-TYPE
< Server: Werkzeug/0.9.4 Python/2.7.6
Sin embargo, si la llamada posterior de mi clase finaliza a través del método abortar (enviando deliberadamente datos incorrectos a la solicitud), entonces los campos Access-Control-*
faltan en la respuesta:
* upload completely sent off: 75 out of 75 bytes
* HTTP 1.0, assume close after body
< HTTP/1.0 500 INTERNAL SERVER ERROR
< Content-Type: application/json
< Content-Length: 51
< Server: Werkzeug/0.9.4 Python/2.7.6
¿Es posible hacer que el método abort funcione bien con mis reglas CORS, o debería crear mi propia respuesta completa y evitar usar la función abortar?
Cuando desencadena un aborto, el manejador de errores registrado en el código de error HTTP se invoca automáticamente y la función de vista no responde realmente a la respuesta.
Si utiliza el middleware CORS que es proporcionado por Flask-Cors, en lugar de la forma de decorador, en el caso de excepciones manejadas y abortos, los encabezados CORS serán inyectados como se esperaba.
Si se produce una excepción no controlada, (por ejemplo, hay un error en el código y un error del servidor interno de 500), Flask omite el middleware y no se ejecutan los manejadores de la petición posterior.
Revelación completa, escribí Flask-Cors.