【问题标题】:Files served unbearably slow from amazon s3亚马逊 s3 提供的文件速度慢得令人难以忍受
【发布时间】:2014-01-09 03:42:27
【问题描述】:

我在 heroku 上有一个 django 应用程序,它提供来自亚马逊 s3 存储桶的静态文件。我使用 boto 库并按照网站上的指南进行操作。 我可以做些什么来加快文件传输速度?

部分代码:

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 链接?

【问题讨论】:

  • 我建议改为通过 CloudFront 从 S3 提供文件。
  • 目前,我处于演示阶段,我想保持一切免费。但是我不确定这是问题所在,我开始怀疑实际上即使我使用的是亚马逊 s3 存储,Django 也在提供文件而不是亚马逊,因为当我查看我的网络流量时,我看不到任何链接通往亚马逊。
  • CloudFront 每月前 10 TB 的输出仅需 0.12 美元。这是相当实惠的:)。如果您的网络流量表明您的文件正在由 Django 提供服务,那完全是另一个问题。
  • 是的,这是我第一次尝试使用 Django 提供文件,我可以找到很多关于如何设置静态文件以供 django 服务的站点的文档,但是不是关于如何提供可下载文件,我猜这将是一个更常见的问题。
  • 如果你在这里查看 django-storages,你会看到 url 函数接受一个标头参数。 bitbucket.org/david/django-storages/src/… 您应该尝试使用 django 存储为该文件生成一个 url,确保在标头中传递 Content-Disposition 'attachment',然后返回一个 302 重定向到该 url。如果一切顺利,文件将从亚马逊提供正确的标题,强制浏览器下载而不是打开 url。

标签: django amazon-s3 boto django-staticfiles


【解决方案1】:

这是我的做法 - 我并不觉得慢:

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:

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:

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 凭证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2018-01-22
    • 2015-02-03
    • 2016-11-20
    • 1970-01-01
    • 2019-06-22
    相关资源
    最近更新 更多