mirror of https://github.com/mitsuhiko/flask.git
Armin Ronacher
15 years ago
4 changed files with 79 additions and 62 deletions
@ -0,0 +1,74 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
""" |
||||||
|
flask.templating |
||||||
|
~~~~~~~~~~~~~~~~ |
||||||
|
|
||||||
|
Implements the bridge to Jinja2. |
||||||
|
|
||||||
|
:copyright: (c) 2010 by Armin Ronacher. |
||||||
|
:license: BSD, see LICENSE for more details. |
||||||
|
""" |
||||||
|
from jinja2 import BaseLoader, FileSystemLoader, TemplateNotFound |
||||||
|
|
||||||
|
from flask.globals import _request_ctx_stack |
||||||
|
|
||||||
|
|
||||||
|
class _DispatchingJinjaLoader(BaseLoader): |
||||||
|
"""A loader that looks for templates in the application and all |
||||||
|
the module folders. |
||||||
|
""" |
||||||
|
|
||||||
|
def __init__(self, app): |
||||||
|
self.app = app |
||||||
|
|
||||||
|
def get_source(self, environment, template): |
||||||
|
name = template |
||||||
|
loader = None |
||||||
|
try: |
||||||
|
module, name = template.split('/', 1) |
||||||
|
loader = self.app.modules[module].jinja_loader |
||||||
|
except (ValueError, KeyError): |
||||||
|
pass |
||||||
|
if loader is None: |
||||||
|
loader = self.app.jinja_loader |
||||||
|
try: |
||||||
|
return loader.get_source(environment, name) |
||||||
|
except TemplateNotFound: |
||||||
|
# re-raise the exception with the correct fileame here. |
||||||
|
# (the one that includes the prefix) |
||||||
|
raise TemplateNotFound(template) |
||||||
|
|
||||||
|
def list_templates(self): |
||||||
|
result = self.app.jinja_loader.list_templates() |
||||||
|
for name, module in self.app.modules.iteritems(): |
||||||
|
if module.jinja_loader is not None: |
||||||
|
for template in module.jinja_loader.list_templates(): |
||||||
|
result.append('%s/%s' % (name, template)) |
||||||
|
return result |
||||||
|
|
||||||
|
|
||||||
|
def render_template(template_name, **context): |
||||||
|
"""Renders a template from the template folder with the given |
||||||
|
context. |
||||||
|
|
||||||
|
:param template_name: the name of the template to be rendered |
||||||
|
:param context: the variables that should be available in the |
||||||
|
context of the template. |
||||||
|
""" |
||||||
|
ctx = _request_ctx_stack.top |
||||||
|
ctx.app.update_template_context(context) |
||||||
|
return ctx.app.jinja_env.get_template(template_name).render(context) |
||||||
|
|
||||||
|
|
||||||
|
def render_template_string(source, **context): |
||||||
|
"""Renders a template from the given template source string |
||||||
|
with the given context. |
||||||
|
|
||||||
|
:param template_name: the sourcecode of the template to be |
||||||
|
rendered |
||||||
|
:param context: the variables that should be available in the |
||||||
|
context of the template. |
||||||
|
""" |
||||||
|
ctx = _request_ctx_stack.top |
||||||
|
ctx.app.update_template_context(context) |
||||||
|
return ctx.app.jinja_env.from_string(source).render(context) |
Loading…
Reference in new issue