Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检测django模板中的图像错误_Python_Django_Http_Django Templates_Http Error - Fatal编程技术网

Python 检测django模板中的图像错误

Python 检测django模板中的图像错误,python,django,http,django-templates,http-error,Python,Django,Http,Django Templates,Http Error,我从多个源中提取图像链接,这样我就可以混合渲染图像,然后在渲染时出现问题 我有许多图像返回http错误400、403等 我是否能够在django模板中检测到这一点,以便能够渲染比损坏的图像更合适的内容 比如: {% if ia.image.url %} <img src="{{media_url}}{{ia.image.url}}" alt="#" class="trimimg1" /> {% els

我从多个源中提取图像链接,这样我就可以混合渲染图像,然后在渲染时出现问题

我有许多图像返回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 %}
{%if ia.image.url%}
{%else%}
{%endif%}

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

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

也就是说,您可以在模板中执行以下操作:

理论上,您可以创建自己的自定义过滤器“urlexists”(请参阅)。此筛选器将检索要检查的URL。如果URL存在,它将尝试从远程服务器检索文件(仅下载标题,请参阅如何执行),并返回
True
,否则返回
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 %}
{%if ia.image.url | urlexists%}
{%else%}
{%endif%}
正如我所说,这是一个解决办法,但我不建议这样做

替代解决方案 我建议使用JavaScript在客户端处理HTTP错误。该脚本可以像一个JavaScript函数和一个JavaScript函数一样简单,然后用您提供的占位符图像替换图像src。 此处提供了有关如何做到这一点的示例:

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

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

也许这个问题可以解决您的问题!