2011-06-10 58 views
3

我正在使用sorl縮略圖和Django。在我的本地設置上,它可以正常工作,但是在製作過程中縮略圖沒有製作。sorl thumbnail +生產中的django問題

我的代碼如下所示:

{% 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' 

這讓縮略圖,纔不會使通過模板代碼一個事實。

有人嗎?

+0

這聽起來像是一個權限問題。通過HTTP的Django將在Web服務器的用戶和組下運行,而我非常確定shell管理命令在您的用戶和組下運行。確保該文件的整個路徑以及文件本身都可以被網絡服務器的用戶和/或組讀取。 – 2011-06-10 21:44:33

+0

它似乎不是一個權限問題。我的網絡服務器以用戶www-data運行。我已遞歸地將我的整個應用程序目錄chown到該用戶和組。每條路徑都包含緩存目錄,全世界都可以寫入。同樣的問題依然存在。 – gdonald 2011-06-10 21:52:31

回答

1

試了一下。最終解決了一個更新的Linux發行版。不會在Ubuntu 10.04上工作,但在此之後,它對我來說工作正常,11.04,11.10等。

2

你做過syncdb了嗎?

運行此檢查:蟒蛇manage.py縮略圖清理

2

簡短的回答:卸載的ligjpeg dev的文件的所有版本,除了6.2。卸載所有版本的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 

現在我卸載PIL從我的virtualenv

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 dev的文件已經從源代碼安裝在服務器的trainwreck(除了包管理器安裝版本6.2 - 搞笑吧?),所以我不得不下載源兩個libjpeg7libjpeg8,運行./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 

重啓Web服務器。幸福。

4

像我這樣的懶人的解決方案是在設置文件中嘗試另一個THUMBNAIL_ENGINE。

我正面臨同樣的問題。由於它顯然是由圖像庫的問題導致的,對於我的情況,我決定只是使用不同的圖像庫 - 並且工作。目前有3種可能的圖像庫:PIL(默認),Pgmagick和ImageMagick/GraphicsMagick。細節解釋here

當然,其中一個備選庫必須安裝在服務器上。 Otherwiese,這種解決方案將無法正常工作。