]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
web: Improve typing for UIModule.render
authorBen Darnell <ben@bendarnell.com>
Fri, 7 Jun 2024 19:23:45 +0000 (15:23 -0400)
committerBen Darnell <ben@bendarnell.com>
Fri, 7 Jun 2024 19:23:45 +0000 (15:23 -0400)
In practice, UIModule.render often returns the
result of self.render_string, which returns bytes.
In fact, we have an example of that in this file
which had a type ignore comment. UIModule.render
may now return either str or bytes and downstream
code is responsible for handling this. (Note that
the new call to _unicode appears to be redundant
since the Template module's bytes return was
already working correctly, but this conversion is
necessary to satisfy the type checker.)

Fixes #3050

tornado/web.py

index 207b5ddd0b7272d5ba042899d7323c2ff14b2077..3a85bc41f11e48b8bd357c26c3e9943d9b6d2614 100644 (file)
@@ -1894,7 +1894,7 @@ class RequestHandler(object):
             if name not in self._active_modules:
                 self._active_modules[name] = module(self)
             rendered = self._active_modules[name].render(*args, **kwargs)
-            return rendered
+            return _unicode(rendered)
 
         return render
 
@@ -3331,7 +3331,7 @@ class UIModule(object):
     def current_user(self) -> Any:
         return self.handler.current_user
 
-    def render(self, *args: Any, **kwargs: Any) -> str:
+    def render(self, *args: Any, **kwargs: Any) -> Union[str, bytes]:
         """Override in subclasses to return this module's output."""
         raise NotImplementedError()
 
@@ -3379,12 +3379,12 @@ class UIModule(object):
 
 
 class _linkify(UIModule):
-    def render(self, text: str, **kwargs: Any) -> str:  # type: ignore
+    def render(self, text: str, **kwargs: Any) -> str:
         return escape.linkify(text, **kwargs)
 
 
 class _xsrf_form_html(UIModule):
-    def render(self) -> str:  # type: ignore
+    def render(self) -> str:
         return self.handler.xsrf_form_html()
 
 
@@ -3410,7 +3410,7 @@ class TemplateModule(UIModule):
         self._resource_list = []  # type: List[Dict[str, Any]]
         self._resource_dict = {}  # type: Dict[str, Dict[str, Any]]
 
-    def render(self, path: str, **kwargs: Any) -> bytes:  # type: ignore
+    def render(self, path: str, **kwargs: Any) -> bytes:
         def set_resources(**kwargs) -> str:  # type: ignore
             if path not in self._resource_dict:
                 self._resource_list.append(kwargs)