La mia domandainterrompere l'elaborazione richiesta in CherryPy e restituire 200 risposta da uno strumento
Sto cercando un modo per fermare richiesta di trasformazione in uno strumento senza sollevare un'eccezione. In altre parole: voglio interrompere la richiesta prima che arrivi al controller specificato e restituisca un codice di stato 2xx?
Sfondo
vogliamo che la nostra applicazione per supportare CORS e quindi la richiesta di verifica preliminare. L'idea era di scrivere uno strumento che agganci before_handler
. Se viene effettuata una richiesta OPZIONI, restituire le intestazioni CORS pertinenti ed uscire.
Il problema è che non ho trovato un modo per interrompere il flusso di esecuzione. Ciò significa che l'URL originale viene elaborato, come sarebbe se richiesto normalmente. Il punto è: questo potrebbe portare a problemi di sicurezza, poiché la richiesta di verifica preliminare è sempre fatta. Questo è quello che ho finora:
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...
Alternative probabilmente non funziona
So che c'è un plugin cherrypy-cors, ma dalla fonte non riesco a vedere come questo interrompe l'esecuzione.
So anche che CherryPy ha un MethodDispatcher, ma ciò significherebbe una completa riscrittura del nostro codice.
Ricerca in StackOverflow Ho trovato la risposta this, tuttavia non voglio "uccidere" l'esecuzione, voglio solo un modo per impedire che venga chiamato il gestore.
vedere HandlerTool esempio in cherrypy [wiki] (http://tools.cherrypy.org/wiki/HandlerTool) – meuh