【发布时间】: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