From a3c9494f67a0e89d44f459dac9eb9d0bc9b9025b Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Sun, 4 Jul 2010 13:49:58 +0200 Subject: [PATCH] Moved templating stuff into a separate module --- flask/__init__.py | 4 +-- flask/app.py | 38 ++--------------------- flask/helpers.py | 25 --------------- flask/templating.py | 74 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 79 insertions(+), 62 deletions(-) create mode 100644 flask/templating.py diff --git a/flask/__init__.py b/flask/__init__.py index 85c8dd3fe5..f6015a6402 100644 --- a/flask/__init__.py +++ b/flask/__init__.py @@ -18,7 +18,7 @@ from flask.app import Flask, Request, Response from flask.config import Config from flask.helpers import url_for, jsonify, json_available, flash, send_file, \ - get_flashed_messages, render_template, render_template, render_template_string, \ - get_template_attribute, json + get_flashed_messages, get_template_attribute, json from flask.globals import current_app, g, request, session, _request_ctx_stack from flask.module import Module +from flask.templating import render_template, render_template_string diff --git a/flask/app.py b/flask/app.py index fc46a4a360..725e1f4c70 100644 --- a/flask/app.py +++ b/flask/app.py @@ -14,7 +14,8 @@ from datetime import timedelta, datetime from itertools import chain -from jinja2 import Environment, BaseLoader, FileSystemLoader, TemplateNotFound +from jinja2 import Environment + from werkzeug import ImmutableDict, create_environ from werkzeug.routing import Map, Rule from werkzeug.exceptions import HTTPException, InternalServerError, NotFound @@ -27,45 +28,12 @@ from flask.globals import _request_ctx_stack, request from flask.session import Session, _NullSession from flask.module import _ModuleSetupState +from flask.templating import _DispatchingJinjaLoader # a lock used for logger initialization _logger_lock = Lock() -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 - - class Flask(_PackageBoundObject): """The flask object implements a WSGI application and acts as the central object. It is passed the name of the module or package of the diff --git a/flask/helpers.py b/flask/helpers.py index d0b3ac2345..34c21cdde7 100644 --- a/flask/helpers.py +++ b/flask/helpers.py @@ -290,31 +290,6 @@ def send_file(filename_or_fp, mimetype=None, as_attachment=False, return rv -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. - """ - current_app.update_template_context(context) - return current_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. - """ - current_app.update_template_context(context) - return current_app.jinja_env.from_string(source).render(context) - - def _get_package_path(name): """Returns the path to a package or cwd if that cannot be found.""" try: diff --git a/flask/templating.py b/flask/templating.py new file mode 100644 index 0000000000..0bb704c174 --- /dev/null +++ b/flask/templating.py @@ -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)