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

标签 django apache authentication static media

我在网站的用户注册部分提供可下载的 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.jpgdocument_root 下的 somefolder/bar.jpg。基本上,document_root 下的所有内容都将公开可用。这显然是不安全的。所以你可以用你的方法避免这种情况。

它也被认为是低效的,因为当您只需要 Apache 之类的东西来接收 URL 请求并将其映射到硬盘驱动器上的文件时,django 只会增加很多不必要的开销。 (您不需要 django session 、请求处理等)

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

我相信 mod_python 下也有类似的机制。 (更新:刚刚注意到另一个答案。请参阅 Andre 对 mod_python 方法的回答。)

编辑 2:关于提供文件的代码,请参阅此片段:

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

关于django - 你如何要求在 Django 中登录媒体文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1114559/

相关文章:

linux - 协作安装的问题

django - 如何从 Drupal 移植到 Django?

Django Tastypie 通过 PostMan REST 客户端与 API 交互

php - 大文件上传时的 Apache 错误 500 (mod_security)

php - 登录表单即使输入错误的用户名/密码也能成功

asp.net - 清除缓存后,set-cookie 不适用于 IE11/10

google-chrome - Windows 身份验证在 Chrome 中不起作用

python - Django 测试 - 导入错误 : Start directory is not importable

python - Django strip_tags 模板过滤添加空格

php - Codeigniter 加载程序超时已过期