Gelegentlich erhalte ich Fehler wie diesen, aber sie liefern keinen Kontext dazu, welches Bild fehlgeschlagen ist, was das Debuggen erschwert, wenn sie gelegentlich auf einem ausgelasteten Webserver auftauchen. Ich weiß nicht, warum dies nicht aufgenommen worden wäre, es sei denn, in diesem Wrapper waren Details (wie der Dateiname) nicht verfügbar?
[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")
Für jeden, der diese Fehlermeldung findet, habe ich auch einen Fehler bei Pillow mit diesem Fehler beim Abrufen von EXIF gemeldet:
@mariocesar Kannst du hier eine Lösung empfehlen? Einige Benutzer laden Bilder auf meine Website hoch, die irgendwie beschädigt sind, und anschließend wird diese Fehlerprotokollierung ständig angezeigt.
@mariocesar Bitte.
Ja, bitte! =D
Das Problem war in der Tat ein Fehler im Wasserzeichenprogramm, das diese Benutzer verwendeten, was zu einem beschädigten EXIF führte, und ich arbeitete mit dem Autor zusammen, um das zu beheben.
Die Art und Weise, wie ich dieses Problem gelöst habe, bestand darin, diese Daumen immer im Code (und nicht in der Vorlage) zu generieren und in einen try-Block einzuschließen. Darüber hinaus habe ich einen periodischen Prozess, der versucht, die Daumen zu generieren, anstatt während des Anforderungszyklus. Wenn es ein Problem mit dem Bild gibt, protokolliere ich es mit den erforderlichen Informationen und entferne das Bild, damit der Fehler nicht weiter auftritt.
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
Datei "/app/.heroku/python/lib/python2.7/site-packages/sorl/thumbnail/engines/pil_engine.py", Zeile 71, in _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
warum außer (AttributeError, IOError, KeyError, IndexError) ?
wir haben einen SyntaxError("not a TIFF IFD") , nicht in der Fehlerliste, das ist der Fehler.
warum nicht einfach ausnahme ??
wenn Exif nicht erhalten werden konnte, einfach ignorieren, weitermachen.
Alles klar, sie haben den Fehler bereits beseitigt.
def _orientation(self, image):
try:
exif = image._getexif()
except:
exif = None