Created
May 10, 2009 16:00
-
-
Save bradwright/109642 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
""" | |
djangojinja2 | |
~~~~~~~~~~~~ | |
Adds support for Jinja2 to Django. | |
Configuration variables: | |
======================= ============================================= | |
Key Description | |
======================= ============================================= | |
`JINJA2_TEMPLATE_DIRS` List of template folders | |
`JINJA2_EXTENSIONS` List of Jinja2 extensions to use | |
`JINJA2_CACHE_SIZE` The size of the Jinja2 template cache. | |
`JINJA2_GLOBAL_FUNCS` List of functions (as strings) to include. | |
`JINJA2_GLOBAL_FILTERS` List of filters (as string) to include. | |
======================= ============================================= | |
:copyright: (c) 2009 by the Jinja Team. | |
:license: BSD. | |
""" | |
from itertools import chain | |
from django.conf import settings | |
from django.http import HttpResponse | |
from django.template.loader import find_template_source | |
from django.core.exceptions import ImproperlyConfigured | |
from django.template.context import get_standard_processors | |
from django.template import TemplateDoesNotExist | |
from jinja2 import Environment, FileSystemLoader, TemplateNotFound | |
from jinja2.defaults import DEFAULT_NAMESPACE | |
# the environment is unconfigured until the first template is loaded. | |
_jinja_env = None | |
def import_module(name): | |
parts = name.split('.') | |
mod = parts[:-1] | |
mod = __import__('.'.join(mod), globals(), locals(), parts[-1:], -1) | |
return getattr(mod, ''.join(parts[-1:])) | |
def get_env(): | |
"""Get the Jinja2 env and initialize it if necessary.""" | |
global _jinja_env | |
if _jinja_env is None: | |
_jinja_env = create_env() | |
return _jinja_env | |
def create_env(): | |
"""Create a new Jinja2 environment.""" | |
searchpath = list(settings.JINJA2_TEMPLATE_DIRS) | |
env = Environment(loader=FileSystemLoader(searchpath), | |
auto_reload=settings.TEMPLATE_DEBUG, | |
cache_size=getattr(settings, 'JINJA2_CACHE_SIZE', 50), | |
extensions=getattr(settings, 'JINJA2_EXTENSIONS', ())) | |
# patch the environment to accept some global functions | |
if hasattr(settings, 'JINJA2_GLOBAL_FUNCS'): | |
env.globals['h'] = {} | |
for function in list(settings.JINJA2_GLOBAL_FUNCS): | |
function = import_module(function) | |
env.globals['h'][function.func_name] = function | |
if hasattr(settings, 'JINJA2_GLOBAL_FILTERS'): | |
for function in list(settings.JINJA2_GLOBAL_FILTERS): | |
function = import_module(function) | |
env.filters[function.func_name] = function | |
return env | |
def get_template(template_name, globals=None): | |
"""Load a template.""" | |
try: | |
return get_env().get_template(template_name, globals=globals) | |
except TemplateNotFound, e: | |
if settings.DEBUG: | |
# find a template we know exists to avoid white screen of death | |
find_template_source('login.html') | |
raise TemplateDoesNotExist(str(e)) | |
def select_template(templates, globals=None): | |
"""Try to load one of the given templates.""" | |
env = get_env() | |
for template in templates: | |
try: | |
return env.get_template(template, globals=globals) | |
except TemplateNotFound: | |
continue | |
raise TemplateDoesNotExist(', '.join(templates)) | |
def render_to_string(template_name, context=None, request=None, | |
processors=None): | |
"""Render a template into a string.""" | |
context = dict(context or {}) | |
if request is not None: | |
context['request'] = request | |
for processor in chain(get_standard_processors(), processors or ()): | |
context.update(processor(request)) | |
return get_template(template_name).render(context) | |
def render_to_response(template_name, context=None, request=None, | |
processors=None, mimetype=None): | |
"""Render a template into a response object.""" | |
return HttpResponse(render_to_string(template_name, context, request, | |
processors), mimetype=mimetype) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment