Django as S3 proxy

前端 未结 2 468
小蘑菇
小蘑菇 2021-01-02 23:06

I extended a ModelAdmin with a custom field \"Download file\", which is a link to a URL in my Django project, like:

http://www.myproject.com/downloads/1
         


        
2条回答
  •  死守一世寂寞
    2021-01-02 23:43

    Yes, you can use Django as a proxy to stream your S3 files to the user.

    1. Generate a standard S3 url for your file.
    2. Use the requests library to fetch your file in streaming mode.
    3. Use Django to serve up the raw stream to the user.
    import requests, boto3
    from django.views.generic import View
    from django.http.response import HttpResponse
    
    class MediaDownloadView(View):
    
        def get(self, request, *args, **kwargs):
            s3 = boto3.resource(
                service_name='s3', aws_access_key_id='XXX_AWS_ACCESS_KEY_ID',
                aws_secret_access_key='XXX_AWS_ACCESS_KEY',
            )
            url = s3.meta.client.generate_presigned_url(
                ClientMethod="get_object", ExpiresIn=3600,
                Params={
                    "Bucket": 'XXX_BUCKET_NAME',
                    "Key": 'XXX_OBJECT_KEY',
                },
            )
            r = requests.get(url=url, stream=True)
            r.raise_for_status()
            response = HttpResponse(r.raw, content_type='audio/mp3')
            response['Content-Disposition'] = 'inline; filename=music.mp3'
            return response
    

提交回复
热议问题