可疑操作试图在Django中将本地映像上传到S3

时间:2019-01-26 20:13:42

标签: python django amazon-s3 django-models

我正在开发一个Django项目,其中的用户将个人资料图片另存为ImageField,目前存储在S3中。

class MyUser(models.Model):
    user = models.OneToOneField(User, unique=True)
    picture = models.ImageField(max_length=255, upload_to=get_user_pic_path)

def get_user_pic_path(instance, filename):
    return os.path.join('user_pics', instance.user.username, filename)

和相关的settings.py

# Amazon S3 stuff
AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
AWS_STORAGE_BUCKET_NAME = os.environ['AWS_STORAGE_BUCKET_NAME']
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME

AWS_LOCATION = 'static'
MEDIAFILES_LOCATION = 'media'

# URL prefix for static files.
STATIC_ROOT = '/%s/' % AWS_LOCATION
STATIC_URL = '//%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

# Media urls
MEDIA_ROOT = '/%s/' % MEDIAFILES_LOCATION
MEDIA_URL = '//%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

该项目在生产中工作,它允许用户通过拍摄网络摄像头照片并将其保存到S3来创建帐户,但是在尝试设置本地用户进行测试时,我得到了SuspiciousOperation。我有一个由python manage.py create_test_user调用的命令,它可以:

def handle(self, *args, **options):
    pic_path = os.path.join(settings.BASE_DIR, 'static', 'img', 'test_img.jpg')

    user_list, pic_list = [], []
    for i in range(5):
        # create user objects associated with each MyUser
        u = User.objects.create_user(
            username='bickeree_'+str(i),
            email=str(i)+'@gmail.com',
            password='1234'
        )
        u.first_name = 'Test User'
        u.last_name = str(i)
        u.save()

        # we store the picture so we can properly close it
        pic_list.append(File(open(pic_path, 'rb')))
        user_list.append(MyUser(
            user=u,
            picture=pic_list[-1],
        ))

    # create all of the MyUser objects
    MyUser.objects.bulk_create(user_list)

    # clean up the images
    for pic in pic_list:
        pic.close()

运行此命令将导致:

django.core.exceptions.SuspiciousOperation: Attempted access to '/Users/username/Documents/projectname/static/img/test_img.jpg' denied.

如何解决此错误?

0 个答案:

没有答案