forked from orbit-oss/flask
Switch away from using None as default value for the exception when tearing down a context.
When an exception has been handled when using the request / app context in a with statement, `sys.exc_info()` will still contain the exception information even though it has been handled already. The `__exit__` methods pass in `None` for the exception value in that case, which needs to be distinguisable from the default value for the `exc` parameter. Use a dedicated singleton sentinel value instead.
This commit is contained in:
parent
ec5811d0a1
commit
ec0d208bc1
4 changed files with 45 additions and 8 deletions
11
flask/app.py
11
flask/app.py
|
|
@ -38,6 +38,9 @@ from ._compat import reraise, string_types, text_type, integer_types
|
|||
# a lock used for logger initialization
|
||||
_logger_lock = Lock()
|
||||
|
||||
# a singleton sentinel value for parameter defaults
|
||||
_sentinel = object()
|
||||
|
||||
|
||||
def _make_timedelta(value):
|
||||
if not isinstance(value, timedelta):
|
||||
|
|
@ -1774,7 +1777,7 @@ class Flask(_PackageBoundObject):
|
|||
self.save_session(ctx.session, response)
|
||||
return response
|
||||
|
||||
def do_teardown_request(self, exc=None):
|
||||
def do_teardown_request(self, exc=_sentinel):
|
||||
"""Called after the actual request dispatching and will
|
||||
call every as :meth:`teardown_request` decorated function. This is
|
||||
not actually called by the :class:`Flask` object itself but is always
|
||||
|
|
@ -1785,7 +1788,7 @@ class Flask(_PackageBoundObject):
|
|||
Added the `exc` argument. Previously this was always using the
|
||||
current exception information.
|
||||
"""
|
||||
if exc is None:
|
||||
if exc is _sentinel:
|
||||
exc = sys.exc_info()[1]
|
||||
funcs = reversed(self.teardown_request_funcs.get(None, ()))
|
||||
bp = _request_ctx_stack.top.request.blueprint
|
||||
|
|
@ -1795,14 +1798,14 @@ class Flask(_PackageBoundObject):
|
|||
func(exc)
|
||||
request_tearing_down.send(self, exc=exc)
|
||||
|
||||
def do_teardown_appcontext(self, exc=None):
|
||||
def do_teardown_appcontext(self, exc=_sentinel):
|
||||
"""Called when an application context is popped. This works pretty
|
||||
much the same as :meth:`do_teardown_request` but for the application
|
||||
context.
|
||||
|
||||
.. versionadded:: 0.9
|
||||
"""
|
||||
if exc is None:
|
||||
if exc is _sentinel:
|
||||
exc = sys.exc_info()[1]
|
||||
for func in reversed(self.teardown_appcontext_funcs):
|
||||
func(exc)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue