Parfois, je reçois des échecs comme celui-ci, mais ils ne fournissent aucun contexte quant à l'échec de l'image, ce qui rend difficile le débogage lorsqu'ils apparaissent occasionnellement sur un serveur Web occupé. Je ne sais pas pourquoi cela n'aurait pas été inclus à moins que dans ce wrapper ces détails (tels que le nom de fichier) n'étaient pas disponibles ?
[ERROR] Thumbnail tag failed [thumbnail:84]
Traceback (most recent call last):
File "/app/.heroku/python/lib/python2.7/site-packages/sorl/thumbnail/templatetags/thumbnail.py", line 59, in render
return self._render(context)
File "/app/.heroku/python/lib/python2.7/site-packages/sorl/thumbnail/templatetags/thumbnail.py", line 137, in _render
thumbnail = get_thumbnail(file_, geometry, **options)
File "/app/.heroku/python/lib/python2.7/site-packages/sorl/thumbnail/shortcuts.py", line 8, in get_thumbnail
return default.backend.get_thumbnail(file_, geometry_string, **options)
File "/app/.heroku/python/lib/python2.7/site-packages/sorl/thumbnail/base.py", line 125, in get_thumbnail
thumbnail)
File "/app/.heroku/python/lib/python2.7/site-packages/sorl/thumbnail/base.py", line 157, in _create_thumbnail
image = default.engine.create(source_image, geometry, options)
File "/app/.heroku/python/lib/python2.7/site-packages/sorl/thumbnail/engines/base.py", line 20, in create
image = self.orientation(image, geometry, options)
File "/app/.heroku/python/lib/python2.7/site-packages/sorl/thumbnail/engines/base.py", line 45, in orientation
return self._orientation(image)
File "/app/.heroku/python/lib/python2.7/site-packages/sorl/thumbnail/engines/pil_engine.py", line 71, in _orientation
exif = image._getexif()
File "/app/.heroku/python/lib/python2.7/site-packages/PIL/JpegImagePlugin.py", line 390, in _getexif
return _getexif(self)
File "/app/.heroku/python/lib/python2.7/site-packages/PIL/JpegImagePlugin.py", line 418, in _getexif
info = TiffImagePlugin.ImageFileDirectory(head)
File "/app/.heroku/python/lib/python2.7/site-packages/PIL/TiffImagePlugin.py", line 274, in __init__
raise SyntaxError("not a TIFF IFD")
Pour tous ceux qui trouvent ce message d'erreur, j'ai également signalé un bogue avec Pillow avec cette erreur lors de l'obtention d'EXIF :
@mariocesar Pouvez-vous recommander une solution ici ? Certains utilisateurs téléchargent des images sur mon site qui sont corrompues d'une manière ou d'une autre, et par la suite, cette erreur de journalisation apparaît tout le temps.
@mariocesar S'il
Ouais, s'il te plait ! =D
Le problème était en fait un bogue dans le programme de filigrane que ces utilisateurs utilisaient, entraînant un EXIF corrompu, et j'ai travaillé avec l'auteur pour résoudre ce problème.
La façon dont j'ai résolu ce problème était de toujours générer ces pouces dans le code (plutôt que dans le modèle) et de les envelopper dans un bloc try. De plus, j'ai un processus périodique qui essaie de générer les pouces plutôt que pendant le cycle de demande. S'il y a un problème avec l'image, je l'enregistre avec les informations nécessaires et supprime l'image afin que l'échec ne se reproduise plus.
def get_thumbnail(self, dims, upscale=False, **options):
""" Use sorl to produce the thumbnail; this also caches it for later.
"""
from sorl.thumbnail import get_thumbnail as sorl_get_thumbnail
try:
return sorl_get_thumbnail(self.best_image(), dims, upscale=upscale, **options)
except SyntaxError:
# Only catch SyntaxError: not a tiff, otherwise, I had Heroku rebooting
# and caused me to remove a good image.
log.error("Problem generating thumbnail for #%s @ %s. Removed it. %s",
self.id, dims, self.best_image().url, exc_info=True)
# Remove all images.
self.image = ""
self.save()
return None
Fichier "/app/.heroku/python/lib/python2.7/site-packages/sorl/thumbnail/engines/pil_engine.py", ligne 71, dans _orientation
exif = image._getexif()
`` python
def _orientation(self, image):
try:
exif = image._getexif()
except (AttributeError, IOError, KeyError, IndexError):
exif = None
if exif:
orientation = exif.get(0x0112)
if orientation == 2:
image = image.transpose(Image.FLIP_LEFT_RIGHT)
elif orientation == 3:
image = image.rotate(180)
elif orientation == 4:
image = image.transpose(Image.FLIP_TOP_BOTTOM)
elif orientation == 5:
image = image.rotate(-90).transpose(Image.FLIP_LEFT_RIGHT)
elif orientation == 6:
image = image.rotate(-90)
elif orientation == 7:
image = image.rotate(90).transpose(Image.FLIP_LEFT_RIGHT)
elif orientation == 8:
image = image.rotate(90)
return image
pourquoi sauf (AttributeError, IOError, KeyError, IndexError) ?
nous avons une SyntaxError("not a TIFF IFD") , pas dans la liste des erreurs, c'est le bogue.
pourquoi pas juste sauf Exception ??
si vous ne pouvez pas obtenir exif, ignorez simplement, continuez.
d'accord, ils ont déjà supprimé le bogue.
def _orientation(self, image):
try:
exif = image._getexif()
except:
exif = None