如何在Django中要求登录媒体文件

Tom*_*tes 27 apache media authentication django static

我在网站的用户注册部分中提供可下载PDF和Spreadsheets中的"敏感"信息.

有没有办法允许django身份验证保护此媒体而不提供它(并且不必使用基本身份验证手动登录)?

我猜测theres(手指交叉)不是用下面的伪代码做的方法,但它有助于更​​好地说明最终目标.

#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
Run Code Online (Sandbox Code Playgroud)

ars*_*ars 9

在我看来,您在代码中列出的方法应该有效.它与任何其他受保护资源没有什么不同:您的视图可以提供来自磁盘的文件,来自数据库的记录,渲染的模板或任何其他内容.正如login_required装饰器阻止对其他视图的未授权访问一样,它将阻止对您的视图提供受保护媒体的访问.

我在这里错过了你的问题吗?请澄清是否是这种情况.

编辑:关于评论中的django doc链接:这是简单地为特定目录中的任何请求文件提供服务的方法.因此,在例如像网址/site_media/foo.jpg,/site_media/somefolder/bar.jpg会自动寻找文件foo.jpgsomefolder/bar.jpgdocument_root.基本上,每件事document_root都将公之于众.这显然是不安全的.所以你用你的方法避免这种情况.

它也被认为效率低下,因为django只需添加大量不必要的开销,只需要Apache就可以获取URL请求并将其映射到硬盘驱动器上的文件.(您不需要django会话,请求处理等)

在您的情况下,这可能不是一个大问题.首先,您已经确保了视图.其次,这取决于您的使用模式.您预计这些文件有多少个请求?您只使用django进行身份验证 - 这是否可以证明其他开销?如果没有,您可以考虑使用Apache并使用身份验证提供程序提供这些文件.有关详细信息,请参阅mod_wsgi文档:

mod_python我相信有类似的机制可供使用.(更新:刚刚注意到另一个答案.请参阅Andre对该mod_python方法的回答.)

编辑2:关于提供文件的代码,请看这个片段:

send_file方法使用FileWrapper,它适用于发送大型静态文件(它不会将整个文件读入内存).您需要content_type根据您发送的文件类型(pdf,jpg等)更改.


Dav*_*ave 5

阅读此Django 票证以获取更多信息。从底部开始以节省一些时间。看起来它只是错过了进入 Django 1.2,我认为也不在 1.3 中。

对于 Nginx,我发现这个Django 片段利用了 X-Accel-Redirect 标头,但还没有尝试过。