How do you debug Mako templates?

后端 未结 6 1709
星月不相逢
星月不相逢 2021-01-30 21:15

So far I\'ve found it impossible to produce usable tracebacks when Mako templates aren\'t coded correctly.

Is there any way to debug templates besides iterating for ever

相关标签:
6条回答
  • 2021-01-30 21:46

    I break them down into pieces, and then reassemble the pieces when I've found the problem.

    Not good, but it's really hard to tell what went wrong in a big, complex template.

    0 讨论(0)
  • 2021-01-30 21:52

    Using flask_mako, I find it's easier to skip over the TemplateError generation and just pass up the exception. I.e. in flask_mako.py, comment out the part that makes the TemplateError and just do a raise:

    def _render(template, context, app):
     """Renders the template and fires the signal"""
    app.update_template_context(context)
    try:
        rv = template.render(**context)
        template_rendered.send(app, template=template, context=context)
        return rv
    except:
        #translated = TemplateError(template)                                                                                                                 
        #raise translated                                                                                                                                     
        raise
    

    }

    Then you'll see a regular python exception that caused the problem along with line numbers in the template.

    0 讨论(0)
  • 2021-01-30 21:54

    Looking at the Flask-Mako source, I found an undocumented configuration parameter called MAKO_TRANSLATE_EXCEPTIONS.

    Set this to False in your Flask app config and you'll get nice exceptions bubbling up from the template. This accomplishes the same thing as @Mariano suggested, without needing to edit the source. Apparently, this parameter was added after Mariano's answer.

    0 讨论(0)
  • 2021-01-30 21:55

    Mako actually provides a VERY nice way to track down errors in a template:

    from mako import exceptions
    
    try:
        template = lookup.get_template(uri)
        print template.render()
    except:
        print exceptions.html_error_template().render()
    
    0 讨论(0)
  • 2021-01-30 21:55

    My main frustration with Mako was that it was hard to see what was happening in the template. As the template code is a runnable object that is in-memory, no debugger can look into it.

    One solution is to write the template code to file, and re-run the template using this file as a standard python module. Then you can debug to your hearts content.

    An example:

    import sys
    from mako import exceptions, template 
    from mako.template import DefTemplate
    from mako.runtime import _render
    
    <Do Great Stuff>
    
    try:
        template.render(**arguments))
    except:
        # Try to re-create the error using a proper file template
        # This will give a clearer error message.
        with open('failed_template.py', 'w') as out:
            out.write(template._code)
        import failed_template
        data = dict(callable=failed_template.render_body, **arguments)
        try:
            _render(DefTemplate(template, failed_template.render_body),
                    failed_template.render_body,
                    [],
                    data)
        except:
            msg = '<An error occurred when rendering template for %s>\n'%arguments
            msg += exceptions.text_error_template().render()
            print(msg, file=sys.stderr)
            raise
    
    0 讨论(0)
  • 2021-01-30 22:00

    Combining the two top answers with my own special sauce:

    from flask.ext.mako import render_template as render_template_1
    from mako import exceptions
    
    app.config['MAKO_TRANSLATE_EXCEPTIONS'] = False    # seems to be necessary
    
    def render_template(*args, **kwargs):
        kwargs2 = dict(**kwargs)
        kwargs2['config'] = app.config     # this is irrelevant, but useful
        try:
            return render_template_1(*args, **kwargs2)
        except:
            if app.config.get('DEBUG'):
                return exceptions.html_error_template().render()
            raise
    

    It wraps the stock "render_template" function:

    • catch exceptions, and
      • if debugging, render a backtrace
      • if not debugging, raise the exception again so it will be logged
    • make config accessible from the page (irrelevant)
    0 讨论(0)
提交回复
热议问题