你如何要求登录的媒体文件在Django(How do you Require Login for M

2019-06-25 15:51发布

我的服务“敏感”,因为下载的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

Answer 1:

在我看来,你在你的代码中列出的方法应该工作。 这真的没有比其他任何受保护资源的不同:你的观点可以从磁盘服务档案,记录从数据库,呈现模板或任何东西。 正如login_required装饰防止对其他视图未经授权的访问,它会阻止这种访问您的服务受保护的媒体视图。

我失去了在这里你的问题的东西吗? 请澄清,如果是这样的话。

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

它也被认为是低效的,因为Django是刚刚加入了很多不必要的开销,当你需要的是像Apache将采取一个URL请求,并将其映射到硬盘驱动器上的文件。 (你并不需要Django的会话,请求处理等)

在你的情况,这可能不是这样的一个大问题。 首先,你获得的视图。 其次,它取决于你的使用模式。 多少个请求,你预计这些文件? 你只使用Django的认证 - 是否值得其他开销? 如果没有,你可以看看服务的那些文件Apache和使用身份验证提供者。 欲了解更多关于此,请参阅mod_wsgi文档:

  • http://code.google.com/p/modwsgi/wiki/AccessControlMechanisms
    • 请参见“阿帕奇验证提供商”,搜索的Django

有下提供类似的机制mod_python ,我相信。 (更新:只注意到对方的回答,请参阅安德烈的答案。 mod_python方法。)

编辑2:关于对服务于文件中的代码,请参阅此片段:

  • http://www.djangosnippets.org/snippets/365/

send_file方法使用FileWrapper这是很好的用于发送大量静态文件回来(它不将整个文件读入内存)。 您将需要改变content_type取决于文件的您要发送的类型(PDF,JPG等)。



Answer 2:

阅读Django的门票获取更多信息。 在底部开始给自己节省一些时间。 看起来它只是错过了进入Django的1.2,我认为还不算在1.3。

对于Nginx的,我发现这个Django的片段 ,是以X-阿塞尔-重定向头的优势,但还没有尝试过呢。



Answer 3:

通过Django的静态文件更为有效的服务正在看着目前的谷歌SOC项目的一部分。 对于WSGI(如果可用),这将使用wsgi.file_wrapper扩展WSGI,因为它是mod_wsgi的,和req.sendfile()如果使用mod_python的。 它还将支持标题,如“位置”,“X-加速重定向”等,其中不同的网络托管机制和代理前端接受作为提供静态文件的方式,其中位置由后端的Web应用程序定义的回,这是不一样的提供静态文件的前端作为effecient。

我不知道是否有这个地方,或者不是一个项目页面在Django维基,但代码变化被提交到分支/ soc2009 / HTTP-WSGI-改进Django的源代码库的分支。

你不必严格等待的东西。 它只是把一个干净和便携式接口到位跨越不同的机制。 如果使用nginx的,如阿帕奇/ mod_wsgi的面前前端,你现在可以使用X-加速重定向。 如果使用Apache / mod_wsgi的3.0和守护模式下,你可以使用现在的位置,但也需要确保你设置Apache正确。 或者,你可以实现各地的Django应用程序,它会寻找一些自己的响应头,表示文件要返回自己的WSGI中间件的包装和使用wsgi.file_wrapper来返回,而不是实际的响应从Django中返回。

顺便说一句,别人两个的mod_python和mod_wsgi的上市认证钩机制将使用HTTP基本身份验证,这是不是你想要的。 这是假设你想要的文件通过使用Cookie和后端会话的Django基于表单的登录机制保护。



Answer 4:

如果我正确理解你的问题,你想限制访问那些不被Django的服务,例如文件,与Apache服务器?

什么,那么你就需要某种方式对这个Apache服务器使用Django作为身份验证源。

此django的代码段描述了这样的方法。 它创建在Django的访问处理这Apache使用时对静态文件的请求进来,需要加以保护:

<Location "/protected/location">
            PythonPath "['/path/to/proj/'] + sys.path"  
            PythonOption DJANGO_SETTINGS_MODULE myproj.settings
        PythonOption DjangoPermissionName '<permission.codename>'
        PythonAccessHandler my_proj.modpython #this should point to accesshandler
            SetHandler None
</Location>

希望这有助于该片段被张贴前一阵子,这样的事情可能的Django版本之间已经改变了:)



文章来源: How do you Require Login for Media Files in Django