我从多个来源提取图像链接,因此我有一个混合图像渲染,然后渲染出现问题。
我有许多图像以http错误400,403等返回。
我能否在django模板中检测到这一点,以便我可以渲染比破损图像更合适的东西?
类似的东西:
{% if ia.image.url %}
<img src="{{media_url}}{{ia.image.url}}" alt="#" class="trimimg1" />
{% else %}
<img src="{% static 'common/app/images/news-default.jpg' %}" alt="#" class="trimimg1" />
{% endif %}
答案 0 :(得分:1)
您可以在django模板中或在视图之前检测损坏的链接。但是,根据您正在进行的项目类型,我不建议这样做 - 至少在没有缓存的情况下。
首先谈谈理论,然后谈谈可能的替代解决方案: 如果您只使用自己托管的图像,只要服务器上的文件存在,向客户提供图像应该没问题。您可以通过检索图像的路径并检查文件是否存在来轻松检查(提供,您可以访问该文件并且没有完全分离文件服务器,那么您必须处理它,就好像它是外部托管)。 如果我仔细阅读您的问题,您似乎链接到托管在外部服务器上的图像。在服务器端可以处理这些图像的一些但可能不是所有问题。您可以在存储图像URL时执行此操作,也可以在后台进行定期检查。如果您确实希望每次将图像URL发送给用户时进行检查,则可能会在服务器上产生大量负载以进行检查。在这种情况下,我建议严重依赖缓存并缓存方法的返回值,以便在特定时间内检查URL的可用性。
话虽如此,您可以在模板中执行以下操作:
理论上,您可以创建自己的自定义过滤器&#34; urlexists&#34; (见https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/)。此过滤器将检索您要检查的URL。它会尝试从远程服务器检索文件(仅下载标题,请参阅https://stackoverflow.com/a/16778473/1331407了解如何执行此操作),如果URL存在则返回True
,否则返回False
。 / p>
用法:
{% if ia.image.url|urlexists %}
<img src="{{media_url}}{{ia.image.url}}" alt="#" class="trimimg1" />
{% else %}
<img src="{% static 'common/app/images/news-default.jpg' %}" alt="#" class="trimimg1" />
{% endif %}
正如我所说,这是一个解决方案,但我不建议这样做。
我宁愿建议使用JavaScript处理客户端的HTTP错误。该脚本可以像JavaScript函数一样简单,然后使用您提供的占位符图像替换图像src。 此处提供了有关如何执行此操作的示例:Detecting an image 404 in javascript
您甚至可以做得更好:如果您想了解无法访问的图像,可以将占位符图像的URL修改为检索图像URL的视图,并将其记录在数据库中的某个位置,以便您可以删除稍后您的图像数据库中的URL。该视图始终只返回占位符图像。
简单回答:服务器加载和访问权限。不断检查所有URL会产生巨大的服务器负载和流量,这两者都可能不想一直处理。此外,可能不允许您的服务器访问您要过滤掉的某些图像 - 反之亦然。有些服务器只允许您在加载包含这些图像的页面后才能访问它们的图像(我学会了尝试从我的个人BluRay库索引中删除网站上的电影海报)。因此,您的客户端webbrowser可能无法访问您的服务器可能从某处抓取并且您能够访问的映像。因此他可能仍会看到破碎的图像。如果您在客户端浏览器上检查可用性,他将永远不会看到损坏的图像,因为他或她的浏览器总是用占位符替换它们。如果您在上面提到我的建议,您甚至可以众包图像可用性检查,从而减少您和外部服务器上的服务器负载。