【问题标题】:Django app does not load images from AWS bucket's media folderDjango 应用程序不会从 AWS 存储桶的媒体文件夹加载图像
【发布时间】:2019-05-21 11:08:19
【问题描述】:

我正在使用django-oscar,并希望使用 AWS S3 提供我的静态文件。 为了配置我的 s3 存储桶,我创建了一个名为 aws 的模块,其中包含 conf.pyutils.py 文件。

在我的网站上,当我将图像上传到产品时,它会以正确的路径上传到我的 aws s3 存储桶,但在很短的时间后,路径从 https://mybucketname.s3.amazonaws.com/media/cache/..../image.jpg 变为 https://mybucketname.s3.amazonaws.com/cache/..../image.jpg

图片位于我存储桶的media 文件夹中。

我在 heroku 上托管我的网络应用程序,静态文件已正确提供,但问题发生在媒体文件夹中。

这是我的代码 -

utils.py 文件

from storages.backends.s3boto3 import S3Boto3Storage

StaticRootS3BotoStorage = lambda: S3Boto3Storage(location='static')
MediaRootS3BotoStorage  = lambda: S3Boto3Storage(location='media')

staticmedia 是我的 s3 存储桶上的文件夹

conf.py

import datetime

AWS_ACCESS_KEY_ID = "xxx"
AWS_SECRET_ACCESS_KEY = "yyy"

AWS_PRELOAD_METADATA = True
AWS_QUERYSTRING_AUTH = False
AWS_DEFAULT_ACL = None 

DEFAULT_FILE_STORAGE = 
'myproject.aws.utils.MediaRootS3BotoStorage'
STATICFILES_STORAGE = 
'myproject.aws.utils.StaticRootS3BotoStorage'
AWS_STORAGE_BUCKET_NAME = 'mybucket-name'
S3DIRECT_REGION = 'us-east-2'
S3_URL = '//%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME
MEDIA_URL = '//%s.s3.amazonaws.com/media/' % AWS_STORAGE_BUCKET_NAME
MEDIA_ROOT = MEDIA_URL
STATIC_URL = S3_URL + 'static/'
ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'

two_months = datetime.timedelta(days=61)
date_two_months_later = datetime.date.today() + two_months
expires = date_two_months_later.strftime("%A, %d %B %Y 20:00:00 
GMT")

AWS_HEADERS = { 
    'Expires': expires,
    'Cache-Control': 'max-age=%d' % 
    (int(two_months.total_seconds()), ),
}

我的 settings.py 我添加了这个

from myproject.aws.conf import *

我应该怎么做才能解决这个问题?

【问题讨论】:

    标签: python django amazon-s3 django-oscar django-storage


    【解决方案1】:

    为你的 Django 应用配置的文件存储系统应该是一个实现了django.core.files.storage.Storage的类[1]

    storages.backends.s3boto3.S3Boto3Storage 已经实现了这个存储接口。 [2]

    utils.py 中的StaticRootS3BotoStorage 设置为lambdaStorage 系统会以正确的location 值延迟实例化;但是存储类本身的location 属性永远不会改变。 [3]

    location = setting('AWS_LOCATION', '')
    

    当项目设置更改时,Django 会清除存储实例的属性。 [4] 这样当location属性在存储系统上解析时,它有效地查找类属性一(location值在上面的sn-p中显示)因为location实例中缺少属性。

    这种情况可以通过继承storages.backends.s3boto3.S3Boto3Storage 来解决。这保证了location 的值不会随着项目设置的变化而改变。

    class StaticRootS3BotoStorage(S3Boto3Storage):
        location = 'static'
    
    class MediaRootS3BotoStorage(S3Boto3Storage):
        location = 'media'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      相关资源
      最近更新 更多