Ano*_*wie 5 python django templates exception
我有一个Django应用程序,它使用Django模板系统生成其(非HTML)输出,此外还有Web UI.有一组页面,用户可以为报表创建模板,为变量替换添加{{}}标记,并使用额外的模板标记库来很好地格式化.
但是,我这样做的当前方式只是:
t = Template(component_template)
self.output_content = t.render(component_context)
Run Code Online (Sandbox Code Playgroud)
其中使用默认的Web输出模板引擎.如果您更改管理页面,这已经string_if_invalid设置了None,并且在手册中发出了严重警告.
因此,如果用户在标记中获取变量名称中的拼写错误,则会被静静地忽略并使其进入输出.如果他们有一个受损的标签,它实际上会杀死网络应用程序.我正在寻找一种在编辑时验证模板的方法,以便可以警告用户需要进行更改.
我的目标是编译器输出:
unknown variable 'ffsdfd' on line 33 of template
template syntax error on line 22 of template
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是创建一个新模板Engine()并将其用于此目的,因此我可以发现一个独特的默认值,string_if_invalid但这并没有告诉我有关丢失/不正确变量的任何信息.
engine = Engine(string_if_invalid="!!MISSING_VARIABLE!!", dirs=settings.TEMPLATES[0]['DIRS'],
context_processors=settings.TEMPLATES[0]['OPTIONS']['context_processors'],
app_dirs=settings.TEMPLATES[0]['APP_DIRS'])
t = Template(component_template, engine=engine)
try:
self.output_content = t.render(component_context)
except TemplateSyntaxError:
pass # do something useful here to collect error messages
Run Code Online (Sandbox Code Playgroud)
TemplateSyntaxError异常有效,除了我没有得到任何上下文信息,比如错误实际上在哪里,当然我只得到第一次失败.查看django.template代码,看起来内部存在某种扩展异常,它具有行号和导致它阻塞的令牌,但它不会从render()方法中逃脱.
所以:
如何为用户编辑的模板中的错误提供有用的错误处理?我应该以完全不同的方式做这件事吗?
小智 5
这是我自己使用自定义类和string_if_invalid. 它为您提供变量名称,但我确信您可以进一步调整它以获取其他上下文信息。
全局 settings.py 示例,应该很容易适应您的内联示例:
class InvalidTemplateVariable(str):
def __mod__(self,other):
from django.template.base import TemplateSyntaxError
raise TemplateSyntaxError("Invalid variable : '%s'" % other)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [....],
'APP_DIRS': True,
'OPTIONS': {
'string_if_invalid': InvalidTemplateVariable("%s"),
'context_processors': [
....
],
},
},
]
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您可以在下面的文章(我写的)中获得有关如何/为什么起作用的更多信息 http://www.webforefront.com/django/customizedjangotemplates.html#stringifinvaliderror
| 归档时间: |
|
| 查看次数: |
595 次 |
| 最近记录: |