41

到目前为止,我发现当 Mako 模板编码不正确时,不可能产生可用的回溯。

除了对每一行代码进行迭代之外,还有什么方法可以调试模板?

4

6 回答 6

45

Mako 实际上提供了一种非常好的方法来跟踪模板中的错误

from mako import exceptions

try:
    template = lookup.get_template(uri)
    print template.render()
except:
    print exceptions.html_error_template().render()
于 2009-02-11T09:31:33.217 回答
4

查看Flask-Mako源代码,我发现了一个未记录的配置参数,名为MAKO_TRANSLATE_EXCEPTIONS.

False在你的 Flask 应用程序配置中设置它,你会从模板中得到很好的异常。这完成了与@Mariano 建议的相同的事情,而无需编辑源代码。显然,这个参数是在马里亚诺的回答之后添加的。

于 2014-02-22T06:18:39.790 回答
1

我将它们分解成碎片,然后在发现问题后重新组装。

不好,但是很难判断一个大而复杂的模板出了什么问题。

于 2008-12-24T01:49:17.417 回答
1

我对 Mako 的主要不满是很难看到模板中发生了什么。由于模板代码是内存中的可运行对象,因此没有调试器可以查看它。

一种解决方案是将模板代码写入文件,并使用此文件作为标准 python 模块重新运行模板。然后你可以调试到你的心内容。

一个例子:

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
于 2020-09-29T20:15:14.993 回答
0

使用 flask_mako,我发现跳过 TemplateError 生成并传递异常更容易。即在flask_mako.py 中,注释掉导致TemplateError 的部分,然后加注:

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

}

然后你会看到一个导致问题的常规 python 异常以及模板中的行号。

于 2012-11-09T22:07:43.000 回答
0

将两个最佳答案与我自己的特殊酱汁相结合:

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

它包装了股票“render_template”函数:

  • 捕获异常,并且
    • 如果调试,则呈现回溯
    • 如果不调试,请再次引发异常,以便将其记录下来
  • 使配置可从页面访问(不相关)
于 2017-09-20T03:02:38.233 回答