Skip to content

Commit b2aae04

Browse files
committed
Flash messages signals
If we send a signal when a template is rendered why not when a message is flashed? One real world use case is in tests, this signal should make flash messages expectation easier to implement.
1 parent bfeee75 commit b2aae04

File tree

4 files changed

+32
-1
lines changed

4 files changed

+32
-1
lines changed

flask/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
# the signals
3535
from .signals import signals_available, template_rendered, request_started, \
3636
request_finished, got_request_exception, request_tearing_down, \
37-
appcontext_tearing_down
37+
appcontext_tearing_down, message_flashed
3838

3939
# We're not exposing the actual json module but a convenient wrapper around
4040
# it.

flask/helpers.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535

3636
from jinja2 import FileSystemLoader
3737

38+
from .signals import message_flashed
3839
from .globals import session, _request_ctx_stack, _app_ctx_stack, \
3940
current_app, request
4041

@@ -361,6 +362,8 @@ def flash(message, category='message'):
361362
flashes = session.get('_flashes', [])
362363
flashes.append((category, message))
363364
session['_flashes'] = flashes
365+
message_flashed.send(current_app._get_current_object(),
366+
message=message, category=category)
364367

365368

366369
def get_flashed_messages(with_categories=False, category_filter=[]):

flask/signals.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,4 @@ def _fail(self, *args, **kwargs):
5050
request_tearing_down = _signals.signal('request-tearing-down')
5151
got_request_exception = _signals.signal('got-request-exception')
5252
appcontext_tearing_down = _signals.signal('appcontext-tearing-down')
53+
message_flashed = _signals.signal('message-flashed')

flask/testsuite/signals.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
:copyright: (c) 2011 by Armin Ronacher.
99
:license: BSD, see LICENSE for more details.
1010
"""
11+
from __future__ import with_statement
12+
1113
import flask
1214
import unittest
1315
from flask.testsuite import FlaskTestCase
@@ -95,6 +97,31 @@ def record(sender, exception):
9597
finally:
9698
flask.got_request_exception.disconnect(record, app)
9799

100+
def test_flash_signal(self):
101+
app = flask.Flask(__name__)
102+
app.config['SECRET_KEY'] = 'secret'
103+
104+
@app.route('/')
105+
def index():
106+
flask.flash('This is a flash message', category='notice')
107+
return flask.redirect('/other')
108+
109+
recorded = []
110+
def record(sender, message, category):
111+
recorded.append((message, category))
112+
113+
flask.message_flashed.connect(record, app)
114+
try:
115+
client = app.test_client()
116+
with client.session_transaction():
117+
client.get('/')
118+
self.assert_equal(len(recorded), 1)
119+
message, category = recorded[0]
120+
self.assert_equal(message, 'This is a flash message')
121+
self.assert_equal(category, 'notice')
122+
finally:
123+
flask.message_flashed.disconnect(record, app)
124+
98125

99126
def suite():
100127
suite = unittest.TestSuite()

0 commit comments

Comments
 (0)