55from logging import Logger
66from typing import TYPE_CHECKING , Any , cast
77
8+ from jinja2 import Template
89from jinja2 .exceptions import TemplateNotFound
910
1011from jupyter_server .base .handlers import FileFindHandler
@@ -21,13 +22,14 @@ class ExtensionHandlerJinjaMixin:
2122 template rendering.
2223 """
2324
24- def get_template (self , name : str ) -> str :
25+ def get_template (self , name : str ) -> Template :
2526 """Return the jinja template object for a given name"""
2627 try :
2728 env = f"{ self .name } _jinja2_env" # type:ignore[attr-defined]
28- return cast (str , self .settings [env ].get_template (name )) # type:ignore[attr-defined]
29+ template = cast (Template , self .settings [env ].get_template (name )) # type:ignore[attr-defined]
30+ return template
2931 except TemplateNotFound :
30- return cast (str , super ().get_template (name )) # type:ignore[misc]
32+ return cast (Template , super ().get_template (name )) # type:ignore[misc]
3133
3234
3335class ExtensionHandlerMixin :
@@ -81,6 +83,20 @@ def server_config(self) -> Config:
8183 def base_url (self ) -> str :
8284 return cast (str , self .settings .get ("base_url" , "/" ))
8385
86+ def render_template (self , name : str , ** ns ) -> str :
87+ """Override render template to handle static_paths
88+
89+ If render_template is called with a template from the base environment
90+ (e.g. default error pages)
91+ make sure our extension-specific static_url is _not_ used.
92+ """
93+ template = cast (Template , self .get_template (name )) # type:ignore[attr-defined]
94+ ns .update (self .template_namespace ) # type:ignore[attr-defined]
95+ if template .environment is self .settings ["jinja2_env" ]:
96+ # default template environment, use default static_url
97+ ns ["static_url" ] = super ().static_url # type:ignore[misc]
98+ return cast (str , template .render (** ns ))
99+
84100 @property
85101 def static_url_prefix (self ) -> str :
86102 return self .extensionapp .static_url_prefix
0 commit comments