matthewwithanm / django-imagekit

Automated image processing for Django. Currently v4.0
http://django-imagekit.rtfd.org/
BSD 3-Clause "New" or "Revised" License
2.26k stars 276 forks source link

Compatibility with django-s3direct #454

Open octavio2895 opened 6 years ago

octavio2895 commented 6 years ago

Not sure how possible this is since imagekit and s3direct operate very differently (imagekit uses file objects and s3direct outputs URL strings).

Just wondering if anyone have managed to make them work.

vstoykov commented 6 years ago

If you are using some of the django storages that can work with S3 (like django-storages or django-s3-storage) then imagekit can create thumbnails. Probably you just need to create a helper function (template filter) that can accept URL generated from s3direct and return relative path to the configured storage.

octavio2895 commented 6 years ago

I'm not sure if this is what you suggested but I tried manually setting the source as a relative path of a previously uploaded image like so:

{% with image_path="img/thumbs/luxor-100-200-6.jpg" %}
{% thumbnail '650x350' image_path %}
{% endwith %}

And I get the following traceback:

Traceback` (most recent call last):
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
    response = get_response(request)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\core\handlers\base.py", line 158, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\core\handlers\base.py", line 156, in _get_response
    response = response.render()
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\response.py", line 106, in render
    self.content = self.rendered_content
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\response.py", line 83, in rendered_content
    content = template.render(context, self._request)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\base.py", line 175, in render
    return self._render(context)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\base.py", line 167, in _render
    return self.nodelist.render(context)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\base.py", line 943, in render
    bit = node.render_annotated(context)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\base.py", line 910, in render_annotated
    return self.render(context)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\loader_tags.py", line 155, in render
    return compiled_parent._render(context)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\base.py", line 167, in _render
    return self.nodelist.render(context)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\base.py", line 943, in render
    bit = node.render_annotated(context)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\base.py", line 910, in render_annotated
    return self.render(context)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\loader_tags.py", line 67, in render
    result = block.nodelist.render(context)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\base.py", line 943, in render
    bit = node.render_annotated(context)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\base.py", line 910, in render_annotated
    return self.render(context)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\base.py", line 910, in render_annotated
    return self.render(context)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\defaulttags.py", line 517, in render
    return self.nodelist.render(context)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\base.py", line 943, in render
    bit = node.render_annotated(context)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\django\template\base.py", line 910, in render_annotated
    return self.render(context)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\imagekit\templatetags\imagekit.py", line 125, in render
    file = ImageCacheFile(generator)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\imagekit\cachefiles\__init__.py", line 40, in __init__
    name = fn(generator)
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\imagekit\cachefiles\namers.py", line 91, in hash
    '%s%s' % (generator.get_hash(), ext)))
  File "C:\Users\Octavio-Desktop\Documents\Echeverriaasoc\lib\site-packages\imagekit\specs\__init__.py", line 134, in get_hash
    self.source.name,
AttributeError: 'SafeText' object has no attribute 'name'

I tested the relative path on the django shell using the storage api and it did find the file. I think that the tag expects a file-like object not a path. Is there a way to make a file-like object without downloading and opening a file?

vstoykov commented 6 years ago

Actually you can but is kind of tricky. You need to mimic the logic of django.db.models.fields.files.FieldFile but without the field. Probably similarly how we are mimicking it in ImageKit with BaseIKFile and ImageCacheFile.

BaseIKFile is not the best solutions and I'm not suggesting it to use it as is, but instead to read more about Django's abstractions about files. You can came up with some lazy opening file to see if it will work in your case.

vstoykov commented 6 years ago

@tony you are hijacking the thread. Your issue is unrelated to to the issue described by the issue's author.

I'm kindly asking you to respect others and not polluting theirs threads with unrelated information.

You can create new issue where we can have discussion about your problem and if it is issue with ImageKit at all.

vstoykov commented 6 years ago

@octavio2895 did you managed to fix your problem? Do you think that ImageKit can be improved somehow or if you think that it is not related to ImageKit we can close the issue?