0

我正在建立一个私人文件上传网站。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 中工作呢?视图函数应该返回一个 HTTPResponse 对象,而这不是。

4

1 回答 1

4

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

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

见:http ://wiki.nginx.org/X-accel

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

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

但正如该页面所说,它是“快速而肮脏的帮助视图”,不适用于生产或高流量站点。这不是 Django 的设计初衷,即使它可以做到。

于 2012-09-13T14:32:04.873 回答