from django.template.backends.utils import csrf_input_lazy, csrf_token_lazy import django.template.backends.base import genshi.template import genshi.template.loader import genshi.template.base class GenshiEngine(django.template.backends.base.BaseEngine): app_dirname = 'genshi' def __init__(self, params): params = params.copy() options = params.pop('OPTIONS').copy() self.app_dirname = options.get('app_dirname', self.app_dirname) 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.template.base.TemplateSyntaxError as exc: raise django.template.TemplateSyntaxError(exc.args) def get_template(self, template_name): try: template = self.loader.load(template_name) return GenshiTemplateWrapper(template) except genshi.template.loader.TemplateNotFound as exc: raise django.template.TemplateDoesNotExist(exc.args) except genshi.template.base.TemplateSyntaxError 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(**context) return stream.render()