在django模板中捕获异常

时间:2011-12-15 17:20:04

标签: python django exception django-templates

我在Django模板中使用模板标记(标记为thumbnail)并且它抛出一个异常,使模板失败并出现500错误。我想阻止这种情况发生,因为我没有完全控制偶尔触发此异常的源图像,并在这些情况下使用空白/占位符图像。这是当前的模板代码:

{% thumbnail video.image_url "50x74" crop="center" as im %}
<img src="{% cdn_images im.url %}" />
{% empty %}
<img src="/media/img/noimage_thumb.png" alt="" />
{% endthumbnail %}

这是例外(PIL抛出它):

TemplateSyntaxError at /

Caught IOError while rendering: cannot identify image file

我搜索了解决方案,并提出了silent_variable_failure这是一个属性,如果已定义,则会使异常变得安静。我想这可能指向正确的方向,但据我所知,任何使用此解决方案都意味着我必须修改模板标签代码本身,这是一个外部库 - 我宁愿不这样做,< / p>

理想情况下,我想用{% empty or exception_raised %}替换代码中的第三行。

有这样的事吗?你知道其他选择吗?

2 个答案:

答案 0 :(得分:11)

我一直处理的方法是将其推送到模型层。所以在你的模型中:

  class MyImageModel(model.Model):
       # model fields go here..

       def get_url(self):
            try:
                 # or whatever causes the exception
                 return self.url
            except IOError:
                 return None

在你的模板中:

{% thumbnail video.image_url "50x74" crop="center" as im %}

{% if im.get_url %}
    <img src="{% cdn_images im.get_url %}" />
{% else %}
    <img src="/media/img/noimage_thumb.png" alt="" />
{% endif %}

{% endthumbnail %}

答案 1 :(得分:0)

您的模板不应该将异常作为正常的行动方案提出。如果模板中有错误,则修复它。否则,任何可能引发异常的事情都应该在模型或视图中处理。没有像你提到的标签。