公共AWS S3存储桶中AWS_QUERYSTRING_AUTH=False对缓存缩略图无效
问题解决思路
核心结论:不需要刷新S3缓存,问题出在缓存文件权限与视图缓存的旧URL上
1. 修复S3缓存缩略图的访问权限
之前开启AWS_QUERYSTRING_AUTH = True时,sorl生成的缩略图依赖签名URL访问,可能未设置公共可读ACL。关闭签名后,无签名URL需要文件本身具备public-read权限才能访问,否则会触发Access Denied。
解决方法:
批量更新已有缓存文件的ACL:
使用AWS CLI执行以下命令,递归修改S3缓存目录下所有文件的权限:aws s3 cp s3://mybucket/cache/ s3://mybucket/cache/ --recursive --acl public-read或者用boto3编写脚本批量处理:
import boto3 s3 = boto3.client('s3') bucket_name = 'mybucket' prefix = 'cache/' paginator = s3.get_paginator('list_objects_v2') for page in paginator.paginate(Bucket=bucket_name, Prefix=prefix): for obj in page.get('Contents', []): s3.put_object_acl( Bucket=bucket_name, Key=obj['Key'], ACL='public-read' )配置新缩略图默认权限:
在Django配置文件中添加以下设置,确保后续生成的缩略图自动设置为公共可读:AWS_DEFAULT_ACL = 'public-read' THUMBNAIL_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
2. 清空全站视图缓存
之前Memcached缓存的视图内容中,可能包含旧的带签名URL,即使文件权限修复后,这些旧URL可能已失效(签名过期或不符合当前配置)。需要清空缓存让页面重新生成无签名的有效URL。
解决方法:
执行Django内置的缓存清理命令:
python manage.py clearcache
或者直接通过Memcached管理工具清空缓存实例。
内容的提问来源于stack exchange,提问作者Panos
相关产品推荐
相关产品推荐

