在django中使用逻辑提供静态文件(保留downloadcount)

nik*_*sfi 5 apache django static mod-wsgi

我有一个网站,使用户可以下载某些文件.但是我想保留每个文件的下载次数,所以按照通常的方式将静态文件放在不同的子域上然后让apache执行繁重的工作并不像HttpResponse将用户重定向到子域名那么好因为那时用户'看到'正确的下载URL,因此可以下载文件而不增加下载次数.我可以构建一个视图然后服务()文件,但我担心"大胖子免责声明".你/你如何实现这个?我很自然,我不是唯一有这个问题的人.

关于平台:我正在使用apache和mod_wsgi.

谢谢

小智 5

我们已经实现了一个系统,我们需要控制对(大)静态文件的下载访问,自然不希望Django自己为它们服务.我们提出了一个Django应用程序的方案,在验证用户被允许下载文件后(或者在你的情况下增加一个计数器)我们会创建一个随机命名的文件符号链接,Apache可以访问该文件(注意:确保目录索引关闭等),然后将用户重定向到Apache提供的符号链接.

我们有一个"清理"cronjob,它在创建后一分钟清理符号链接,所以如果他们想再次下载它们,他们必须通过Django并重新计算.现在,从理论上讲,他们可以在那段时间内不止一次下载,但这可能会发生吗?你可以清理超过每一分钟:Apache只需要在下载开始时存在符号链接,而不是整个事情.

我很想知道其他人是如何解决这个问题的,因为我同意OP这是一个常见的情况.


Sea*_*nOC 1

psj的答案绝对是一种可行的选择。您应该研究的另一个选择是在 apache 前面放置一个反向代理服务器,例如Perlbal,它支持“X-REPROXY-URL”标头。

一旦你有了反向代理服务器,你就可以发送一个带有“X-REPROXY-URL”标头的响应,而不是向用户发送重定向响应,该标头设置为代理服务器可以访问但用户不能访问的 URL t。然后,代理服务器将从您在标头中发送的位置读取文件,然后将其提供给您的客户端。他们将以高效的方式完成此操作,并且由于您的 Django 应用服务器需要发送的只是带有标头集的响应,因此可以自由地处理另一个请求。