我的服务“敏感”,因为下载的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
在我看来,你在你的代码中列出的方法应该工作。 这真的没有比其他任何受保护资源的不同:你的观点可以从磁盘服务档案,记录从数据库,呈现模板或任何东西。 正如login_required装饰防止对其他视图未经授权的访问,它会阻止这种访问您的服务受保护的媒体视图。
我失去了在这里你的问题的东西吗? 请澄清,如果是这样的话。
编辑:关于您的评论Django的文档链接:这是用于简单地从一个特定的目录服务的任何请求文件的方法。 因此,在例如像网址/site_media/foo.jpg
, /site_media/somefolder/bar.jpg
会自动寻找文件foo.jpg
和somefolder/bar.jpg
下document_root
。 基本上,在每一件事情document_root
将公之于众。 这显然是不安全的。 所以你避免用你的方法。
它也被认为是低效的,因为Django是刚刚加入了很多不必要的开销,当你需要的是像Apache将采取一个URL请求,并将其映射到硬盘驱动器上的文件。 (你并不需要Django的会话,请求处理等)
在你的情况,这可能不是这样的一个大问题。 首先,你获得的视图。 其次,它取决于你的使用模式。 多少个请求,你预计这些文件? 你只使用Django的认证 - 是否值得其他开销? 如果没有,你可以看看服务的那些文件Apache和使用身份验证提供者。 欲了解更多关于此,请参阅mod_wsgi
文档:
- http://code.google.com/p/modwsgi/wiki/AccessControlMechanisms
有下提供类似的机制mod_python
,我相信。 (更新:只注意到对方的回答,请参阅安德烈的答案。 mod_python
方法。)
编辑2:关于对服务于文件中的代码,请参阅此片段:
- http://www.djangosnippets.org/snippets/365/
该send_file
方法使用FileWrapper这是很好的用于发送大量静态文件回来(它不将整个文件读入内存)。 您将需要改变content_type
取决于文件的您要发送的类型(PDF,JPG等)。
阅读Django的门票获取更多信息。 在底部开始给自己节省一些时间。 看起来它只是错过了进入Django的1.2,我认为还不算在1.3。
对于Nginx的,我发现这个Django的片段 ,是以X-阿塞尔-重定向头的优势,但还没有尝试过呢。
通过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基于表单的登录机制保护。
如果我正确理解你的问题,你想限制访问那些不被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版本之间已经改变了:)