From af08103484551874a5f0d4683ea3723d328a190c Mon Sep 17 00:00:00 2001 From: brettlangdon Date: Mon, 28 Nov 2016 16:14:34 -0500 Subject: [PATCH] Allow calling after_request outside of request context --- CHANGELOG | 11 ++++++++++- README.rst | 4 ++++ flask_defer.py | 8 +++++++- test_flask_defer.py | 6 +++++- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 70777d2..3c7423a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,14 @@ Flask-Defer Changelog -=================== +===================== + +Version 1.0.1 +------------- + +:Released: 11-28-2016 + +:Changes: + Execute tasks immediately if we are outside of a request context + Version 1.0.0 ------------- diff --git a/README.rst b/README.rst index e66fd8f..ee4ba34 100644 --- a/README.rst +++ b/README.rst @@ -19,6 +19,10 @@ Installation Usage ~~~~~ +Passing a function and it's arguments to `flask_defer.after_request` will register that function to execute when the Flask request has ended. + +If a call to `flask_defer.after_request` happens outside of a request context then the function will be executed immediately. + .. code:: python from flask import Flask diff --git a/flask_defer.py b/flask_defer.py index 34b4bf2..e0dcf01 100644 --- a/flask_defer.py +++ b/flask_defer.py @@ -7,8 +7,14 @@ __all__ = ['after_request', 'defer', 'FlaskDefer'] def defer(func, *args, **kwargs): - params = dict(func=func, args=args, kwargs=kwargs) ctx = stack.top + + # If we are not in a request/app context, then just execute + if not ctx: + return func(*args, **kwargs) + + # We are in a request/app context, defer until request/app teardown + params = dict(func=func, args=args, kwargs=kwargs) if not hasattr(ctx, 'deferred_tasks'): setattr(ctx, 'deferred_tasks', []) ctx.deferred_tasks.append(params) diff --git a/test_flask_defer.py b/test_flask_defer.py index c08bc7c..71c9109 100644 --- a/test_flask_defer.py +++ b/test_flask_defer.py @@ -5,7 +5,7 @@ from flask_defer import FlaskDefer, defer, stack def deferred_task(name, with_keyword=False): - pass + return (name, with_keyword) class TestFlaskDefer(unittest.TestCase): @@ -114,6 +114,10 @@ class TestFlaskDefer(unittest.TestCase): kwargs=dict(with_keyword=True, extra_param='param'), )) + def test_no_app_context(self): + result = defer(deferred_task, 'name', with_keyword=True) + self.assertEqual(result, ('name', True)) + if __name__ == '__main__': unittest.main()