我希望管理员用户能够附加与我的模型相关的私人任意文件(一个共享点)。由于 Django 主要用作发布平台,所以到目前为止我发现的所有示例都将文件上传到静态目录,在那里它们可以公开访问。如何允许管理员上传与它们相关的模型具有相同身份验证权限的文件?
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} 之类的 url 创建一个视图,您可以在其中执行必要的业务逻辑来控制对其的访问(您可能希望使路径参数更加详细,以便您可以捕获应用程序标签、模型和对象为访问控制而附加文件的 ID,例如 /media/{app_label}/{model}/{object_id}/{filename})
然后你就做
response = HttpResponse()
response['X-Accel-Redirect'] = "/protected" + filepath
return response
Bob 是你的叔叔 - 将向用户提供受保护的文件。
我认为最强大的方法是编写自定义文件存储
这并没有那么困难(但对于您的需求可能有点过分了)。然后你可以通过这种方式将你的自定义存储绑定到你的模型:
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)中。
干杯!