【问题标题】:Django: How to get template debug info to user on syntaxerrorDjango:如何在语法错误时向用户获取模板调试信息
【发布时间】:2013-01-10 07:40:03
【问题描述】:

我有一个页面,用户可以在其中将自己的模板提交到 textarea 中,现在它需要这么简单。但是,由于它是用户生成的输入,我需要验证他们没有做破坏我的应用程序其余部分的事情,同时如果他们做错了什么,就他们做错了什么提供有用的反馈。

为了提供有用的反馈,我想要一些类似的东西来看看 django 为我提供了什么(使用 django 1.4):

尤其是上面那一点。我将用户模板放在 django 模板中,所以我不必自己验证语法错误和东西。看起来像这样:

try:
    template = get_template_from_string(user_input)
    template.render(context=Context())
except:
    do something to ouptut the error

需要渲染调用,否则根本不会抛出异常。

我已尝试打印异常及其参数,但这只能提供非常有限的信息。我也尝试使用回溯,但它从不返回行号或模板中的任何内容,只返回 python 代码中引发异常的位置。我也无法使用 Google 找到任何东西,而且我通过 Django 源代码进行的搜索让我想知道实际的错误页面是在哪里生成的......


所以基本上我的问题是;我如何获得图像中显示的信息?

编辑 澄清一下:我希望用户能够制作模板,以便在发送电子邮件时可以使用这些模板。由于 Django 模板引擎已经存在,我想我会使用它而不是其他东西。

使用thissn-p 和我自己对变量的一些解析使模板本身变得安全。到目前为止一切正常,除了对用户有用的调试消息。到目前为止,我得到的只是:“解析模板时出现问题,意外的块标签扩展”(例如),我希望它更像上面显示的图像。

【问题讨论】:

  • 你能详细说明你为什么这样做吗?可能存在不涉及用户提交 django 模板的解决方案。
  • 是的,它是用于电子邮件模板,用户需要能够上传自己的模板,包括变量等。所以我想既然我们使用了 Django,为什么不使用 Django 渲染引擎呢。

标签: python django templates exception traceback


【解决方案1】:

我刚刚遇到了同样的问题。在我的情况下,不需要有这样一个详细的回溯。所以我就这样做了,使用模型清理方法

from django.core.exceptions import ValidationError
from django.core.urlresolvers import NoReverseMatch
from django.db import models
from django.template.base import Template, TemplateSyntaxError
from django.template.context import Context

class MyTemplate(models.Model):
    template = models.TextField()

    def clean(self):
        try:
            Template(self.tempalte).render(Context({}))
        except TemplateSyntaxError as tse:
            raise ValidationError('TemplateSyntaxError: %s' % tse)
        except NoReverseMatch as nrm:
            raise ValidationError('NoReverseMatch: %s' % nrm)

【讨论】:

    猜你喜欢
    • 2012-11-22
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2011-04-30
    相关资源
    最近更新 更多