【问题标题】:sorl thumbnail + django issues in productionsorl thumbnail + django 生产中的问题
【发布时间】:2011-09-12 19:56:02
【问题描述】:

我在 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'

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

有人吗?

【问题讨论】:

  • 对我来说这听起来仍然像是一个权限问题。 Django over HTTP 将在网络服务器的用户和组下运行,而我很确定 shell 管理命令在您的用户和组下运行。确保网络服务器的用户和/或组可以读取该文件的整个路径以及文件本身。
  • 这似乎不是权限问题。我的网络服务器作为用户 www-data 运行。我已经递归地将我的整个应用程序目录分配给该用户和组。通往缓存目录(包括缓存目录)的每条路径都是世界可写的。同样的问题仍然存在。

标签: django permissions sorl-thumbnail


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您是否完成了您的同步数据库?

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

    【讨论】:

      【解决方案3】:

      简答:卸载除 6.2 之外的所有版本的 ligjpeg dev 文件。卸载所有版本的PIL。使用pip 将最近的sorl.thumbnailPIL-1.1.7 安装到virtualenv 中,以便PIL 针对libjpeg6.2 进行编译。

      详细回答:

      我在我维护的网站上遇到了很多麻烦 - 原来这是由于 PILlibjpegsorl 之间的版本冲突 - 有人安装了所有这些版本的很多版本。我不得不将其简化为 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 版 - 好笑吗?)所以我不得不下载 @987654345 的源代码@ 和 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
      

      重启网络服务器。幸福。

      【讨论】:

        【解决方案4】:

        什么都试过了。最终用更新的 Linux 发行版解决了问题。无法在 Ubuntu 10.04 上运行,但之后它对我、11.04、11.10 等运行良好。

        【讨论】:

          猜你喜欢
          • 2016-05-09
          • 2011-05-13
          • 2012-06-21
          • 2012-11-22
          • 2013-01-30
          • 2013-06-20
          • 2021-10-07
          • 2012-09-05
          • 2021-05-09
          相关资源
          最近更新 更多