2015-04-16 2 views
2

Я использую Django-imagekit для процесса загрузки изображений, и я побежал в следующую ошибку:AttributeError: объект «cStringIO.StringO» не имеет атрибута «fileno» при использовании Джанго-imagekit

AttributeError at /car/7/ 

'cStringIO.StringO' object has no attribute 'fileno' 

Request Method:  GET 
Request URL: http://luxingnan.azurewebsites.net/car/7/ 
Django Version:  1.8 
Exception Type:  AttributeError 
Exception Value:  

'cStringIO.StringO' object has no attribute 'fileno' 

Exception Location:  D:\home\site\wwwroot\env\Lib\site-packages\pilkit\utils.py in 
__enter__, line 248 
Python Executable: D:\Python27\python.exe 
Python Version:  2.7.8 
Python Path:  

[u'D:\\home\\site\\wwwroot\\env\\Lib\\site-packages', '.', 'D:\\Windows\\SYSTEM32\\python27.zip', 'D:\\Python27\\DLLs', 'D:\\Python27\\lib', 'D:\\Python27\\lib\\plat-win', 'D:\\Python27\\lib\\lib-tk', 'D:\\Python27', 'D:\\Python27\\lib\\site-packages', 'D:\\home\\site\\wwwroot'] 

Server time: Thu, 16 Apr 2015 12:28:26 +0000 

ниже является мой код:

# models.py 
class Carpic(models.Model): 
    picture = models.ImageField('pic',upload_to='car-pictures') 
    picture_slide = ImageSpecField(source='picture', 
     processors=[ResizeToFill(762, 456)], 
     format='JPEG', 
     options={'quality': 60} 
     ) 
# template.html 
{% for pic in pictures %} 
<li><img src="{{pic.picture_slide.url}}"/></li> 
{% endfor %} 

Может кто-нибудь сказать мне, что мне делать? Спасибо

+0

эта ошибка связана с пакетом обработки изображений pilkit, я проследил проблему с некоторыми исследованиями и обнаружил, что проблема связана с классом FileWrapper в попытке pilkit/utils.py для вызова fileno() в экземпляре StringIO, этот ответ SO содержит подробное объяснение. http://stackoverflow.com/a/5903627/4724196 – HassenPy

+0

попытайтесь открыть проблему в репозитории pilkit здесь https://github.com/mattheww ithanm/pilkit/issues – HassenPy

+0

Странно, что все в порядке в местной среде. Но после того, как я развожу его на Azure, он дает мне ту ошибку – JSNoob

ответ

1

Только что получил шанс посмотреть на это (и your GH Issue). Я включу мой ответ здесь Потому что, кажется, как правильно сделать SO-накрест (:

So it looks like this is a quirk of Azure but we can definitely fix it in PILKit.

PILKit has a utility for quieting some of PIL's noise. The way it does this is by temporarily replacing stderr (using its file descriptor). Apparently on Azure, stderr is an instance of StringIO (which doesn't have a file descriptor). We'll just have to add a guard to the utility for that case (just like the one for when dev/null isn't writeable). It's a small change but I'm pretty busy at the moment. A PR would be much appreciated!

Так, другими словами, это не проблема с FileWrapper (как это было предложено в комментариях), а комбинация фальшивого stderr от Azure и утилиты от PILKit

+0

. Это кажется странным способом достижения этого. Я понимаю, что переназначение 'sys.stderr' является обычным методом временного перенаправления stderr, и это должно отлично работать с StringIO и т. Д. – Kevin

+0

Переназначение sys.stderr Python не делает то же самое. Шум PIL на самом деле происходит на более низком уровне. Проверьте [этот вопрос SQ] (http://stackoverflow.com/questions/977840/redirecting-fortran-called-via-f2py-output-in-python) для лучшего описания проблемы, которую мы там решаем. – matthewwithanm

+0

Хм ... В этом случае «реальный» stderr должен все еще указывать на * что-то *. В большинстве систем stderr является fd # 2. Возможно, вы сможете жестко закодировать это, если он достаточно надежный. Я также считаю, что есть макрос C, который расширяется до stderr fd, для большей переносимости. Я полагаю, что это может быть закрыто, но в этом случае «сохранение» должно быть тривиально. – Kevin

Смежные вопросы