Django私有文件上传

时间:2013-04-11 14:10:35

标签: django file-upload permissions file-permissions

我希望管理员用户能够将与我的模型相关的私人任意文件附加到共享点。由于Django主要用作发布平台,到目前为止我发现的所有示例都将文件上传到静态目录,在那里它们可以公开访问。如何允许管理员上传与其相关模型具有相同auth权限的文件?

2 个答案:

答案 0 :(得分:2)

您可以做的是在您的Web服务器中设置一个仅被归类为内部的特定位置,Django应用程序中的业务逻辑将发送带有特定标头的重定向,以允许您的Web服务器静态地提供文件

我之前使用X-Accel-Redirect对Nginx做过这个,所以我将把它用于我的例子,但我相信在Apache2和其他Web服务器中有相同的功能(X-Sendfile,我认为?)。

在您的Nginx配置中,设置一个位置,该位置提供您上传受访问保护文件的目录:

location /protected/ {
    internal;
    alias /var/www-priv/;
}

此目录中的文件无法通过/ protected / {filepath}的URL从外部访问,但如果您从Django应用程序返回带有标题X-Accel-Redirect = / protected / {filepath}的响应,

使用/ media / {filepath}等网址创建一个视图,在其中执行必要的业务逻辑来控制对它的访问(您可能希望使路径参数更加详细,以便您可以捕获应用程序标签,为了访问控制而附加文件的模型和对象ID,例如/ media / {app_label} / {model} / {object_id} / {filename})

然后你就做了

response = HttpResponse()
response['X-Accel-Redirect'] = "/protected" + filepath
return response

而Bob是你的叔叔 - 用户将获得受保护的文件。

答案 1 :(得分:1)

我认为最有效的方法是撰写custom file storage

这并不是那么困难(但可能对你的需求有点过分)。然后,您可以通过以下方式将自定义存储绑定到模型:

from django.db import models
from django.db.models.fields.files import FileField
from myapp.storage import MyCustomStorage

class MyModel(models.Model):
    path = FileField( ... , storage=MyCustomStorage(), blank=False)

然后,您可以在自定义存储类中实现业务逻辑。这样做,您可以将私人文件存储在本地文件系统,数据库或Google AppEngine等远程系统中。

干杯!