Skip to content

Commit 89b47e0

Browse files
authored
add context on route during evaluation (#5342)
1 parent eaaffac commit 89b47e0

File tree

1 file changed

+63
-47
lines changed

1 file changed

+63
-47
lines changed

reflex/compiler/compiler.py

Lines changed: 63 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from __future__ import annotations
44

5+
import sys
56
from collections.abc import Iterable, Sequence
67
from datetime import datetime
78
from inspect import getmodule
@@ -685,12 +686,13 @@ def into_component(component: Component | ComponentCallable) -> Component:
685686
"""
686687
if (converted := _into_component_once(component)) is not None:
687688
return converted
689+
if not callable(component):
690+
raise TypeError(
691+
f"Expected a Component or callable, got {component!r} of type {type(component)}"
692+
)
693+
688694
try:
689-
if (
690-
callable(component)
691-
and (converted := _into_component_once(component())) is not None
692-
):
693-
return converted
695+
component_called = component()
694696
except KeyError as e:
695697
if isinstance(e, ReflexError):
696698
raise
@@ -727,7 +729,12 @@ def into_component(component: Component | ComponentCallable) -> Component:
727729
).with_traceback(e.__traceback__) from None
728730
raise
729731

730-
raise TypeError(f"Expected a Component, got {type(component)}")
732+
if (converted := _into_component_once(component_called)) is not None:
733+
return converted
734+
735+
raise TypeError(
736+
f"Expected a Component, got {component_called!r} of type {type(component_called)}"
737+
)
731738

732739

733740
def compile_unevaluated_page(
@@ -748,52 +755,61 @@ def compile_unevaluated_page(
748755
749756
Returns:
750757
The compiled component and whether state should be enabled.
758+
759+
Raises:
760+
Exception: If an error occurs while evaluating the page.
751761
"""
752-
# Generate the component if it is a callable.
753-
component = into_component(page.component)
762+
try:
763+
# Generate the component if it is a callable.
764+
component = into_component(page.component)
754765

755-
component._add_style_recursive(style or {}, theme)
766+
component._add_style_recursive(style or {}, theme)
756767

757-
enable_state = False
758-
# Ensure state is enabled if this page uses state.
759-
if state is None:
760-
if page.on_load or component._has_stateful_event_triggers():
761-
enable_state = True
762-
else:
763-
for var in component._get_vars(include_children=True):
764-
var_data = var._get_all_var_data()
765-
if not var_data:
766-
continue
767-
if not var_data.state:
768-
continue
768+
enable_state = False
769+
# Ensure state is enabled if this page uses state.
770+
if state is None:
771+
if page.on_load or component._has_stateful_event_triggers():
769772
enable_state = True
770-
break
771-
772-
from reflex.app import OverlayFragment
773-
from reflex.utils.format import make_default_page_title
774-
775-
component = OverlayFragment.create(component)
776-
777-
meta_args = {
778-
"title": (
779-
page.title
780-
if page.title is not None
781-
else make_default_page_title(get_config().app_name, route)
782-
),
783-
"image": page.image,
784-
"meta": page.meta,
785-
}
786-
787-
if page.description is not None:
788-
meta_args["description"] = page.description
789-
790-
# Add meta information to the component.
791-
utils.add_meta(
792-
component,
793-
**meta_args,
794-
)
773+
else:
774+
for var in component._get_vars(include_children=True):
775+
var_data = var._get_all_var_data()
776+
if not var_data:
777+
continue
778+
if not var_data.state:
779+
continue
780+
enable_state = True
781+
break
782+
783+
from reflex.app import OverlayFragment
784+
from reflex.utils.format import make_default_page_title
785+
786+
component = OverlayFragment.create(component)
787+
788+
meta_args = {
789+
"title": (
790+
page.title
791+
if page.title is not None
792+
else make_default_page_title(get_config().app_name, route)
793+
),
794+
"image": page.image,
795+
"meta": page.meta,
796+
}
797+
798+
if page.description is not None:
799+
meta_args["description"] = page.description
800+
801+
# Add meta information to the component.
802+
utils.add_meta(
803+
component,
804+
**meta_args,
805+
)
795806

796-
return component, enable_state
807+
except Exception as e:
808+
if sys.version_info >= (3, 11):
809+
e.add_note(f"Happened while evaluating page {route!r}")
810+
raise
811+
else:
812+
return component, enable_state
797813

798814

799815
class ExecutorSafeFunctions:

0 commit comments

Comments
 (0)