65 lines
2.1 KiB
Python
65 lines
2.1 KiB
Python
|
|
from jinja2 import Environment, Template
|
|
|
|
from matemat import __version__
|
|
|
|
|
|
class PageletResponse:
|
|
"""
|
|
Base class for pagelet return values that require more action than simply sending plain data.
|
|
|
|
An instance of this base class will result in an empty 200 OK response.
|
|
"""
|
|
|
|
def __init__(self, status: int = 200) -> None:
|
|
"""
|
|
Create an empty response.
|
|
|
|
:param status: The HTTP status code, defaults to 200 (OK).
|
|
"""
|
|
self.status: int = status
|
|
|
|
|
|
class RedirectResponse(PageletResponse):
|
|
"""
|
|
A pagelet response that causes the server to redirect to another location, using a 301 Permanently Moved (uncached)
|
|
response status, and a Location header.
|
|
"""
|
|
|
|
def __init__(self, location: str) -> None:
|
|
"""
|
|
Create a redirection response with the given redirection location.
|
|
|
|
:param location: The location to redirect to.
|
|
"""
|
|
super().__init__(status=301)
|
|
self.location: str = location
|
|
|
|
|
|
class TemplateResponse(PageletResponse):
|
|
"""
|
|
A pagelet response that causes the server to load a Jinja2 template and render it with the provided arguments, then
|
|
sending the result as response body, with a 200 OK response status.
|
|
"""
|
|
|
|
def __init__(self, name: str, **kwargs) -> None:
|
|
"""
|
|
Create a template response with the given template name and arguments.
|
|
|
|
:param name: Name of the template to load.
|
|
:param kwargs: Arguments for rendering the template, will be passed to jinja2.Template.render as is.
|
|
"""
|
|
super().__init__()
|
|
self.name: str = name
|
|
self.kwargs = kwargs
|
|
|
|
def _render(self, jinja_env: Environment) -> bytes:
|
|
"""
|
|
Load and render the template using the Jinja2 environment managed by the web server instance. This method
|
|
should not be called by a pagelet.
|
|
|
|
:param jinja_env: The Jinja2 environment.
|
|
:return: An UTF-8 encoded bytes object containing the template rendering result.
|
|
"""
|
|
template: Template = jinja_env.get_template(self.name)
|
|
return template.render(**self.kwargs, __version__=__version__).encode('utf-8')
|