什么';这是一个Django/Python解决方案,为人们下载文件提供一次性url?

什么';这是一个Django/Python解决方案,为人们下载文件提供一次性url?,python,django,url,proxy,download,Python,Django,Url,Proxy,Download,我正在寻找一种方法,在活动中向某人出售一张卡片,卡片上有一个独特的代码,他们可以在以后使用该代码,以便只下载一次文件(mp3、pdf等),并屏蔽真实的文件位置,这样一个下载文件的精明人就不能多次下载文件。最好将文件托管在AmazonS3上,以节省服务器所在位置的带宽 我对这些代码的想法是预先生成独特的代码,打印在卡片上,并将其存储在数据库中,该数据库还可以有一个字段来存储文件下载的次数。通过这种方式,我们可以设置允许用户下载文件的尝试次数 我需要说明的部分是如何隐藏/屏蔽原始文件位置,这样人们就

我正在寻找一种方法,在活动中向某人出售一张卡片,卡片上有一个独特的代码,他们可以在以后使用该代码,以便只下载一次文件(mp3、pdf等),并屏蔽真实的文件位置,这样一个下载文件的精明人就不能多次下载文件。最好将文件托管在AmazonS3上,以节省服务器所在位置的带宽

我对这些代码的想法是预先生成独特的代码,打印在卡片上,并将其存储在数据库中,该数据库还可以有一个字段来存储文件下载的次数。通过这种方式,我们可以设置允许用户下载文件的尝试次数

我需要说明的部分是如何隐藏/屏蔽原始文件位置,这样人们就不会窃取该url,然后根据需要多次下载该文件。我做过谷歌搜索,我要么没有使用正确的关键字搜索,要么已经没有太多的库或代码片段用于此类搜索

我猜我可能能够使用
django.views.static.service
装配一些东西,它充当实际文件和下载文件的用户之间的代理。我认为这种方法的唯一缺点是,我需要使用实际的web服务器,并且无法将文件存储在AmazonS3上


非常感谢您的任何建议或想法。

您可以使用一些简单的方法,例如。此功能在其他流行的Web服务器(如或)中也可用

它的工作原理是这样的:当您的应用程序(例如一个普通的PHP脚本)启用时,可以发送一个特殊的响应头,从而使Web服务器提供一个静态文件


如果你想让它与S3一起工作,你需要以这种方式处理每一个请求,这意味着流量将通过你的站点,从那里到AWS,再回到你的站点,再回到客户端。S3是否支持符号链接/别名?如果是这样,您可以将有效用户重定向到其中一个符号URL,并在几个小时后删除该符号链接。

。但是,我要警告不要使用单一下载方法,因为不能保证他们的第一次下载尝试会成功。也许使用一个时间到期方法代替

但用Django做这件事当然是可能的。以下是基本方法的概要:

  • 为这些文件设置django url
  • 使用GET参数(它是唯一的字符串)来标识要获取的文件
  • 保留一个数据库表,其中包含一个
    文件字段
    ,以便下载文件。此表将唯一字符串映射到文件系统中文件的位置
  • 要将文件用作下载,请在视图中设置响应头,如下所示:
path
是要提供服务的文件的位置)


由于我们使用此Django页面来提供文件,用户无法找到原始文件位置。

这是最基本的方法,但如果您提供大量这些文件,可能会使您的服务器受损,因为整个文件必须通过胖Python/Django服务器线程传输。是的,这不是一个超快速的解决方案,但在他的情况下,他的表现似乎不会成为问题。他必须向每个用户实际出售一张卡,所以我预计每天下载量不会接近100次。
with open(path, 'rb') as f:
    response = HttpResponse(f.read())
response['Content-Type'] = 'application/octet-stream';
response['Content-Disposition'] = 'attachment; filename="%s"' % 'insert_filename_here'
return response