python cors cherrypy

python - Detener procesamiento de solicitud en CherryPy y devolver respuesta 200 desde una herramienta



cors (1)

Solo tiene su conjunto de herramientas request.handler = None. Ver Request.respond para el código que implementa esto y CachingTool para un ejemplo:

request = cherrypy.serving.request if _caching.get(**kwargs): request.handler = None

Mi pregunta

Estoy buscando una manera de detener el procesamiento de solicitudes en una herramienta sin generar una excepción. En otras palabras: quiero detener la solicitud antes de que llegue al controlador especificado y devolver un código de estado 2xx?

Fondo

Queremos que nuestra aplicación sea compatible con CORS y, por lo tanto, con la solicitud de verificación previa. La idea era escribir una herramienta que engancha before_handler . Si se realiza una solicitud OPTIONS, devuelva los CORS-headers relevantes y salga.

El problema es que no he encontrado la manera de detener el flujo de ejecución. Esto significa que la URL original se procesa, como sería si se solicitara normalmente. El punto es: esto podría generar problemas de seguridad, ya que la solicitud de verificación previa siempre se realiza. Esto es lo que tengo hasta ahora:

class CORSTool(cherrypy.Tool): def __init__(self): cherrypy.Tool.__init__(self, ''before_handler'', self.insert_cors_header, priority=40) cherrypy.request.hooks.attach(''before_handler'', self.insert_cors_header, priority=40) def _setup(self): cherrypy.Tool._setup(self) def insert_cors_header(self): """ Inserts the relevant CORS-Headers: - Access-Control-Allow-Origin: <from-config> - Access-Control-Allow-Methods: POST, GET, OPTIONS - Access-Control-Max-Age: 86400 """ if cherrypy.config.get(''enable_cors'') is True: if cherrypy.request.method.upper() == "OPTIONS": cherrypy.response.headers[''Access-Control-Allow-Origin''] = cherrypy.config.get(''cors_domains'') cherrypy.response.headers[''Access-Control-Allow-Methods''] = ''POST, GET, OPTIONS'' cherrypy.response.headers[''Access-Control-Max-Age''] = ''86400'' # Stop execution cherrypy.response.body = None cherrypy.response.status = 200 cherrypy.response.finalize() # And NOW stop doing anything else...

Alternativas que probablemente no funcionan

Sé que hay un complemento de cherrypy-cors , pero desde la fuente no puedo ver cómo esto detiene la ejecución.

También sé que CherryPy tiene un MethodDispatcher, pero eso significaría una reescritura completa de nuestro código.

Buscando Stackoverflow encontré esta respuesta, sin embargo, no quiero "matar" la ejecución, solo quiero una forma de evitar que se llame al controlador.