python rest flask cors abort

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.