【问题标题】:django file field not saving file to s3 bucket folder when updating更新时django文件字段未将文件保存到s3存储桶文件夹
【发布时间】:2022-11-02 04:42:59
【问题描述】:

我正在将文件上传到以下路径中的 s3 存储桶:

存储桶/文件夹/{custom_id}/文件

我有以下在模型中调用的方法。在 DRF Post 方法中,文件被正确保存到 s3,我能够在 GET 中检索路径。但是当我尝试在 PUT 方法中上传新文件时,文件名被保存在 db 中,但文件没有保存在 s3 存储桶中。

自定义上传路径

    def upload_path_handler(instance, filename):
        return f'{FILES_FOLDER}/{id}/{filename}'

In Models.py

cc_file = models.FileField(
    db_column='CCFilename', blank=True, null=True, upload_to=upload_path_handler

)

此方法在 DRF 的 POST API 调用中起作用。如果文件在更新字段时发生更改,如何将新文件保存到 s3。

【问题讨论】:

  • 当您说新文件名正在保存在数据库中时。它是完整的 url 还是只是文件名?

标签: django amazon-web-services amazon-s3 django-rest-framework boto3


【解决方案1】:

你可以尝试什么..

1. 确保您拥有正确的 S3 权限和策略。通过 AWS S3 控制台中的权限选项卡访问特定存储桶的“策略”。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<your_bucket_name>/*"
        },
        {
            "Sid": "Statement2",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::<your_bucket_name>/images/"
        }
    ]
}

2. 在你的项目环境中安装 WhiteNoiseMiddleware & django-storages。

pip install whitenoise
pip install django-storages

3.在settings.py中添加以下内容到MIDDLEWARE=

'whitenoise.middleware.WhiteNoiseMiddleware',

4. 需要在settings.py 中添加以下内容才能正确处理来自 S3 的 URL。处理由 django 中间件和 django-storages 自动完成

STATICFILES_LOCATION = 'static'
MEDIAFILES_LOCATION = 'media'

AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % os.environ['BUCKET_NAME']
AWS_ACCESS_KEY_ID = os.environ['AWS_KEY']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_ACC_KEY']
AWS_STORAGE_BUCKET_NAME = os.environ['BUCKET_NAME']
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3StaticStorage'

MEDIA_ROOT = os.path.join (BASE_DIR, 'static/images/')
STATIC_ROOT = os.path.join (BASE_DIR, 'static')

STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)

5. 用于瞄准上传到精确的 S3 Bucket 文件夹。 (额外的)

在 setting.py 中设置媒体根目录:

MEDIA_ROOT = os.path.join (BASE_DIR, 'static/images/')

在 models.py 中使用 ImageFiled 并添加 upload_to= 获取文件夹名称并在第一次上传时创建它!:

image_variable = models.ImageField(null=True, default="{default_filename)", upload_to='uploads/') 

参考:django-storageswhiteNoiseMiddelwareS3 Access Troubleshooting

【讨论】:

    猜你喜欢
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2020-02-26
    相关资源
    最近更新 更多