自定义存储后端:实现预签名直传S3并记录文件元数据
在Django中集成AWS S3预签名URL,使用户直接上传到S3,后端只记录元数据。 · 难度:入门 · +10XP
自定义存储后端:实现预签名直传S3并记录文件元数据
大多数教程展示的是Django文件通过服务器上传到S3,这会造成带宽瓶颈。本教程将教你如何编写一个自定义存储后端,该后端不直接处理文件流,而是生成预签名上传URL和下载URL。用户通过前端直接上传到S3桶,后端仅保存文件路径、大小、哈希等元数据。你将深入理解BaseStorage的save和url方法改造,以及如何结合boto3生成限时凭证。此架构可大幅降低应用服务器负载,适合高并发媒体上传场景。
from django.core.files.storage import Storage
from django.core.files.base import ContentFile
import boto3
class PresignedS3Storage(Storage):
def url(self, name):
client = boto3.client('s3')
return client.generate_presigned_url(
'get_object',
Params={'Bucket': self.bucket, 'Key': name},
ExpiresIn=3600
)