Skip to content

Commit 9409be6

Browse files
davidismpgjones
authored andcommitted
warn when registering same blueprint with same name
1 parent 63b3067 commit 9409be6

File tree

3 files changed

+34
-17
lines changed

3 files changed

+34
-17
lines changed

CHANGES.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ Unreleased
3333
- ``register_blueprint`` takes a ``name`` option to change the
3434
(pre-dotted) name the blueprint is registered with. This allows the
3535
same blueprint to be registered multiple times with unique names for
36-
``url_for``. :issue:`1091`
36+
``url_for``. Registering the same blueprint with the same name
37+
multiple times is deprecated. :issue:`1091`
3738

3839

3940
Version 2.0.0

src/flask/blueprints.py

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -283,23 +283,35 @@ def register(self, app: "Flask", options: dict) -> None:
283283
name the blueprint is registered with. This allows the same
284284
blueprint to be registered multiple times with unique names
285285
for ``url_for``.
286-
"""
287-
first_registration = True
288-
289-
for blueprint in app.blueprints.values():
290-
if blueprint is self:
291-
first_registration = False
292286
287+
.. versionchanged:: 2.0.1
288+
Registering the same blueprint with the same name multiple
289+
times is deprecated and will become an error in Flask 2.1.
290+
"""
291+
first_registration = not any(bp is self for bp in app.blueprints.values())
293292
name_prefix = options.get("name_prefix", "")
294293
self_name = options.get("name", self.name)
295294
name = f"{name_prefix}.{self_name}".lstrip(".")
296295

297-
if name in app.blueprints and app.blueprints[name] is not self:
298-
raise ValueError(
299-
f"Blueprint name '{self.name}' "
300-
f"is already registered by {app.blueprints[self.name]}. "
301-
"Blueprints must have unique names."
302-
)
296+
if name in app.blueprints:
297+
existing_at = f" '{name}'" if self_name != name else ""
298+
299+
if app.blueprints[name] is not self:
300+
raise ValueError(
301+
f"The name '{self_name}' is already registered for"
302+
f" a different blueprint{existing_at}. Use 'name='"
303+
" to provide a unique name."
304+
)
305+
else:
306+
import warnings
307+
308+
warnings.warn(
309+
f"The name '{self_name}' is already registered for"
310+
f" this blueprint{existing_at}. Use 'name=' to"
311+
" provide a unique name. This will become an error"
312+
" in Flask 2.1.",
313+
stacklevel=4,
314+
)
303315

304316
app.blueprints[name] = self
305317
self._got_registered_once = True

tests/test_blueprints.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ def bar(bar):
140140
return str(bar)
141141

142142
app.register_blueprint(bp, url_prefix="/1", url_defaults={"bar": 23})
143-
app.register_blueprint(bp, url_prefix="/2", url_defaults={"bar": 19})
143+
app.register_blueprint(bp, name="test2", url_prefix="/2", url_defaults={"bar": 19})
144144

145145
assert client.get("/1/foo").data == b"23/42"
146146
assert client.get("/2/foo").data == b"19/42"
@@ -873,9 +873,13 @@ def test_unique_blueprint_names(app, client) -> None:
873873
bp2 = flask.Blueprint("bp", __name__)
874874

875875
app.register_blueprint(bp)
876-
app.register_blueprint(bp) # same name, same object, no error
876+
877+
with pytest.warns(UserWarning):
878+
app.register_blueprint(bp) # same bp, same name, warning
879+
880+
app.register_blueprint(bp, name="again") # same bp, different name, ok
877881

878882
with pytest.raises(ValueError):
879-
app.register_blueprint(bp2) # same name, different object
883+
app.register_blueprint(bp2) # different bp, same name, error
880884

881-
app.register_blueprint(bp2, name="alt") # different name
885+
app.register_blueprint(bp2, name="alt") # different bp, different name, ok

0 commit comments

Comments
 (0)