Browse Source

Merge pull request #2409 from bijanvakili/clarify-app-teardown

Clarify docs and tests for exception handling in Flask.teardown_appcontext()
pull/2412/head
David Lord 7 years ago committed by GitHub
parent
commit
817903c9c1
  1. 6
      flask/app.py
  2. 45
      tests/test_appctx.py

6
flask/app.py

@ -1484,8 +1484,10 @@ class Flask(_PackageBoundObject):
Since a request context typically also manages an application Since a request context typically also manages an application
context it would also be called when you pop a request context. context it would also be called when you pop a request context.
When a teardown function was called because of an exception it will When a teardown function was called because of an unhandled exception
be passed an error object. it will be passed an error object. If an :meth:`errorhandler` is
registered, it will handle the exception and the teardown will not
receive it.
The return values of teardown functions are ignored. The return values of teardown functions are ignored.

45
tests/test_appctx.py

@ -81,7 +81,7 @@ def test_app_tearing_down_with_previous_exception(app):
assert cleanup_stuff == [None] assert cleanup_stuff == [None]
def test_app_tearing_down_with_handled_exception(app): def test_app_tearing_down_with_handled_exception_by_except_block(app):
cleanup_stuff = [] cleanup_stuff = []
@app.teardown_appcontext @app.teardown_appcontext
@ -97,6 +97,49 @@ def test_app_tearing_down_with_handled_exception(app):
assert cleanup_stuff == [None] assert cleanup_stuff == [None]
def test_app_tearing_down_with_handled_exception_by_app_handler(app, client):
app.config['PROPAGATE_EXCEPTIONS'] = True
cleanup_stuff = []
@app.teardown_appcontext
def cleanup(exception):
cleanup_stuff.append(exception)
@app.route('/')
def index():
raise Exception('dummy')
@app.errorhandler(Exception)
def handler(f):
return flask.jsonify(str(f))
with app.app_context():
client.get('/')
assert cleanup_stuff == [None]
def test_app_tearing_down_with_unhandled_exception(app, client):
app.config['PROPAGATE_EXCEPTIONS'] = True
cleanup_stuff = []
@app.teardown_appcontext
def cleanup(exception):
cleanup_stuff.append(exception)
@app.route('/')
def index():
raise Exception('dummy')
with pytest.raises(Exception):
with app.app_context():
client.get('/')
assert len(cleanup_stuff) == 1
assert isinstance(cleanup_stuff[0], Exception)
assert str(cleanup_stuff[0]) == 'dummy'
def test_app_ctx_globals_methods(app, app_ctx): def test_app_ctx_globals_methods(app, app_ctx):
# get # get
assert flask.g.get('foo') is None assert flask.g.get('foo') is None

Loading…
Cancel
Save