文件送达不能忍受缓慢从亚马逊S3亚马逊、缓慢、文件

2023-09-11 09:06:01 作者:失望撞满怀

我在Heroku上一个Django应用程序,它从亚马逊S3存储服务的静态文件。我用博托库,并随后在网站上的指导。 我能做些什么,以加快文件传输?

I have a django app on heroku which serves the static files from amazon s3 bucket. I use boto library and followed the guide on the website. What can I do to speed up the file transfers?

一些code:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'xxxx'
AWS_SECRET_ACCESS_KEY = 'xxxx'
AWS_STORAGE_BUCKET_NAME = 'boxitwebservicebucket'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
STATIC_URL = 'http://' + AWS_STORAGE_BUCKET_NAME + '.s3.amazonaws.com/'

视图

class GetFileContent(View):
    def get(self,request, userName, pk):
        user = User.objects.filter(username = userName)
        filtered = Contentfile.objects.filter(pk = pk, published=True, file_owner = user)
        data = filtered[0].content
        filename = filtered[0].title + "." + filtered[0].file_type
        response = HttpResponse(data, content_type='application/force-download')
        response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)
        return response
        pass

我怀疑Django是提供文件,即使它所在的S3服务器上,我怎样才能将用户引导到S3的直接链接?

I suspect django is serving the file even though it sits on the s3 server, How can I direct the user to the s3 link directly?

推荐答案

下面是我如何做到这一点 - 它不觉得慢,我说:

Here is how I do it - It does not feel slow to me:

models.py:

models.py:

class Document(models.Model):
    id = UUIDField(primary_key = True)
    extension = models.CharField(max_length = 5)
    created_on = CreationDateTimeField()
    labels = models.ManyToManyField(Label)

    def url(self, bucket):
        url = get_s3_url(bucket, '' + str(self.id) + str(self.extension) + '')
            return 'https' + url[4:]

views.py:

views.py:

import urllib2


@login_required
def view(request, document_id):
    document = Document.objects.get(id = document_id)

    response_file = urllib2.urlopen(document.url(request.user.profile.aws_documents_bucket_name))

    response = HttpResponse(response_file.read(), mimetype = document.mimetype)
    response['Content-Disposition'] = 'inline; filename=' + str(document.id) + document.extension

    return response

utils.py:

utils.py:

from boto.s3.connection import S3Connection
from boto.s3.key import Key
from django.conf import settings


def get_s3_url(bucket, filename):
    s3 = S3Connection(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
    key = s3.create_bucket(bucket).get_key('' + filename + '')
    return key.generate_url(3600, "GET", None, True, True) # This gives an authenticated url available for only a short time period (by design)

我的个人用户或用户组已经指定在配置文件对象引用水桶。存储在settings.py AWS证书。

My individual users or groups of users have designated buckets referenced in the profile object. AWS Credentials stored in settings.py.