From 3257b7574e7f010686a617197e0fb4596986f7f7 Mon Sep 17 00:00:00 2001 From: pgjones Date: Fri, 21 May 2021 15:02:05 +0100 Subject: [PATCH] Fix blueprint renaming This ensures that if a blueprint is renamed at the time of registration that name is used when constructing endpoints, as expected. --- src/flask/blueprints.py | 4 +++- tests/test_blueprints.py | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/flask/blueprints.py b/src/flask/blueprints.py index 2da4d12b60..f3913b30ce 100644 --- a/src/flask/blueprints.py +++ b/src/flask/blueprints.py @@ -67,6 +67,7 @@ def __init__( #: blueprint. self.url_prefix = url_prefix + self.name = self.options.get("name", blueprint.name) self.name_prefix = self.options.get("name_prefix", "") #: A dictionary with URL defaults that is added to each and every @@ -96,9 +97,10 @@ def add_url_rule( defaults = self.url_defaults if "defaults" in options: defaults = dict(defaults, **options.pop("defaults")) + self.app.add_url_rule( rule, - f"{self.name_prefix}.{self.blueprint.name}.{endpoint}".lstrip("."), + f"{self.name_prefix}.{self.name}.{endpoint}".lstrip("."), view_func, defaults=defaults, **options, diff --git a/tests/test_blueprints.py b/tests/test_blueprints.py index 73c94ade39..088ad7793d 100644 --- a/tests/test_blueprints.py +++ b/tests/test_blueprints.py @@ -889,3 +889,25 @@ def test_self_registration(app, client) -> None: bp = flask.Blueprint("bp", __name__) with pytest.raises(ValueError): bp.register_blueprint(bp) + + +def test_blueprint_renaming(app, client) -> None: + bp = flask.Blueprint("bp", __name__) + bp2 = flask.Blueprint("bp2", __name__) + + @bp.get("/") + def index(): + return flask.request.endpoint + + @bp2.get("/") + def index2(): + return flask.request.endpoint + + bp.register_blueprint(bp2, url_prefix="/a", name="sub") + app.register_blueprint(bp, url_prefix="/a") + app.register_blueprint(bp, url_prefix="/b", name="alt") + + assert client.get("/a/").data == b"bp.index" + assert client.get("/b/").data == b"alt.index" + assert client.get("/a/a/").data == b"bp.sub.index2" + assert client.get("/b/a/").data == b"alt.sub.index2"