don't cache error handlers for exception mro

closes #2267, closes #1433
This commit is contained in:
David Lord 2017-06-05 06:24:08 -07:00
parent 5c12acefbb
commit b5f4c52150
No known key found for this signature in database
GPG key ID: 7A1C87E3F5BC42A8
2 changed files with 15 additions and 15 deletions

View file

@ -1484,32 +1484,28 @@ class Flask(_PackageBoundObject):
return f
def _find_error_handler(self, e):
"""Find a registered error handler for a request in this order:
"""Return a registered error handler for an exception in this order:
blueprint handler for a specific code, app handler for a specific code,
blueprint generic HTTPException handler, app generic HTTPException handler,
and returns None if a suitable handler is not found.
blueprint handler for an exception class, app handler for an exception
class, or ``None`` if a suitable handler is not found.
"""
exc_class, code = self._get_exc_class_and_code(type(e))
def find_handler(handler_map):
for name, c in (
(request.blueprint, code), (None, code),
(request.blueprint, None), (None, None)
):
handler_map = self.error_handler_spec.setdefault(name, {}).get(c)
if not handler_map:
return
continue
for cls in exc_class.__mro__:
handler = handler_map.get(cls)
if handler is not None:
# cache for next time exc_class is raised
handler_map[exc_class] = handler
return handler
# check for any in blueprint or app
for name, c in ((request.blueprint, code), (None, code),
(request.blueprint, None), (None, None)):
handler = find_handler(self.error_handler_spec.get(name, {}).get(c))
if handler:
return handler
def handle_http_exception(self, e):
"""Handles an HTTP exception. By default this will invoke the
registered error handlers and fall back to returning the