django - 允许用户在不显示链接且不缓冲的情况下下载文件

标签 django http rackspace

我在 rackspace 云文件中托管了一些视频文件,每个用户都可以下载分配给他们的文件。

由于文件大小,在网络服务器(webfaction)中缓冲对象是不可行的

我尝试重定向到该文件,并将 Content-Disposition 设置为附件,但无济于事。

如果有的话,我有哪些选择?

理想情况下,在单击指向 example.com/video/42/download/之类的链接后,文件下载会像来 self 的域一样弹出,这样我就可以处理身份验证等。但我不确定如何构建我的观点以实现这一点。

最佳答案

您可能最好使用 HttpResponseRedirect除非我有什么误解...?

# urls.py
from django.http import HttpResponseRedirect
url(r'^applications/(?P<id>\d+)/image\.png$', 'core.views.serve_image', name='image'),

这将在 http://localhost/application/12345/image.png 提供一个 View .

# core/views.py

def serve_application_image(request, id):
    # redirect to temp_url
    application = Application.objects.get(id=id)
    return HttpResponseRedirect(application.image.temp_url)

这会将点击该 URL 的用户重定向到 Rackspace URL。它可以用于在 html 中嵌入视频、图像等 <img>标签之类的。浏览器客户端能够看到重定向的 URL(在 rackcdn.com)。


我已将我的应用配置为服务 temp_url 15 分钟后过期的属性。临时 URL 是为 Rackspace.com 上的 CDN 创建的,他们的文档可能超出了这个问题的范围,所以我暂时不提它……但是我用来子类化的代码 ImageField使用 .temp_url 提供图像属性代码如下:

import hmac
from hashlib import sha1
from time import time
class ImageFieldFile_With_Temp_Url(ImageFieldFile):
    @property
    def temp_url(self):

        container_name, file_name = (self.storage.container.name, self.name)

        key = settings.CUMULUS['CUSTOM__X_ACCOUNT_META_TEMP_URL_KEY']
        public_url = settings.CUMULUS['CUSTOM__X_STORAGE_URL']
        method = 'GET'
        expires = int(time() + settings.CUMULUS['CUSTOM__X_TEMP_URL_TIMEOUT'])

        url = '%s/%s/%s' % (public_url, container_name, file_name)
        base_url, object_path = url.split('/v1/')
        object_path = '/v1/' + object_path

        hmac_body = '%s\n%s\n%s' % (method, expires, object_path)
        sig = hmac.new(key, hmac_body, sha1).hexdigest()
        return '%s%s?temp_url_sig=%s&temp_url_expires=%s' % (base_url, object_path, sig, expires)

class ImageField_With_Temp_Url(models.ImageField):
    attr_class = ImageFieldFile_With_Temp_Url
models.ImageField = ImageField_With_Temp_Url

请注意,我使用的是 django-cumulus用这种方法进行项目。

在 models.py 顶部的任何位置导入此函数将扩展 ImageField有了新的 temp_url属性(因为我将其分配给 models.ImageField ...)。

关于django - 允许用户在不显示链接且不缓冲的情况下下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26266067/

相关文章:

open-source - 开源亚马逊 EC2?

django - Heroku 上的内存监控

python - django nginx静态文件404

node.js - 使用node js上传大文件

http - Java 网络服务器应用程序是否有任何推送方式?

symfony - 在 Laravel/Lumen 中找不到类 'Symfony\Component\EventDispatcher\Event'

validation - 安装 cloudfoundry 会出现 Openstack 身份验证错误;如何调试开源项目?也就是说,bosh 在 Openstack 上?

python - 将表单传递到 HTML 页面 django

Django Rest 框架 : pass user from view to serializer

http - 201 的响应实体类型已创建?