2

私はdjango-sorlを設定しましたが、本当に単純なものを見落としていると思います。次のエラーが発生し続けます(TEMPLATE_DEBUG=TrueおよびTHUMBNAIL_DEBUG=True)

リクエスト方法:GETリクエストURL: http:// localhost:8000 / events / edit / 1

Djangoバージョン:1.2.4例外タイプ:TemplateSyntaxError例外値:

レンダリング中にIOErrorが発生しました:(2、'そのようなファイルまたはディレクトリはありません')

例外の場所:_openの137行目の/usr/lib/python2.6/site-packages/django/core/files/storage.py

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

これらのファイルを開くと、それらは私がオンデマンドで要求している画像です。画像を開いて表示しようとしているときに爆撃しているようです。もう1つの注意点は、次の構文を使用して画像を表示するだけで、正常に機能することです(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>

私はこのエラーをグーグルで検索できませんでした。テンプレートの表示以外はすべて機能しているので、私の問題が簡単なものであることを願っています。

4

2 に答える 2

1

この分野のドキュメントは少し弱かったですが、Pythonデバッガーをインポートした後、問題がどこにあるかを見つけることができました。

この問題には2つの解決策があります。私にとってすべてを修正した最初の方法は、テンプレートを次のように変更することでした。

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

もちろん、これは、表示しようとしているイベントを含むオブジェクトが画像の表示に単独で責任を負わない場合、厄介な解決策です。したがって...2番目のオプションは「いくつかの」状況でのみ理想的かもしれません。私は最初の回避策に固執します。

この回避策は、10.12.1パッチに適用できます。

また、私の最初の質問を正当化するために。静止画像が作成されていると述べました。結局のところ、これは正しくありませんでした。これらの画像は「画像の正しいサムネイル」でしたが、自分のページで作業することができませんでした。それらはDJango-Adminツールから自動的に生成されていました。おそらく、私が別の画像をアップロードしようとしていたとき(間違った方法で問題に取り組んでいたとき)。:)

于 2011-03-08T22:09:55.203 に答える
1

モデルには属性がありますpath。これpathはとして定義され、ImageField最終的には、最終的なサムネイルを作成するために画像にアクセスする場所です。sorl.thumbnailモデルインスタンスを渡すことで意味を推測する方法はありません。あなたの場合のように見える画像ソースimage.pathを渡す必要があります。メソッドを返すことについてのあなたのコメントは間違っているように思わself.image.pathれ、おそらく、を定義する同じモデルについてまだ話している場合は__unicode__そうなるはずです。self.pathpath

于 2011-03-14T17:32:54.873 に答える