diff --git a/CHANGES b/CHANGES index cb0579cb..357b289d 100644 --- a/CHANGES +++ b/CHANGES @@ -112,6 +112,7 @@ Major release, unreleased ``app.debug`` each time. Only one format is used, not different ones depending on ``app.debug``. No handlers are removed, and a handler is only added if no handlers are already configured. (`#2436`_) +- Blueprint view function name may not contain dots. (`#2450`_) .. _#1421: https://github.com/pallets/flask/issues/1421 .. _#1489: https://github.com/pallets/flask/pull/1489 @@ -144,6 +145,7 @@ Major release, unreleased .. _#2416: https://github.com/pallets/flask/pull/2416 .. _#2430: https://github.com/pallets/flask/pull/2430 .. _#2436: https://github.com/pallets/flask/pull/2436 +.. _#2450: https://github.com/pallets/flask/pull/2450 Version 0.12.2 -------------- diff --git a/flask/blueprints.py b/flask/blueprints.py index 80668dbe..4c9938e2 100644 --- a/flask/blueprints.py +++ b/flask/blueprints.py @@ -198,6 +198,8 @@ class Blueprint(_PackageBoundObject): """ if endpoint: assert '.' not in endpoint, "Blueprint endpoints should not contain dots" + if view_func: + assert '.' not in view_func.__name__, "Blueprint view function name should not contain dots" self.record(lambda s: s.add_url_rule(rule, endpoint, view_func, **options)) diff --git a/tests/test_blueprints.py b/tests/test_blueprints.py index d57b3034..c58a0d3b 100644 --- a/tests/test_blueprints.py +++ b/tests/test_blueprints.py @@ -360,6 +360,15 @@ def test_route_decorator_custom_endpoint_with_dots(app, client): lambda: None ) + foo_foo_foo.__name__ = 'bar.123' + + pytest.raises( + AssertionError, + lambda: bp.add_url_rule( + '/bar/123', view_func=foo_foo_foo + ) + ) + app.register_blueprint(bp, url_prefix='/py') assert client.get('/py/foo').data == b'bp.foo'