【问题标题】:django-sorl produces IOError when using template syntaxdjango-sorl 在使用模板语法时产生 IOError
【发布时间】:2011-03-08 00:54:09
【问题描述】:

我已经设置了 django-sorl,我真的认为我忽略了一些简单的东西。我不断收到以下错误(TEMPLATE_DEBUG = True 和 THUMBNAIL_DEBUG = True)

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

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

渲染时捕获 IOError: (2, 'No such file or directory')

异常位置: /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>

我没有成功地用谷歌搜索这个错误;我希望我的问题只是一个快速的问题,因为除了模板显示之外一切正常。

【问题讨论】:

    标签: python django ioerror


    【解决方案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 工具自动生成的。当我尝试上传不同的图像时可能会回来(以错误的方式解决问题)。 :)

    【讨论】:

      【解决方案2】:

      在您的模型中,您有一个属性path。这个path 被定义为ImageField,最终将在此处访问图像以制作最终缩略图。 sorl.thumbnail 不可能通过传递模型实例来猜测您的意思,您需要传递图像 source 在您的情况下似乎是 image.path。您关于在__unicode__ 方法中返回self.image.path 的评论似乎是错误的,如果您仍在谈论定义path 的同一模型,则可能应该是self.path

      【讨论】:

        猜你喜欢
        • 2011-08-10
        • 2011-05-13
        • 2011-09-12
        • 1970-01-01
        • 2014-02-05
        • 1970-01-01
        • 2015-06-10
        • 2010-11-07
        • 2023-03-03
        相关资源
        最近更新 更多