Django作为S3代理

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,但没有发现流式处理块的可能性。 有什么

我使用自定义字段“下载文件”扩展了ModelAdmin,该字段是指向Django项目中URL的链接,如:

http://www.myproject.com/downloads/1
在这里,我想提供一个存储在S3存储桶中的文件。bucket中的文件不是公共可读的,用户可能无法直接访问它。现在我想

  • 避免将文件加载到服务器内存中(这些是多gb文件)
  • 避免在服务器上有临时文件
理想的解决方案是让django充当代理,将S3块直接流式传输给用户。我使用boto,但没有发现流式处理块的可能性。 有什么想法吗


谢谢。

与其代理,为什么不直接重定向

使用www.myproject.com/downloads/1上的django视图提供到S3存储URL的HTTP重定向-可以生成有时间限制的经过身份验证的URL,例如,请参见此处


然后,客户端直接从S3下载文件,但内容仍然是安全的,必须通过Django应用程序进行访问

是的,您可以使用Django作为代理向用户传输S3文件

  • 为您的文件生成标准的S3URL
  • 使用
    请求
    库以流模式获取文件
  • 使用Django向用户提供原始流
  • 导入请求,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'
    返回响应
    
    我希望这里还有其他答案。我需要相同的东西,除了我需要添加标题“内容处置:附件”。