Django:让用户下载一个大文件

时间:2012-09-13 14:18:59

标签: python django apache python-2.7 django-views

我正在构建一个私有文件上传网站。 Alice上传了一个文件,Bob下载了它。

Alice和Bob以外的人不应该有访问权限。我第一次考虑给文件一个复杂的名称(http://domain/download/md5sum.zip),但我想要一个过期的链接。像http://domain/download/tempkey/aaa123/file.zip这样的东西。这将使我更好地控制文件下载和日志记录。

我发现了这个:https://stackoverflow.com/a/2900646。它表明了以下内容:

class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):

    def do_GET(self):
        # The URL the client requested
        print self.path

        # analyze self.path, map the local file location...

        # open the file, load the data
        with open('test.py') as f: data = f.read()

        # send the headers
        self.send_response(200)
        self.send_header('Content-type', 'application/octet-stream') # you may change the content type
        self.end_headers()
        # If the file is not found, send error code 404 instead of 200 and display a message accordingly, as you wish.

        # wfile is a file-like object. writing data to it will send it to the client
        self.wfile.write(data)

但是如何在Django中使用它呢?一个views函数应该返回一个HTTPResponse对象,但这不会。

1 个答案:

答案 0 :(得分:4)

不建议使用Django下载大文件。通常你有一个前端多路复用器,比如NginX,只使用Django来验证文件。

然后,如果验证下载,您将向多路复用器发出信号。对于NginX,您可以设置一个特殊的标题(“X-Accel-Redirect”)来指向本地文件的真实位置。 Django只会提供几个字节,所有繁重的工作都将由NginX占用;同时原始URL将是Django的URL,因此无法绕过安全性。

请参阅:http://wiki.nginx.org/X-accel

您可以在此处找到有关如何提供静态文件(可通过身份验证进行扩展)的说明

https://docs.djangoproject.com/en/dev/howto/static-files/

但正如页面所说,“一个快速而肮脏的帮助者视图”并非用于生产或高流量网站。这不是Django的目的,即使可以做到这一点。