django-imagekit
django-imagekit copied to clipboard
IOError. No such file or directory.
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.
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.
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 <lambda>
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 I think I understand. You're saying that the image doesn't exist, but you don't want it to raise an error?
Yes, it is. Error at rendering template.
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.
In version 2.0.3 is no such problem. URL is generated without creating a modified image. You know better, closed or not.
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.
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 %}
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="×" 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'
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...
If you're getting an error checking truthiness, that's a bug.
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})
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'
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)
^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
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
Thank you @alex_parij, I’ll have a look
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?
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"