Django作为S3代理
我使用自定义字段“下载文件”扩展了ModelAdmin,该字段是指向Django项目中URL的链接,如:Django作为S3代理,django,django-admin,amazon-s3,amazon-web-services,boto,Django,Django Admin,Amazon S3,Amazon Web Services,Boto,我使用自定义字段“下载文件”扩展了ModelAdmin,该字段是指向Django项目中URL的链接,如: http://www.myproject.com/downloads/1 在这里,我想提供一个存储在S3存储桶中的文件。bucket中的文件不是公共可读的,用户可能无法直接访问它。现在我想 避免将文件加载到服务器内存中(这些是多gb文件) 避免在服务器上有临时文件 理想的解决方案是让django充当代理,将S3块直接流式传输给用户。我使用boto,但没有发现流式处理块的可能性。 有什么
http://www.myproject.com/downloads/1
在这里,我想提供一个存储在S3存储桶中的文件。bucket中的文件不是公共可读的,用户可能无法直接访问它。现在我想
- 避免将文件加载到服务器内存中(这些是多gb文件)
- 避免在服务器上有临时文件
谢谢。与其代理,为什么不直接重定向 使用www.myproject.com/downloads/1上的django视图提供到S3存储URL的HTTP重定向-可以生成有时间限制的经过身份验证的URL,例如,请参见此处
然后,客户端直接从S3下载文件,但内容仍然是安全的,必须通过Django应用程序进行访问是的,您可以使用Django作为代理向用户传输S3文件
请求
库以流模式获取文件导入请求,bot3
从django.views.generic导入视图
从django.http.response导入HttpResponse
类MediaDownloadView(视图):
def get(自我、请求、*args、**kwargs):
s3=boto3.0资源(
服务\u name='s3',aws\u访问\u密钥\u id='XXX\u aws\u访问\u密钥\u id',
aws_secret_access_key='XXX_aws_access_key',
)
url=s3.meta.client.generate\u presigned\u url(
ClientMethod=“get_object”,ExpiresIn=3600,
Params={
“Bucket”:“XXX_Bucket_NAME”,
“键”:“XXX\u对象\u键”,
},
)
r=requests.get(url=url,stream=True)
r、 为_状态()提出_
response=HttpResponse(r.raw,content_type='audio/mp3')
响应['Content-Disposition']='内联;filename=music.mp3'
返回响应
我希望这里还有其他答案。我需要相同的东西,除了我需要添加标题“内容处置:附件”。