def test_multiple_filters(): with flask_app.test_request_context('/'): response = multiple_filter_view() eq_(response, 'This is an error message.') eq_([noop_filter], filters.get_filters_before_run()) # APPLY FILTERS CORRECTLY USING VIEW DECORATOR def another_noop_filter(): yield yield None ok_(False) # we shouldn't get here _view = filters.make_view_decorator(flask_app, '/', noop_filter, another_noop_filter) @_view('', 'GET') def reusable_decorator_view(): return 'This view is wrapped with a reusable view decorator.' @_view('one_off', 'GET', filters=[response_filter]) def one_off_filter_view(): return 'This view adds a one-off filter to a reusable decorator.' def test_reusable_decorator(): with flask_app.test_request_context('/'): response = reusable_decorator_view() eq_(response, 'This view is wrapped with a reusable view decorator.') eq_([noop_filter, another_noop_filter], filters.get_filters_before_run())
def json_filter(): """ Filter that wraps a Flask view that returns a Python dict and serializes that dict as JSON. Refuses to run after hello_world_filter. """ if hasattr(g, 'message') and g.message: yield abort(418) data = yield yield jsonify(data) # Create a decorator that registers view functions against flask_app in the # root URL namespace, and also wraps each view with hello_world_filter _view = make_view_decorator(flask_app, '/', hello_world_filter) @_view('', 'GET') def hello_world(): """ Displays a simple HTML "Hello, world!" Order of execution: 1. The hello_world_filter sets g.message to "Hello, world!", then yields. 2. This view runs, returning a dict. 3. The hello_world_filter resumes (and does nothing). """ html_links = '''<p><a href="/json">JSON</a></p> <p><a href="/error">error</a></p>''' return g.message + html_links
with flask_app.test_request_context('/'): response = multiple_filter_view() eq_(response, 'This is an error message.') eq_([noop_filter], filters.get_filters_before_run()) # APPLY FILTERS CORRECTLY USING VIEW DECORATOR def another_noop_filter(): yield yield None ok_(False) # we shouldn't get here _view = filters.make_view_decorator(flask_app, '/', noop_filter, another_noop_filter) @_view('', 'GET') def reusable_decorator_view(): return 'This view is wrapped with a reusable view decorator.' @_view('one_off', 'GET', filters=[response_filter]) def one_off_filter_view(): return 'This view adds a one-off filter to a reusable decorator.' def test_reusable_decorator(): with flask_app.test_request_context('/'): response = reusable_decorator_view()