Raise exceptions if a function is overridden by a new endpoint. This fixes #570
This commit is contained in:
parent
e2b3f07d7c
commit
661ee54bc2
3 changed files with 23 additions and 1 deletions
|
|
@ -942,8 +942,13 @@ class Flask(_PackageBoundObject):
|
||||||
|
|
||||||
rule = self.url_rule_class(rule, methods=methods, **options)
|
rule = self.url_rule_class(rule, methods=methods, **options)
|
||||||
rule.provide_automatic_options = provide_automatic_options
|
rule.provide_automatic_options = provide_automatic_options
|
||||||
|
|
||||||
self.url_map.add(rule)
|
self.url_map.add(rule)
|
||||||
if view_func is not None:
|
if view_func is not None:
|
||||||
|
old_func = self.view_functions.get(endpoint)
|
||||||
|
if old_func is not None and old_func is not view_func:
|
||||||
|
raise AssertionError('View function mapping is overwriting an '
|
||||||
|
'existing endpoint function: %s' % endpoint)
|
||||||
self.view_functions[endpoint] = view_func
|
self.view_functions[endpoint] = view_func
|
||||||
|
|
||||||
def route(self, rule, **options):
|
def route(self, rule, **options):
|
||||||
|
|
|
||||||
|
|
@ -387,7 +387,7 @@ class BasicFunctionalityTestCase(FlaskTestCase):
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
@app.route('/test_filters_without_returning_categories/')
|
@app.route('/test_filters_without_returning_categories/')
|
||||||
def test_filters():
|
def test_filters2():
|
||||||
messages = flask.get_flashed_messages(category_filter=['message', 'warning'])
|
messages = flask.get_flashed_messages(category_filter=['message', 'warning'])
|
||||||
self.assert_equal(len(messages), 2)
|
self.assert_equal(len(messages), 2)
|
||||||
self.assert_equal(messages[0], u'Hello World')
|
self.assert_equal(messages[0], u'Hello World')
|
||||||
|
|
|
||||||
|
|
@ -145,6 +145,23 @@ class ViewTestCase(FlaskTestCase):
|
||||||
self.assert_equal(rv.data, '')
|
self.assert_equal(rv.data, '')
|
||||||
self.assert_equal(rv.headers['X-Method'], 'HEAD')
|
self.assert_equal(rv.headers['X-Method'], 'HEAD')
|
||||||
|
|
||||||
|
def test_endpoint_override(self):
|
||||||
|
app = flask.Flask(__name__)
|
||||||
|
app.debug = True
|
||||||
|
|
||||||
|
class Index(flask.views.View):
|
||||||
|
methods = ['GET', 'POST']
|
||||||
|
def dispatch_request(self):
|
||||||
|
return flask.request.method
|
||||||
|
|
||||||
|
app.add_url_rule('/', view_func=Index.as_view('index'))
|
||||||
|
|
||||||
|
with self.assert_raises(AssertionError):
|
||||||
|
app.add_url_rule('/', view_func=Index.as_view('index'))
|
||||||
|
|
||||||
|
# But these tests should still pass. We just log a warning.
|
||||||
|
self.common_test(app)
|
||||||
|
|
||||||
|
|
||||||
def suite():
|
def suite():
|
||||||
suite = unittest.TestSuite()
|
suite = unittest.TestSuite()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue