django-imagekit icon indicating copy to clipboard operation
django-imagekit copied to clipboard

IOError. No such file or directory.

Open NewVadim opened this issue 12 years ago • 18 comments

Hi! I am a newbie, but I think you need something to correct.In developing Drafts are often media images available data on different computers. And when applying the template to the url there problems with the handling of the file. Not convenient to check every time there is a picture on the disc. I hope to write clear, not good at English. Google translate.

NewVadim avatar Jul 17 '13 19:07 NewVadim

I'm really sorry @NewVadim but I can't really understand. If you're worried about too-frequent disk access, you can read these tips for optimization. On the other hand, if you're getting an error, maybe I'd be able to help if you pasted the stack trace.

matthewwithanm avatar Jul 17 '13 20:07 matthewwithanm

Environment:

Request Method: GET
Request URL: http://www.diploms.ru/

Django Version: 1.5.1
Python Version: 2.7.3
Installed Applications:
('grappelli',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'gunicorn',
 'django_extensions',
 'grappelli',
 'debug_toolbar',
 'apps.pages',
 'apps.slider',
 'apps.authors',
 'apps.reviews',
 'apps.header_and_footer',
 'apps.counter',
 'imagekit',
 'ckeditor',
 'debug_toolbar')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'debug_toolbar.middleware.DebugToolbarMiddleware',
 'debug_toolbar.middleware.DebugToolbarMiddleware')

Template error:

In template /home/vadim/projects/diploms/src/templates/base/slider.html, error at line 30
   2
   20 :             {% for image in images %}
   21 :             <div class='slider_elem'>
   22 :                 {% if image.description %}
   23 :                     <div class='desc_slider'>
   24 :                         <div class='inner_'>
   25 :                             {{ image.description }}
   26 :                         </div>
   27 :                     </div>
   28 :                 {% endif %}
   29 :                 {% if image.url %}
   30 :                     <a href='{{ image.url }}'><img src=" {{ image.big.url }} " width=580 height=300 /></a>
   31 :                 {% else %}
   32 :                     <img src="{{ image.big.url }}" width=580 height=300 />
   33 :                 {% endif %}
   34 :             </div>
   35 :             {% endfor %}
   36 :         </div>
   37 :     </div>
   38 :     <div class='nbr'></div>
   39 : </div>

Traceback:

File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/vadim/projects/diploms/src/apps/common/decorators.py" in response
  39.                                                      context_instance = RequestContext(request)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/loader.py" in render_to_string
  177.         return t.render(context_instance)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/base.py" in render
  140.             return self._render(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  65.     return self.nodelist.render(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/base.py" in render
  830.                 bit = self.render_node(node, context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  124.         return compiled_parent._render(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  65.     return self.nodelist.render(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/base.py" in render
  830.                 bit = self.render_node(node, context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  63.             result = block.nodelist.render(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/base.py" in render
  830.                 bit = self.render_node(node, context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  156.         return self.render_template(self.template, context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render_template
  138.         output = template.render(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/base.py" in render
  140.             return self._render(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  65.     return self.nodelist.render(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/base.py" in render
  830.                 bit = self.render_node(node, context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  188.                         nodelist.append(node.render(context))
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  284.                 return nodelist.render(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/base.py" in render
  830.                 bit = self.render_node(node, context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/debug.py" in render
  84.             output = self.filter_expression.resolve(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/base.py" in resolve
  578.                 obj = self.var.resolve(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/base.py" in resolve
  728.             value = self._resolve_lookup(context)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/template/base.py" in _resolve_lookup
  761.                         current = getattr(current, bit)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/imagekit/cachefiles/__init__.py" in url
  83.         return self._storage_attr('url')
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/imagekit/cachefiles/__init__.py" in _storage_attr
  73.             existence_required.send(sender=self, file=self)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/dispatch/dispatcher.py" in send
  170.             response = receiver(signal=self, sender=sender, **named)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/imagekit/registry.py" in existence_required_receiver
  50.         self._receive(file, 'on_existence_required')
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/imagekit/registry.py" in _receive
  58.             call_strategy_method(file, callback)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/imagekit/utils.py" in call_strategy_method
  132.         fn(file)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/imagekit/cachefiles/strategies.py" in on_existence_required
  12.         file.generate()
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/imagekit/cachefiles/__init__.py" in generate
  92.             self.cachefile_backend.generate(self, force)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/imagekit/cachefiles/backends.py" in generate
  107.         self.generate_now(file, force=force)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/imagekit/cachefiles/backends.py" in generate_now
  95.             file._generate()
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/imagekit/cachefiles/__init__.py" in _generate
  96.         content = generate(self.generator)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/imagekit/utils.py" in generate
  115.     content = generator.generate()
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/imagekit/specs/__init__.py" in generate
  149.             img = open_image(self.source)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/pilkit/utils.py" in open_image
  20.     target.seek(0)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/core/files/utils.py" in &lt;lambda&gt;
  20.     seek = property(lambda self: self.file.seek)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/db/models/fields/files.py" in _get_file
  46.             self._file = self.storage.open(self.name, 'rb')
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/core/files/storage.py" in open
  36.         return self._open(name, mode)
File "/home/vadim/projects/diploms/env/local/lib/python2.7/site-packages/django/core/files/storage.py" in _open
  159.         return File(open(self.path(name), mode))

Exception Type: IOError at /
Exception Value: [Errno 2] No such file or directory: u'/home/vadim/projects/diploms/src/media/sliders/3D-graphics_Fantasy_Race_034657_23.jpg'

NewVadim avatar Jul 17 '13 20:07 NewVadim

@NewVadim I think I understand. You're saying that the image doesn't exist, but you don't want it to raise an error?

matthewwithanm avatar Aug 19 '13 02:08 matthewwithanm

Yes, it is. Error at rendering template.

NewVadim avatar Aug 21 '13 19:08 NewVadim

Hm, in that case, I'm leaning towards closing this as a #wontfix. AFAIK, this is how Django handles missing files in templates (e.g. ImageFields, etc.) everywhere, so it makes sense to be consistent I think.

matthewwithanm avatar Aug 21 '13 19:08 matthewwithanm

In version 2.0.3 is no such problem. URL is generated without creating a modified image. You know better, closed or not.

NewVadim avatar Aug 24 '13 14:08 NewVadim

I highly agree that the exception should not be raised from template if the image is missing on filesystem. It would be nice if it just silently failed. One of the things that I liked about Django is that you can't break the page from template. I am surprised that Django itself seems to violate that in some cases.

The current behaviour is fragile and I am too looking for a way how to avoid the errors.

clime avatar Feb 12 '14 18:02 clime

AFAIK IK behaves just like Django here. If you want to include an image that may not exist, you can do truthiness checks, but accessing an attribute of a non-existent object will raise an error. In other words, this will not error for Django ImageFields or IK fields:

{% if obj.thumbnail %}
    {% obj.thumbnail.url %}
{% endif %}

whereas this will error for both if obj.thumbnail is None:

{% obj.thumbnail.url %}

matthewwithanm avatar Feb 12 '14 18:02 matthewwithanm

I have tried that:

{% if image.thumbnail_1 %}
     <img src="{{ image.thumbnail_1.url }}"
{% endif %}

but it throws IOError anyway on this line: {% if image.thumbnail_1 %}:

Template error:
In template /srv/www/cb/web/templates/media/image/edit/item.html, error at line 34
   2
   24 :                 <input type="hidden" name="ids" value="{{ image.id }}">
   25 :                 <input type="submit" class="btn alt delete" value="&#xd7;" title="Delete">
   26 :             </form>
   27 :             {% endif %}
   28 : 
   29 :             {% if image.added_by == request.member %}
   30 :             <input type="checkbox" class="checkbox toggle" name="toggle" value="{{ image.id }}" title="Check">
   31 :             {% endif %}
   32 :         </div>
   33 :         <a title="{{ image.name }}" class="alt-edit">
   34 :              {% if image.thumbnail_1 %} 
   35 :                 <img src="{{ image.thumbnail_1.url }}">
   36 :             {% endif %}
   37 :             {% if image.image %}
   38 :                 <img src="{{ image|attr:"thumbnail_2"|attr:"url" }}"
   39 :                         style="width:{{ image|attr:"thumbnail_2"|attr:"width" }}px; height:{{ image|attr:"thumbnail_2"|attr:"height" }}px">
   40 :             {% else %}
   41 :                 <div class="img-placeholder"></div>
   42 :             {% endif %}
   43 :         </a>
   44 :     </div>

Traceback:
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/srv/www/cb/web/views.py" in image_list
  849.     return media_list(request, Image, relfield_name, relfield_val, mode)
File "/srv/www/cb/web/views.py" in media_list
  846.     return render(request, 'media/'+model.tag+'/'+mode+'/items.html', context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/shortcuts/__init__.py" in render
  53.     return HttpResponse(loader.render_to_string(*args, **kwargs),
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/loader.py" in render_to_string
  169.         return t.render(context_instance)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/base.py" in render
  140.             return self._render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  85.     return self.nodelist.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/base.py" in render
  840.                 bit = self.render_node(node, context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/debug.py" in render_node
  78.             return node.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  196.                         nodelist.append(node.render(context))
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  155.         return self.render_template(self.template, context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/loader_tags.py" in render_template
  137.         output = template.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/base.py" in render
  140.             return self._render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  85.     return self.nodelist.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/base.py" in render
  840.                 bit = self.render_node(node, context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/debug.py" in render_node
  78.             return node.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  305.                 return nodelist.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/base.py" in render
  840.                 bit = self.render_node(node, context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/debug.py" in render_node
  78.             return node.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  304.             if match:
File "/srv/www/envs/cb/lib/python2.7/site-packages/imagekit/cachefiles/__init__.py" in __nonzero__
  130.         existence_required.send(sender=self, file=self)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/dispatch/dispatcher.py" in send
  185.             response = receiver(signal=self, sender=sender, **named)
File "/srv/www/envs/cb/lib/python2.7/site-packages/imagekit/registry.py" in existence_required_receiver
  53.         self._receive(file, 'on_existence_required')
File "/srv/www/envs/cb/lib/python2.7/site-packages/imagekit/registry.py" in _receive
  61.             call_strategy_method(file, callback)
File "/srv/www/envs/cb/lib/python2.7/site-packages/imagekit/utils.py" in call_strategy_method
  139.         fn(file)
File "/srv/www/envs/cb/lib/python2.7/site-packages/imagekit/cachefiles/strategies.py" in on_existence_required
  12.         file.generate()
File "/srv/www/envs/cb/lib/python2.7/site-packages/imagekit/cachefiles/__init__.py" in generate
  93.             self.cachefile_backend.generate(self, force)
File "/srv/www/envs/cb/lib/python2.7/site-packages/imagekit/cachefiles/backends.py" in generate
  108.         self.generate_now(file, force=force)
File "/srv/www/envs/cb/lib/python2.7/site-packages/imagekit/cachefiles/backends.py" in generate_now
  96.             file._generate()
File "/srv/www/envs/cb/lib/python2.7/site-packages/imagekit/cachefiles/__init__.py" in _generate
  97.         content = generate(self.generator)
File "/srv/www/envs/cb/lib/python2.7/site-packages/imagekit/utils.py" in generate
  122.     content = generator.generate()
File "/srv/www/envs/cb/lib/python2.7/site-packages/imagekit/specs/__init__.py" in generate
  149.             img = open_image(self.source)
File "/srv/www/envs/cb/lib/python2.7/site-packages/pilkit/utils.py" in open_image
  21.     target.seek(0)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/core/files/utils.py" in <lambda>
  20.     seek = property(lambda self: self.file.seek)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/db/models/fields/files.py" in _get_file
  46.             self._file = self.storage.open(self.name, 'rb')
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/core/files/storage.py" in open
  33.         return self._open(name, mode)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/core/files/storage.py" in _open
  160.         return File(open(self.path(name), mode))

Exception Type: IOError at /images/member/1/edit-list/
Exception Value: [Errno 2] No such file or directory: u'/srv/www/cb/media_files/member_folders/1/1.jpg'

clime avatar Feb 12 '14 19:02 clime

Btw, I am not sure I understood properly but there is no error if you access an attribute of None in Django templates. (EDIT: just got what you meant).

I have found a way to bypass that IOError by using this custom filter:

@register.filter
def attr(o, name):
    try: return getattr(o, name)
    except: return ''

and then in template to access thumbnail's attributes like this:

<img src="{{ image|attr:"thumbnail_1"|attr:"url" }}">

I would like to know if there is a better way...

clime avatar Feb 12 '14 19:02 clime

If you're getting an error checking truthiness, that's a bug.

matthewwithanm avatar Feb 12 '14 19:02 matthewwithanm

Cool, btw I am not getting the error if I access my ProcessedImageField ({{ image.image }} is alright). It throws the error for ImageSpecField though ({{ image.thumbnail_1 }} not alright):

  class Image(Media):
    image = ProcessedImageField(upload_to=get_media_upload_path,
                                processors=[ResizeToFit(width=1024, height=1024, upscale=False)],
                                format='JPEG',
                                options={'quality': 75})
    thumbnail_1 = ImageSpecField(source='image',
                                processors=[SmartResize(width=178, height=134)],
                                format='JPEG',
                                options={'quality': 75})

clime avatar Feb 12 '14 19:02 clime

One more thing to make the matter more complicated:). On another my page, the IOError is raised in these lines:

{% if form.instance.image %}
      <img src="{{ form.instance.image.url }}" width="{{ form.instance.image.width }}" height="{{ form.instance.image.height }}">
{% endif %}

form.instance is an Image model instance. Here form.instance.image is evaluated to true because it is set in db but the file on filesystem does not exist and because of that it raises the error on: {{ form.instance.image.width }} (but not on {{ form.instance.image.url }}, which is before that). So the truthiness check basically doesn't enable IOError to be prevented in this case.

Full traceback:

Template error:
In template /srv/www/cb/web/templates/media/image/edit/form.html, error at line 7
   2
   1 : {% extends base_template|default:"bases/lite.html" %}
   2 : 
   3 : {% block content %}
   4 : <div class="media-edit-box" id="media-edit-box" data-media_id="{{ form.instance.id }}">
   5 :  <div class="col1">
   6 :      {% if form.instance.image %}
   7 :      <img src="{{ form.instance.image.url }}" width=" {{ form.instance.image.width }} " height="{{ form.instance.image.height }}">
   8 :      {% endif %}
   9 :      <span class="name stroked">{{ form.instance.filename }}</span>
   10 :     </div>
   11 : 
   12 :     <div class="col2">
   13 :         {% if messages %}
   14 :         <ul class="flash-messages media-edit">
   15 :             {% for message in messages %}
   16 :             <li {% if message.tags %}class="{{ message.tags }}"{% endif %}>{{ message }}</li>
   17 :             {% endfor %}


Traceback:
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  139.                 response = response.render()
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/response.py" in render
  105.             self.content = self.rendered_content
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/response.py" in rendered_content
  82.         content = template.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/base.py" in render
  140.             return self._render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  85.     return self.nodelist.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/base.py" in render
  840.                 bit = self.render_node(node, context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/debug.py" in render_node
  78.             return node.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  123.         return compiled_parent._render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  85.     return self.nodelist.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/base.py" in render
  840.                 bit = self.render_node(node, context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/debug.py" in render_node
  78.             return node.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  123.         return compiled_parent._render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  85.     return self.nodelist.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/base.py" in render
  840.                 bit = self.render_node(node, context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/debug.py" in render_node
  78.             return node.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/base.py" in render
  840.                 bit = self.render_node(node, context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/debug.py" in render_node
  78.             return node.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/base.py" in render
  840.                 bit = self.render_node(node, context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/debug.py" in render_node
  78.             return node.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  305.                 return nodelist.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/base.py" in render
  840.                 bit = self.render_node(node, context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/debug.py" in render_node
  78.             return node.render(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/debug.py" in render
  88.             output = self.filter_expression.resolve(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/base.py" in resolve
  585.                 obj = self.var.resolve(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/base.py" in resolve
  735.             value = self._resolve_lookup(context)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/template/base.py" in _resolve_lookup
  771.                         current = getattr(current, bit)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/core/files/images.py" in _get_width
  17.         return self._get_image_dimensions()[0]
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/core/files/images.py" in _get_image_dimensions
  27.             self.open()
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/db/models/fields/files.py" in open
  76.         self.file.open(mode)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/db/models/fields/files.py" in _get_file
  46.             self._file = self.storage.open(self.name, 'rb')
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/core/files/storage.py" in open
  33.         return self._open(name, mode)
File "/srv/www/envs/cb/lib/python2.7/site-packages/django/core/files/storage.py" in _open
  160.         return File(open(self.path(name), mode))

Exception Type: IOError at /images/member/1/230/edit/
Exception Value: [Errno 2] No such file or directory: u'/srv/www/cb/media_files/uploads/1_6.jpg'

clime avatar Feb 12 '14 20:02 clime

You can create a property

Model: detail_image_thumb = ImageSpecField(source='detail_image', etc)

def _detail_image_thumb(self): try: return self.detail_image_thumb except: return None detail_image_thumb = property(_detail_image_thumb)

robslotboom avatar Jul 05 '14 13:07 robslotboom

^Thanks @robslotboom, that code works to suppress the error. For anyone's future reference, the indentations should look like this:

detail_image_thumb = ImageSpecField(source='detail_image', etc)

def _detail_image_thumb(self):
    try:
        return self.detail_image_thumb
    except:
        return None

detail_image_thumb = property(_detail_image_thumb)

When the DB thinks an image exists but it doesn't (because I deleted it manually), I'll get the IOError. I'm using the existence checks:

{% if user.detail_image_thumb %}
    <img src="{{ user.detail_image_thumb.url }}">
{% endif %}

And Celery (using the ImageKit Celery backend):

Task imagekit.cachefiles.backends._generate_file[xxxx-xxxx-xxxx-xxxx-xxxx] raised unexpected: IOError(u'File does not exist: /media/users/1/xxxx.jpg',)
Traceback (most recent call last):
  File "/_venv/local/lib/python2.7/site-packages/celery/app/trace.py", line 240, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/_venv/local/lib/python2.7/site-packages/celery/app/trace.py", line 437, in __protected_call__
    return self.run(*args, **kwargs)
  File "/_venv/local/lib/python2.7/site-packages/imagekit/cachefiles/backends.py", line 117, in _generate_file
    backend.generate_now(file, force=force)
  File "/_venv/local/lib/python2.7/site-packages/imagekit/cachefiles/backends.py", line 97, in generate_now
    file._generate()
  File "/_venv/local/lib/python2.7/site-packages/imagekit/cachefiles/__init__.py", line 97, in _generate
    content = generate(self.generator)
  File "/_venv/local/lib/python2.7/site-packages/imagekit/utils.py", line 123, in generate
    content = generator.generate()
  File "/_venv/local/lib/python2.7/site-packages/imagekit/specs/__init__.py", line 149, in generate
    img = open_image(self.source)
  File "/_venv/local/lib/python2.7/site-packages/pilkit/utils.py", line 21, in open_image
    target.seek(0)
  File "/_venv/local/lib/python2.7/site-packages/django/core/files/utils.py", line 20, in <lambda>
    seek = property(lambda self: self.file.seek)
  File "/_venv/local/lib/python2.7/site-packages/django/db/models/fields/files.py", line 46, in _get_file
    self._file = self.storage.open(self.name, 'rb')
  File "/_venv/local/lib/python2.7/site-packages/django/core/files/storage.py", line 33, in open
    return self._open(name, mode)
  File "/_venv/local/lib/python2.7/site-packages/storages/backends/s3boto.py", line 366, in _open
    raise IOError('File does not exist: %s' % name)
IOError: File does not exist: media/users/1/xxxx.jpg

ghost avatar Jul 10 '14 02:07 ghost

FYI , @robslotboom 's solution appears to be working in this specific case, but it breaks 'generateimages' command. The command silently fails and never generates any images. All it prints is: Validating generator: imagekit:thumbnail Validating generator: journal:journalentry:image

aparij avatar Jul 21 '15 17:07 aparij

Thank you @alex_parij, I’ll have a look

robslotboom avatar Jul 22 '15 05:07 robslotboom

I really agree that it should not throw an exception just to give me the DATA of the model. I'm not reading the file, I just want the URL, whether it exists or not.

It seems odd that Django won't let you access the data in your database without first checking if a file exists... makes no sense to me. :-/

This is for a backend API using DRF so it is silly to require it to do file IO just to pull the URL for an endpoint.

Any body have up to date tips on this?

jfrux avatar Apr 13 '17 14:04 jfrux

I'm not reading the file, I just want the URL, whether it exists or not.

This will depend on the Cache File Strategy. If the strategy is JustInTime (the default one) in order to generate the URL the cached image need to exists. If the image does not exist then it is generated and the URL returned. If the strategy is Optimistic then the URL will be generated without checking if the file is there or not. The problem with the Optimistic is that the image should be generated by something (like celery for example). There are configurations for that but can't be the default behavior. You need to configure it for your project.

I think that we should close the issue as "wontfix"

vstoykov avatar Apr 05 '23 21:04 vstoykov