Django amazon s3 SuspiciousOperation
Question: So when i try accessing a certain image on S3 from my browser everything works
fine. But when python is doing it i get a `SuspiciousOperation` error. My
static folder is public on S3 so i really have no idea where this is coming
from.

    
    
    Publication.objects.get(id=4039).cover.url
    Traceback (most recent call last):
      File "<console>", line 1, in <module>
      File "/home/vagrant/.pyenv/versions/blook/lib/python2.7/site-packages/django/db/models/fields/files.py", line 64, in _get_url
        return self.storage.url(self.name)
      File "/home/vagrant/.pyenv/versions/blook/lib/python2.7/site-packages/queued_storage/backends.py", line 291, in url
        return self.get_storage(name).url(name)
      File "/home/vagrant/.pyenv/versions/blook/lib/python2.7/site-packages/queued_storage/backends.py", line 115, in get_storage
        elif cache_result is None and self.remote.exists(name):
      File "/home/vagrant/.pyenv/versions/blook/lib/python2.7/site-packages/storages/backends/s3boto.py", line 410, in exists
        name = self._normalize_name(self._clean_name(name))
      File "/home/vagrant/.pyenv/versions/blook/lib/python2.7/site-packages/storages/backends/s3boto.py", line 341, in _normalize_name
        name)
    SuspiciousOperation: Attempted access to 'http:/s3-eu-west-1.amazonaws.com/xpto/static/images/default-image.png' denied.
    

My settings:

    
    
    AWS_S3_SECURE_URLS = True  # use http instead of https
    S3_URL = 'http://s3-eu-west-1.amazonaws.com/%s' % AWS_STORAGE_BUCKET_NAME
    MEDIA_ROOT = 'media/'
    STATIC_ROOT = '/static/'
    STATIC_URL = S3_URL + STATIC_ROOT
    MEDIA_URL = S3_URL + '/' + MEDIA_ROOT
    

For now i can work around it, but that is not a long term solution. any ideas?


Answer: Danigosa's answer in this thread is the answer: [django-storages and amazon s3
- suspiciousoperation](http://stackoverflow.com/questions/12535123/django-
storages-and-amazon-s3-suspiciousoperation)

create a special storage class as outlined in this post:
[<https://www.caktusgroup.com/blog/2014/11/10/Using-Amazon-S3-to-store-your-
Django-sites-static-and-media-files/][2]>

Then override _normalize_name like this:

    
    
    from django.conf import settings
    

from storages.backends.s3boto3 import S3Boto3Storage

# custom_storages

class StaticStorage(S3Boto3Storage):

    
    
    location = settings.STATICFILES_LOCATION
    
    def _clean_name(self, name):
        return name
    
    def _normalize_name(self, name):
        if not name.endswith('/'):
            name += "/"
    
        name += self.location
        return name
    

# media storages

class MediaStorage(S3Boto3Storage):

    
    
    location = settings.MEDIAFILES_LOCATION
    
    def _clean_name(self, name):
        return name
    
    def _normalize_name(self, name):
        if not name.endswith('/'):
            name += "/"
    
        name += self.location
        return name
    

Finally - (on Python 3 at least) DON'T use

    
    
    {% load static from staticfiles %}
    

in your templates.

Stick with:

    
    
    {% load static %}
    

