我正在构建一个私有文件上传网站。 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对象,但这不会。
答案 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的目的,即使可以做到这一点。