我正在开发一个执行一些潜在有害操作的Jinja扩展程序,如果失败则会引发一个异常,其中包含有关错误的信息。
当发生这种情况时,Exception当然会阻止Jinja完成其渲染过程并返回None
而不是渲染结果。使用try / catch语句并返回空字符串或任何合适的字符串可以轻松缓解此问题。
然而,这有效地抛弃了异常和调试信息,我宁愿将其传递给我的错误日志。负责设置Jinja环境的系统有它自己的日志服务,我宁愿与扩展分开。我知道,Jinja有一个Undefined
class我已成功用来拦截另一个项目中未定义变量的访问。
有什么方法可以引发一种特殊类型的异常(UndefinedException
不起作用),或者告诉Jinja环境在我的扩展程序中发生错误时记录警告,同时仍允许它继续它的执行?
我想到的是这个例子的内容:
def _render(*args, **kwrags):
# ...
try:
self.potentially_harmful_operation()
except Exception as e:
self.environment.warning(e)
return Markup("")
# ...
return Markup('<img src"{}">'.format(img_path))
所以,澄清一下,正如我在下面的评论中写的那样:
从根本上说,我想我的问题归结为&#34;我怎样才能让Jinja产生警告,就像它对例如缺少变量&#34;。
答案 0 :(得分:0)
对于任何有兴趣的人,我设法通过实施我自己的Undefined
课程(主要受make_logging_undefined
启发并使用undefined
关键字将其提供给环境来解决此问题。根据您的需要,默认make_logging_undefined
可能就足够了。
一旦到位,诀窍就是在环境中发出警告。这是通过简单地实例化环境Undefined
并执行其魔术方法之一(例如__str__
)来完成的。从上面看到我的示例代码,可以像这样完成:
def _render(*args, **kwrags):
# ...
try:
self.potentially_harmful_operation()
except Exception as e:
str(self.environment.undefined(e))
return Markup("")
# ...
return Markup('<img src"{}">'.format(img_path))