2011-03-08 32 views
2

我设置了django-sorl,我真的认为我忽略了简单的东西。我不断收到以下错误(TEMPLATE_DEBUG = True和THUMBNAIL_DEBUG = TRUE)当使用模板语法时,django-sorl产生IOError

请求方法:GET请求URL: http://localhost:8000/events/edit/1

Django的版本:1.2.4异常类型: TemplateSyntaxError异常值:

陷入IO错误而呈现:(2, '没有这样的文件或目录')

异常位置: /usr/lib/python2.6/site-packages/django/core/files /storage.py在_open,线137

Python的可执行文件: 在/ usr/bin中/ Python的Python版本:2.6.4

我运行Redis的服务器设置...我SORL配置是:

settings.py -snip-:

TEMPLATE_DEBUG = DEBUG 
THUMBNAIL_DEBUG = DEBUG 
THUMBNAIL_KVSTORE = 'sorl.thumbnail.kvstores.redis_kvstore.KVStore' 
INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'sorl.thumbnail', 
) 

models.py -snip-:

from sorl.thumbnail import ImageField 
... 
    path = ImageField(
     _('Image'), 
     upload_to='event/%Y/%m/%d/%H', 
    ) 
... 

template.html -snip-:

{% load thumbnail %} 
... 
{% thumbnail image "200x100" as im %} 
    <img src="{{ im.url }}" alt="{{ im.name }}"/> 
{% endthumbnail %} 
... 

我想我接近,因为正在按需创建的缓存文件夹

sh> find static/cache/ -type f 
static/cache/db/ac/dbac605942d9651eb25f16cf05f5e672.jpg 
static/cache/82/bc/82bcdd2ab079187c6b6110cb0e0c1505.jpg 
static/cache/07/77/077784411739d4f8b1758255783388ec.jpg 

文件当我打开这些文件;他们是我要求提供的图像。它试图打开图像显示它似乎是轰炸。另外要注意的是,如果我使用下面的语法只显示图像它会正常工作(不SORL):

工作template.html(不SORL - 因此...没有缩略图)-snip-:

<img src="{{ MEDIA_URL}}{{ image.path }}" alt="{{ image.name }}"/> 

关键是;我确实需要在图像的{{MEDIA_URL}}标签前加上前缀(我不确定这是否是我用sorl获取的错误中的一个因素,或者仅仅是一条红鲱鱼。)

现在的原始错误的一些花絮决赛(他们是来自正在生成TemplateSyntaxError页 - 过去5)

# /var/project/src/lib/sorl/thumbnail/base.py in get_thumbnail 

    36. thumbnail = ImageFile(name, default.storage) 
    37. cached = default.kvstore.get(thumbnail) 
    38. if cached: 
    39. return cached 
    40. if not thumbnail.exists(): 
    41. # We have to check exists() because the Storage backend does not 
    42. # overwrite in some implementations. 
    43. source_image = default.engine.get_image(source) ... 
    44. # We might as well set the size since we have the image in memory 
    45. size = default.engine.get_image_size(source_image) 
    46. source.set_size(size) 
    47. self._create_thumbnail(source_image, geometry_string, options, 
    48. thumbnail) 
    49. # If the thumbnail exists we don't create it, the other option is 

▼ Local vars Variable Value cached None file_ <EventImage: TestImage> geometry_string u'200x100' key 'format' name 'cache/24/69/246986cc89951f1d37235b8f0dec0a54.jpg' options {'colorspace': 'RGB', 'crop': False, 'format': 'JPEG', 'quality': 95, 'upscale': True} self <sorl.thumbnail.base.ThumbnailBackend object at 0x7f5b885f2c10> source <sorl.thumbnail.images.ImageFile object at 0x7f5b885c81d0> thumbnail <sorl.thumbnail.images.ImageFile object at 0x7f5b8867f510> value 'JPEG' 
# /var/project/src/lib/sorl/thumbnail/engines/pil_engine.py in get_image 

    5. from PIL import Image, ImageDraw 
    6. except ImportError: 
    7. import Image, ImageDraw 
    8. 
    9. 
    10. class Engine(EngineBase): 
    11. def get_image(self, source): 

    12. buf = StringIO(source.read()) ... 

    13. return Image.open(buf) 
    14. 
    15. def get_image_size(self, image): 
    16. return image.size 
    17. 
    18. def dummy_image(self, width, height): 

▼ Local vars Variable Value self <sorl.thumbnail.engines.pil_engine.Engine object at 0x7f5b886cf450> source <sorl.thumbnail.images.ImageFile object at 0x7f5b885c81d0> 
# /home/caronc/Development/cityattention/src/lib/sorl/thumbnail/images.py in read 

114. return self._size 
115. 
116. @property 
117. def url(self): 
118. return self.storage.url(self.name) 
119. 
120. def read(self): 
121. return self.storage.open(self.name).read() ... 
122. 
123. def write(self, content): 
124. if not isinstance(content, File): 
125. content = ContentFile(content) 
126. self._size = None 
127. return self.storage.save(self.name, content) 

▼ Local vars Variable Value self <sorl.thumbnail.images.ImageFile object at 0x7f5b885c81d0> 
# /usr/lib/python2.6/site-packages/django/core/files/storage.py in open 

    25. # These shouldn't be overridden by subclasses unless absolutely necessary. 
    26. 
    27. def open(self, name, mode='rb', mixin=None): 
    28. """ 
    29. Retrieves the specified file from storage, using the optional mixin 
    30. class to customize what features are available on the File returned. 
    31. """ 
    32. file = self._open(name, mode) ... 
    33. if mixin: 
    34. # Add the mixin as a parent class of the File returned from storage. 
    35. file.__class__ = type(mixin.__name__, (mixin, file.__class__), {}) 
    36. return file 
    37. 
    38. def save(self, name, content): 

▼ Local vars Variable Value mixin None mode 'rb' name u'TestImage' self  <django.core.files.storage.FileSystemStorage object at 0x7f5b8867f3d0> 
# /usr/lib/python2.6/site-packages/django/core/files/storage.py in _open 

130. location = settings.MEDIA_ROOT 
131. if base_url is None: 
132. base_url = settings.MEDIA_URL 
133. self.location = os.path.abspath(location) 
134. self.base_url = base_url 
135. 
136. def _open(self, name, mode='rb'): 
137. return File(open(self.path(name), mode)) ... 
138. 
139. def _save(self, name, content): 
140. full_path = self.path(name) 
141. 
142. directory = os.path.dirname(full_path) 
143. if not os.path.exists(directory): 

▼ Local vars Variable Value mode 'rb' name u'TestImage' self <django.core.files.storage.FileSystemStorage object at 0x7f5b8867f3d0> 

我用Google搜索失败这个错误,我希望我的问题仅仅是一个快速之一。因为除了模板显示以外所有东西都在工作。

回答

1

documentation在这个领域有点弱,但是在导入python调试器之后,我能够找出问题所在。

这个问题有两种可能的解决方案。第一个固定我的一切是改变我的模板阅读:

{% load thumbnail %} 
... 
{% thumbnail image.path "200x100" as im %} 
    <img src="{{ im.url }}" alt="{{ im.name }}"/> 
{% endthumbnail %} 
... 

我猜这个问题仍然可能在我的最后;特别是因为这个工具已经有一段时间了。也就是说,那些遇到同样问题的人将需要添加.path参数来挽救自己所经历的悲伤。

另一种选择(不是很好的选择)是将其添加到models.py中,然后再次直接引用图像(就像我在最初的问题中所做的那样)。

def __unicode__(self): 
    return self.image.path 

这当然是一个讨厌的解决方案,如果包含您试图显示的事件的对象不是唯一负责显示图像。因此......第二种选择可能只适用于“某些”情况。我会坚持第一个解决方法。

此解决方法适用于10.12.1补丁。

此外,证明我的第一个问题。我说静态图像正在创建;事实证明,这是不正确的。虽然这些图像'是'我无法在我的网页上工作的图像的正确缩略图。他们是从DJango-Admin工具自动生成的。当我尝试上传不同的图像时(可能是错误地解决问题)可能会回来。 :)

1

在您的模型中,您有一个属性path。这path被定义为ImageField,最终这是从哪个图像将被访问,以制作最终的缩略图。 sorl.thumbnail没有办法通过模型实例来猜测你的意思,你需要传递图像source这似乎是image.path你的情况。您对__unicode__方法返回self.image.path的评论似乎有误,如果您仍在讨论与定义path相同的型号,则可能应为self.path