Skip to content

format_exception fails if exception occured in child template of inheritance chain #71

Description

@sqlalchemy-bot

Migrated issue, originally created by Anonymous

Very strange behavior, but:

base.htm

${self.body()}

test.htm

<%inherit file="base.htm" />

## should throw exception
${undefined_var}

Test1.htm stuff

test.py

import os
from mako.lookup import TemplateLookup
from mako.template import Template

l = TemplateLookup(directories=[os.getcwd(),])
t = Template(filename='test1.htm', lookup=l, format_exceptions=True)

print t.render()

As a result there will be 3 blank lines :). Expected: formatted error message.

Representable with 0.1.10 and latest trunk.

Problem is in your way of copying context. After Context._copy() copied instance will share all buffers and even buffer list with source Context. This can make a lot of hard-to-find errors. As this :).

mako.runtime, _exec_template(), 332 line:

context._buffer_stack = [util.StringIO()]

Here you overwrite buffer stack, but only for current context instance. And expect changes on all Contexts :).

c1 = Context()
c2 = Context()

c1._buffer_stack => list #1
c2._buffer_stack => list #1 (!)
c1._buffer_stack[0] => buff #1
c2._buffer_stack[0] => buff #1

c2._buffer_stack[0].write('asd')
c1._buffer_stack[0].getvalue() => 'asd' as expected

c2._buffer_stack = [StringIO]
c2._buffer_stack[0] => buff #2
c1._buffer_stack[0] => buff #1 (!!!)

In patch I had also changed the way buffers are created. At least this will allow multilingual template errors messages in the future ;). Also - use cStringIO ONLY for unicode (I mean use cStringIO if non-unicode encoding supplied).

If you dont want that much changes - to fix error problem you just need to replace
mako.runtime, _exec_template(), 332 line:

context._buffer_stack = [util.StringIO()]

to

while context._buffer_stack: del context._buffer_stack[0]
context._buffer_stack.append(util.StringIO())

Cheers!


Attachments: runtime_buffers.patch

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions