使用Django提供可下载文件

273

我希望网站上的用户能够下载文件,但文件路径被模糊处理,以防止其直接下载。

例如,我希望URL看起来像这样:http://example.com/download/?f=somefile.txt

在服务器上,我知道所有可下载的文件都存储在文件夹/home/user/files/中。

是否有一种方法可以让Django提供该文件以供下载,而不是试图查找URL和View以将其显示出来?


2
为什么不直接使用Apache来完成这个任务呢?Apache比Django更快、更简单地提供静态内容服务。 - S.Lott
29
我不使用Apache,因为我不希望文件在没有Django权限的情况下可以访问。 - damon
3
如果你想考虑用户权限,你需要通过Django的视图来提供文件。 - Łukasz
139
没问题,这就是为什么我问这个问题的原因。 - damon
15个回答

2
Django建议您使用另一个服务器来提供静态媒体(在同一台机器上运行的另一个服务器也可以)。他们推荐使用这样的服务器,例如lighttp
这很容易设置。但是,如果“somefile.txt”是按请求生成的(内容是动态的),则您可能希望Django来提供它。 Django文档-静态文件

0

另一个值得一看的项目:http://readthedocs.org/docs/django-private-files/en/latest/usage.html。看起来很有前途,但我自己还没有测试过。

基本上,该项目抽象了mod_xsendfile配置,并允许您执行以下操作:

from django.db import models
from django.contrib.auth.models import User
from private_files import PrivateFileField

def is_owner(request, instance):
    return (not request.user.is_anonymous()) and request.user.is_authenticated and
                   instance.owner.pk = request.user.pk

class FileSubmission(models.Model):
    description = models.CharField("description", max_length = 200)
        owner = models.ForeignKey(User)
    uploaded_file = PrivateFileField("file", upload_to = 'uploads', condition = is_owner)

1
request.user.is_authenticated是一个方法而不是属性。 (not request.user.is_anonymous())与request.user.is_authenticated()完全相同,因为is_authenticated是is_anonymous的相反。 - explodes
@explodes 更糟糕的是,这段代码直接来自于“django-private-files”的文档... - Armando Pérez Marqués

0

0

我曾经做过一个关于这个的项目。你可以看看我的 Github 仓库:

https://github.com/nishant-boro/django-rest-framework-download-expert

这个模块提供了一种简单的方式,在Django Rest Framework中使用Apache模块Xsendfile来提供文件下载。它还具有一个额外的功能,只向属于特定组的用户提供下载服务。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接