from django.template.backends.utils import csrf_input_lazy, csrf_token_lazy import django.template.backends.base import genshi.template class GenshiEngine(django.template.backends.base.BaseEngine): # Name of the subdirectory containing the templates for this engine # inside an installed application. def __init__(self, params): params = params.copy() options = params.pop('OPTIONS').copy() super(GenshiEngine, self).__init__(params) loader = genshi.template.TemplateLoader(self.template_dirs, auto_reload=options['auto_reload']) self.loader = loader def from_string(self, template_code): try: template = genshi.template.MarkupTemplate(template_code) return GenshiTemplateWrapper(template) except genshi.TemplateCompilationFailed as exc: raise django.template.TemplateSyntaxError(exc.args) def get_template(self, template_name): try: template = self.loader.load(template_name) return GenshiTemplateWrapper(self.loader.get_template(template_name)) except genshi.TemplateNotFound as exc: raise django.template.TemplateDoesNotExist(exc.args) except genshi.TemplateCompilationFailed as exc: raise django.template.TemplateSyntaxError(exc.args) class GenshiTemplateWrapper(object): def __init__(self, template): self.template = template def render(self, context=None, request=None): if context is None: context = {} if request is not None: context['request'] = request context['csrf_input'] = csrf_input_lazy(request) context['csrf_token'] = csrf_token_lazy(request) stream = self.template.generate(dict=context) return stream.render()