在Django模板中捕获异常

16 投票
2 回答
15011 浏览
提问于 2025-04-17 08:27

我在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 的属性,如果定义了这个属性,异常就会被静默处理。我觉得这可能是个正确的方向,但根据我的理解,使用这个属性的任何解决方案都意味着我需要修改模板标签的代码,而这个标签是一个外部库——我不太想这样做。

理想情况下,我希望能把代码中的第三行替换成类似 {% empty or exception_raised %} 的东西。

有没有类似的东西存在?你知道有什么替代方案吗?

2 个回答

0

你的模板不应该在正常情况下抛出错误。如果模板里有问题,你需要去修复它。否则,任何可能导致错误的情况都应该在模型或视图中处理。之所以没有你提到的那种标签,就是因为这个原因。

17

我一直以来的做法是把这个问题交给模型层来处理。所以在你的模型中:

  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 %}

撰写回答