我在网站的用户注册部分提供可下载的 PDF 和电子表格中的“敏感”信息。
有没有办法让 django 身份验证无需提供该媒体(并且不必使用基本身份验证手动登录)来保护该媒体?
我猜(祈祷)不是使用下面的伪代码来完成此操作的方法,但它有助于更好地说明最终目标。
#urls.py
(r'^protected_media/(?P<filename>.*)$', 'protected_media')
#views.py
from django.contrib.auth.decorators import login_required
@login_required
def protected_media(request, filename):
# @login_required bounces you out to the login url
# if logged in, serve "filename" from Apache
最佳答案
在我看来,您在代码中概述的方法应该可行。它实际上与任何其他 protected 资源没有什么不同:您的 View 可以提供来自磁盘的文件、来自数据库的记录、呈现的模板或任何东西。正如 login_required 装饰器阻止未经授权访问其他 View 一样,它将阻止对您的 View 服务 protected 媒体的此类访问。
我是否遗漏了您的问题?如果是这种情况,请澄清。
编辑:关于您评论中的 django 文档链接:这是简单地从特定目录提供任何请求文件的方法。因此,在该示例中,/site_media/foo.jpg
、/site_media/somefolder/bar.jpg
等 URL 将自动查找文件 foo.jpg
和 document_root
下的 somefolder/bar.jpg
。基本上,document_root
下的所有内容都将公开可用。这显然是不安全的。所以你可以用你的方法避免这种情况。
它也被认为是低效的,因为当您只需要 Apache 之类的东西来接收 URL 请求并将其映射到硬盘驱动器上的文件时,django 只会增加很多不必要的开销。 (您不需要 django session 、请求处理等)
在您的情况下,这可能不是什么大问题。首先,您已经保护了 View 。其次,这取决于您的使用模式。您预计这些文件有多少请求?您只使用 django 进行身份验证——这是否证明其他开销是合理的?如果没有,您可以考虑使用 Apache 提供这些文件并使用身份验证提供程序。有关更多信息,请参阅 mod_wsgi
文档:
- http://code.google.com/p/modwsgi/wiki/AccessControlMechanisms
- 查看“Apache Authentication Provider”部分并搜索 django
我相信 mod_python
下也有类似的机制。 (更新:刚刚注意到另一个答案。请参阅 Andre 对 mod_python
方法的回答。)
编辑 2:关于提供文件的代码,请参阅此片段:
send_file
方法使用 FileWrapper,它非常适合将大型静态文件发回(它不会将整个文件读入内存)。您需要根据要发送的文件类型(pdf、jpg 等)更改 content_type
。
关于django - 你如何要求在 Django 中登录媒体文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1114559/