如何知道Django中是否完成了下载

时间:2014-03-20 16:10:55

标签: python django download

在我们基于Django的网站上,用户可以下载“私人”文件。

在实习生验证后,这些文件可以通过Apache的X-Sendfile获得。代码如下:

if "Trident/" in request.META['HTTP_USER_AGENT']:
    content_disposition = 'attachment; filename="%s"' % iri_to_uri(smart_bytes(filename))
elif "Safari/" in request.META['HTTP_USER_AGENT'] and not \
     "Chrome/" in request.META['HTTP_USER_AGENT']:
    content_disposition = b'attachment; filename="%s"' % filename.encode("utf-8")
else:
    filename_encoded = ""
    str_chunk_size = 30
    for i in range(int(math.ceil(len(filename)/float(str_chunk_size)))):
        if i != 0:
            filename_encoded += " =?UTF-8?B?"
        else:
            filename_encoded += "=?UTF-8?B?"
        filename_encoded += base64.b64encode(smart_bytes(filename[i*str_chunk_size: (i+1)*str_chunk_size])) + "?="
    content_disposition = 'attachment; filename="%s"' % filename_encoded

response = HttpResponse(content_type='application/force-download; charset=utf-8')
response['Content-Disposition'] = content_disposition
response['X-Sendfile'] = smart_bytes(os.path.join(STORAGE_ROOT, f.storage_name))
response["Content-Length"] = f.size
return response

问题是我们需要知道下载是否到达最后一个字节。 此信息对安全性敏感,因此需要在服务器端获取。 (客户端的javascript不受信任)。

经过调查,我可以找到2个想法,但似乎没有一个想法成功。

  1. Apache的日志提供了有关URL +转移了多少字节的信息。 不幸的是,这不是在Django上下文中,如果多用户同时下载多个文件,解析和无法管理是很复杂的......这太糟糕了。

  2. Django的request_finished。不幸的是,它只用2个参数调用:

    • sender:处理程序类(不是对象!?)
    • 信号:没有什么可以让我们找到关于下载内容的任何内容的对象是成功的,有多少字节,......
  3. 这听起来好像我找不到任何有价值的方法来了解客户端是否可以成功下载文件。

    有什么想法吗?

0 个答案:

没有答案