在Django模板中捕获异常
我在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 %}