diff --git a/mesop/colab/colab_run.py b/mesop/colab/colab_run.py index 17df54a9f..921bdd217 100644 --- a/mesop/colab/colab_run.py +++ b/mesop/colab/colab_run.py @@ -2,12 +2,12 @@ from absl import flags -from mesop.colab import colab_utils from mesop.runtime import enable_debug_mode from mesop.server.constants import EDITOR_PACKAGE_PATH, PROD_PACKAGE_PATH from mesop.server.logging import log_startup from mesop.server.server import configure_flask_app from mesop.server.static_file_serving import configure_static_file_serving +from mesop.utils import colab_utils from mesop.utils.host_util import get_default_host diff --git a/mesop/colab/colab_run_test.py b/mesop/colab/colab_run_test.py index 57209ebe5..65d0aec1e 100644 --- a/mesop/colab/colab_run_test.py +++ b/mesop/colab/colab_run_test.py @@ -3,9 +3,9 @@ import pytest -from mesop.colab import colab_utils from mesop.colab.colab_run import colab_run from mesop.runtime import runtime +from mesop.utils import colab_utils class FakeThread: diff --git a/mesop/colab/colab_show.py b/mesop/colab/colab_show.py index 9ce7a0b0a..1aeab4605 100644 --- a/mesop/colab/colab_show.py +++ b/mesop/colab/colab_show.py @@ -1,4 +1,4 @@ -from mesop.colab import colab_utils +from mesop.utils import colab_utils def colab_show( diff --git a/mesop/runtime/BUILD b/mesop/runtime/BUILD index caa84ba62..754b574d5 100644 --- a/mesop/runtime/BUILD +++ b/mesop/runtime/BUILD @@ -12,5 +12,6 @@ py_library( "//mesop/exceptions", "//mesop/protos:ui_py_pb2", "//mesop/security", + "//mesop/utils", ] + THIRD_PARTY_PY_FLASK, ) diff --git a/mesop/runtime/runtime.py b/mesop/runtime/runtime.py index 066ea489e..6d4df8a9c 100644 --- a/mesop/runtime/runtime.py +++ b/mesop/runtime/runtime.py @@ -8,6 +8,7 @@ from mesop.exceptions import MesopDeveloperException, MesopUserException from mesop.key import Key from mesop.security.security_policy import SecurityPolicy +from mesop.utils import colab_utils from mesop.utils.backoff import exponential_backoff from .context import Context @@ -61,7 +62,15 @@ def context(self) -> Context: return g._mesop_context def create_context(self) -> Context: - self._has_served_traffic = True + # If running in prod mode, *always* enable the has served traffic safety check. + # If running in debug mode, only enable the has served traffic safety check if + # app is not running in IPython / notebook environments. + # + # We don't want to break iterative development where notebook app developers + # will want to register pages after traffic has been served. + # Unlike CLI (w/ hot reload), in notebook envs, runtime is *not* reset. + if not self.debug_mode or not colab_utils.is_running_ipython(): + self._has_served_traffic = True if len(self._state_classes) == 0: states = {EmptyState: EmptyState()} else: diff --git a/mesop/colab/colab_utils.py b/mesop/utils/colab_utils.py similarity index 100% rename from mesop/colab/colab_utils.py rename to mesop/utils/colab_utils.py