Django amazon s3 SuspiciousOperation

Поэтому, когда я пытаюсь получить доступ к определенному изображению на S3 из своего браузера, все работает нормально. Но когда это делает python, я получаю ошибку SuspiciousOperation. Моя статическая папка общедоступна на S3, поэтому я действительно понятия не имею, откуда это берется.

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.

Мои настройки:

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

На данный момент я могу обойти это, но это не долгосрочное решение. есть идеи?


person psychok7    schedule 22.08.2014    source источник


Ответы (1)


Ответ Данигосы в этой ветке - это ответ: django-storages и amazon s3 - подозрительная операция

Создайте специальный класс хранилища, как описано в этом сообщении: Использование Amazon S3 для хранения статических и мультимедийных файлов сайтов Django.

Затем переопределите _normalize_name следующим образом:

from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage


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


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

Наконец - (по крайней мере, на Python 3) НЕ используйте

{% load static from staticfiles %}

в ваших шаблонах.

Придерживайтесь:

{% load static %}
person ekivemark    schedule 04.10.2016
comment
Я считаю, что это должно быть name = self.location + name вместо name += self.location - person Pythonist; 12.11.2017