【问题标题】:detect image errors django template检测图像错误django模板
【发布时间】:2017-11-19 13:05:05
【问题描述】:

我从多个来源提取图像链接,因此我有一个混合图像,可以渲染,然后出现渲染问题。

我有许多图像返回 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 %}

【问题讨论】:

  • 也许这个问题能解决你的问题! Here's link

标签: python django http django-templates http-error


【解决方案1】:

您可以在 django 模板中或之前的视图中检测到损坏的链接。但是,根据您正在执行的项目类型,我不建议这样做 - 至少在没有缓存的情况下不会。

让我们先谈谈理论,然后谈谈可能的替代解决方案: 如果您只使用自己托管的图像,只要服务器上的文件存在,将图像提供给您的客户端应该没有问题。您可以通过检索图像的路径并检查文件是否存在来轻松检查这一点(前提是您可以访问该文件并且没有完全分离媒体服务器,那么您必须将其视为外部托管)。 如果我仔细阅读了您的问题,您似乎链接到托管在外部服务器上的图像。可以在服务器端处理这些图像的一些但可能不是所有问题。您可以在存储图像 URL 时执行此操作,或者在后台执行定期检查。如果您真的想在每次将图像 URL 发送给用户时进行检查,您可能会在服务器上创建大量负载以进行检查。在这种情况下,我建议重度依赖缓存,并将用于检查 URL 可用性的方法的返回值缓存一段时间。

话虽如此,您可以在模板中执行以下操作:

理论上,您可以创建自己的自定义过滤器“urlexists”(请参阅​​https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/)。此过滤器将检索您要检查的 URL。它会尝试从远程服务器检索文件(仅下载标头,参见https://stackoverflow.com/a/16778473/1331407 了解如何执行此操作)并返回True,如果URL 存在,否则返回False

用法:

{% 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 会产生巨大的服务器负载和流量,您可能不想一直处理这两者。此外,您的服务器可能不允许访问您将过滤掉的某些图像 - 反之亦然。有些服务器只允许您在预先加载包含这些图像的页面后访问他们的图像(我了解到试图从网站上抓取电影海报以获取我的个人蓝光库索引)。您的服务器可能从某处抓取并且您能够访问的图像因此可能无法被您的客户端网络浏览器访问。因此,他可能仍然会看到破碎的图像。如果您在客户浏览器上检查可用性,他将永远不会看到损坏的图像,因为他或她的浏览器总是用占位符替换那些。如果您在上面包含我的建议,您甚至可以众包图像可用性检查,从而减少您和国外服务器上的服务器负载。

【讨论】:

    猜你喜欢
    • 2014-09-05
    • 1970-01-01
    • 2020-08-16
    • 2019-08-08
    • 2013-04-21
    • 2011-11-08
    • 2016-12-06
    • 2020-12-19
    • 2011-08-28
    相关资源
    最近更新 更多