首页 > 解决方案 > 在heroku上运行时Django没有正确上传到S3

问题描述

我正在尝试使用 S3 上传图像字段,在我的本地环境中它工作得非常好,所以我很困惑,为什么当它在 heroku 上时,它将 URL 读取为双字符串加上 s3%,这是没有意义的。所有其他静态文件都可以正常工作。

我已经尝试过更改 STATICFILES_STORAGE 和 DEFAULT_FILE_STORAGE ,甚至将其命名为相同的东西,但只会产生更多错误,我对为什么这不起作用感到困惑。

def vehicle_view(request, *args, **kwargs):
    vehicles = Vehicle.objects.all()
    simple = get_object_or_404(Vehicle, id=2)
    context = {
        "vehicles": vehicles,
        "simple": simple
    }
    return render(request, "vehicle/vehicle.html", context)
class Vehicle(models.Model):
    vehicle_type = models.CharField(max_length=255)
    vehicle_id = models.CharField(max_length=255)
    image_url = models.ImageField(upload_to="img/", blank=True, null=True)
    checked = models.BooleanField(default=False)
    nfmc_step = models.ManyToManyField(TM, related_name='step')
    AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
    AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
    AWS_STORAGE_BUCKET_NAME = os.getenv('AWS_STORAGE_BUCKET_NAME')
    AWS_DEFAULT_ACL = 'public-read'
    AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
    AWS_S3_OBJECT_PARAMETERS = {'CacheControl': 'max-age=86400'}
    # s3 static settings
    AWS_S3_FILE_OVERWRITE = True
    AWS_LOCATION = 'static'
    STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{AWS_LOCATION}/'
    STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
    STATICFILES_LOCATION = 'static'
    MEDIAFILES_LOCATION = 'media'
{% load static %}
 {% for vehicle in vehicles %}
    <div class="col">
        <div class="card" style="width: 18rem;">
            <img src="{% static vehicle.image_url.url %}" class="card-img-top" alt="...">
 {% endfor %}



Expected result as in my local machine: https://project-name.s3.amazonaws.com/static/1.jpg

What I get: https://project-name.s3.amazonaws.com/static/https%3A/project-name.s3.amazonaws.com/static/img/2_aeS9ZS2.jpg

标签: pythondjangoherokuamazon-s3django-models

解决方案


推荐阅读