检测图像错误Django temp

2024-09-30 20:33:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我从几个来源拉入图像链接,所以我有一个混合图像,渲染,然后有问题渲染。在

我有许多图像返回http错误400403等

我能在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 %}

Tags: django图像imagesrc模板httpurlimg
1条回答
网友
1楼 · 发布于 2024-09-30 20:33:51

您可以在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存在),否则返回{}。在

用法:

{% 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函数一样简单,然后用您提供的占位符图像替换image src。 这里提供了有关如何做到这一点的示例:Detecting an image 404 in javascript

您甚至可以做得更好:如果您想知道无法访问的图像,可以将占位符图像的URL修改为一个视图,该视图检索图像URL并将其记录在数据库中的某个位置,以便以后可以从图像数据库中删除该URL。视图总是返回占位符图像。在

为什么我建议在客户端处理这个错误?在

答案很简单:服务器加载和访问权限。经常检查所有的url将创建一个巨大的服务器负载和流量,这两个你可能不想一直处理。此外,您的服务器可能不允许访问您要过滤掉的某些图像,反之亦然。有些服务器只允许你在预先加载包含这些图片的页面后访问它们的图片(我了解到,试图从网站上为我的个人BluRay库索引刮取电影海报)。您的服务器可能从某个地方抓取而您能够访问的图像可能因此无法被您的客户端webbrowser访问。因此,他仍然可以看到破碎的图像。如果您检查客户端浏览器的可用性,他将永远不会看到损坏的图像,因为他或她的浏览器总是用占位符替换那些图像。如果你包括我上面的建议,你甚至可以众包图像可用性检查,减少你和国外服务器的服务器负载。在

相关问题 更多 >