3

我在 Django 中使用 sorl 缩略图。在我的本地设置上它工作正常,但在生产中没有制作缩略图。

我的代码如下所示:

{% load thumbnail %}
{% thumbnail up.image "32x32" crop="center" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% empty %}
<img src="{{ MEDIA_URL }}/images/missing_small.png" alt="" title="" />
{% endthumbnail %}

我启用了日志记录,跟踪如下所示:

Traceback (most recent call last):

[...]

File "/usr/local/lib/python2.6/dist-packages/PIL/ImageFile.py", line
215, in load
raise_ioerror(e)

File "/usr/local/lib/python2.6/dist-packages/PIL/ImageFile.py", line
52, in raise_ioerror
raise IOError(message + " when reading image file")

IOError: broken data stream when reading image file

该错误不是很有帮助,因为该文件在那里并且所有人都可以读取。我不确定如何获得更明确的错误,或者尝试修复什么。

然后更令人困惑的是它可以使用manage.py shell

In [1]: from sorl.thumbnail import get_thumbnail

In [2]: im = get_thumbnail('/myproject/static/images/user_profiles/1/11-20-2010-2_5.jpg',
'32x32', crop='center' )

In [3]: im
Out[3]: <sorl.thumbnail.images.ImageFile object at 0x29fe090>

In [4]: im.url
Out[4]: 'http://example.com/cache/ff/31/ff318b4a995ff345d1d48e79b67ec62b.jpg'

它制作了缩略图,只是不会通过模板代码制作缩略图。

任何人?

4

4 回答 4

4

像我这样懒惰的人的解决方案是在设置文件中尝试另一个 THUMBNAIL_ENGINE。

我面临着同样的问题。由于它显然是由图像库的问题引起的,就我而言,我决定简单地使用不同的图像库 - 它有效。目前有 3 个可能的图像库:PIL(默认)、Pgmagick 和 ImageMagick/GraphicsMagick。细节在这里解释。

当然,必须在服务器上安装备用库之一。否则,此解决方案将不起作用。

于 2012-10-24T09:30:03.637 回答
2

简短的回答:卸载ligjpeg除 6.2 之外的所有版本的开发文件。卸载所有版本的PIL. 安装一个最近的sorl.thumbnail并 安装PIL-1.1.7到一个 virtualenv 中pip,以便PIL针对libjpeg6.2.

详细解答:

我在我维护的网站上遇到了很多麻烦 - 原来这是由于之间的版本冲突PILlibjpeg并且sorl- 有人安装了所有这些版本的很多版本。我不得不把它剥离到一个单一的安装PIL1.1.7libjpeg6.2sorl.thumbnail 11.9

这是我必须做的(假设您使用的是 virtualenv。如果您不是,那么现在是开始的好时机):

yum erase python-imaging

哦,等等,它也是通过 easy_install 安装的,所以我还必须从站点包中删除 PIL:

easy_install -mxN PIL
rm -rf  /usr/lib/python2.6/site-packages/PIL /usr/lib/python2.6/site-packages/PIL.pth

现在我从我的 virtualenv 中卸载 PIL

pip uninstall PIL

我正在使用的 pip 版本似乎存在错误 - 我必须删除 virtualenv 构建目录中的内容,否则 pip 不会安装更高版本

rm -rf /path/to/virtualenv/build/PIL/

现在我必须删除我不想要的 libjpeg 版本......你可能应该这样做

apt-get remove libjpeg8 libjpeg8-dev

...或任何必要的咒语。当然,如果您有其他依赖于该版本的东西,libjpeg那么您将处于一个有趣的境地。我相信您可以PIL针对特定版本的libjpeg. 那么也许你可以开始libjpeg8工作 - 如果你这样做,请回复。

在我的服务器事故中,开发文件libjpeg7libjpeg8开发文件都是从源代码安装的(除了软件包管理器安装了 6.2 版 - 很有趣吧?),所以我必须下载两者的源代码,libjpeg7然后libjpeg8运行。还剩下一些库,所以我不得不这样做。./configure./make uninstall/usr/local/lib/rm /usr/local/lib/libjpeg*

我可能应该刚刚完成最后一点,但想要彻底。

检查您的系统上是否没有其他安装或安装的残余PILlibjpeg

现在你可以重新开始...

yum install libjpeg-devel 

在这个破旧的 CentOS 机器上,它获得了 6.2 版,似乎最适合PIL1.1.7. 在最近的 Debian/Ubuntu 上,你必须运行

apt-get install libjpeg62-dev

现在在我的 virtualenv 中运行

pip install PIL sorl-thumbnail

重启网络服务器。幸福。

于 2011-11-01T20:03:59.777 回答
2

你做了你的syncdb吗?

运行此检查:python manage.py thumbnail cleanup

于 2011-10-18T17:22:06.610 回答
1

什么都试过了。最终用更新的 Linux 发行版解决了问题。不适用于 Ubuntu 10.04,但之后它对我、11.04、11.10 等都可以正常工作。

于 2011-12-21T02:09:49.277 回答