diff --git a/CHANGES.rst b/CHANGES.rst index 049c7f6f..a50bc18d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -20,9 +20,12 @@ Unreleased - ``json_encoder`` and ``json_decoder`` attributes on app and blueprint, and the corresponding ``json.JSONEncoder`` and ``JSONDecoder`` classes, are removed. - The ``json.htmlsafe_dumps`` and ``htmlsafe_dump`` functions are removed. + - Calling setup methods on blueprints after registration is an error instead of a + warning. :pr:`4997` - Importing ``escape`` and ``Markup`` from ``flask`` is deprecated. Import them directly from ``markupsafe`` instead. :pr:`4996` +- The ``app.got_first_request`` property is deprecated. :pr:`4997` - Use modern packaging metadata with ``pyproject.toml`` instead of ``setup.cfg``. :pr:`4947` - Ensure subdomains are applied with nested blueprints. :issue:`4834` diff --git a/src/flask/app.py b/src/flask/app.py index 642d75c1..493934d5 100644 --- a/src/flask/app.py +++ b/src/flask/app.py @@ -8,7 +8,6 @@ import weakref from collections.abc import Iterator as _abc_Iterator from datetime import timedelta from itertools import chain -from threading import Lock from types import TracebackType import click @@ -496,7 +495,6 @@ class Flask(Scaffold): # tracks internally if the application already handled at least one # request. self._got_first_request = False - self._before_request_lock = Lock() # Add a static route using the provided static_url_path, static_host, # and static_folder if there is a configured static_folder. @@ -592,8 +590,18 @@ class Flask(Scaffold): """This attribute is set to ``True`` if the application started handling the first request. + .. deprecated:: 2.3 + Will be removed in Flask 2.4. + .. versionadded:: 0.8 """ + import warnings + + warnings.warn( + "'got_first_request' is deprecated and will be removed in Flask 2.4.", + DeprecationWarning, + stacklevel=2, + ) return self._got_first_request def make_config(self, instance_relative: bool = False) -> Config: diff --git a/src/flask/blueprints.py b/src/flask/blueprints.py index 51f72279..eb50585d 100644 --- a/src/flask/blueprints.py +++ b/src/flask/blueprints.py @@ -207,19 +207,12 @@ class Blueprint(Scaffold): def _check_setup_finished(self, f_name: str) -> None: if self._got_registered_once: - import warnings - - warnings.warn( - f"The setup method '{f_name}' can no longer be called on" - f" the blueprint '{self.name}'. It has already been" - " registered at least once, any changes will not be" - " applied consistently.\n" - "Make sure all imports, decorators, functions, etc." - " needed to set up the blueprint are done before" - " registering it.\n" - "This warning will become an exception in Flask 2.3.", - UserWarning, - stacklevel=3, + raise AssertionError( + f"The setup method '{f_name}' can no longer be called on the blueprint" + f" '{self.name}'. It has already been registered at least once, any" + " changes will not be applied consistently.\n" + "Make sure all imports, decorators, functions, etc. needed to set up" + " the blueprint are done before registering it." ) @setupmethod diff --git a/tests/test_basic.py b/tests/test_basic.py index 9c9d83e7..1add8f01 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -1657,7 +1657,6 @@ def test_no_setup_after_first_request(app, client): def index(): return "Awesome" - assert not app.got_first_request assert client.get("/").data == b"Awesome" with pytest.raises(AssertionError) as exc_info: