2009-08-27 40 views
13

我建立一个网站,注册用户可以上传文件,静态媒体访问。这些文件然后通过Apache提供。只有登录的用户才能访问这些文件。固定在Django网站

我已阅读this page但似乎人们必须登录两次访问相应网站和媒体,使用不同类型的登录框的各一次。

有没有办法解决,还是有一些其他的方式来限制访问使用Django的认证数据库被Apache服务静态媒体?

我使用mod_python的。

编辑:我是如何结束的阅读范大风的回答和this后解决这个:

  1. 切换到WSGI。
  2. 安装mod_xsendfile
  3. 感动了所有公众的媒体文件到/媒体/子文件夹公共
  4. 使用别名/媒体/公共/var/www.../media/public
  5. 添加访问公用文件夹
  6. 增加WSGIScriptAlias /媒体/保护/ /var/www.../apache/django.wsgi(相同的处理器为站点的其余部分)
  7. 新增XSendFile在和XSendFileAllowAbove在
  8. 要Django的应用程序,我加入一个用于/ media/protected的urlconf,它基本上是here,只为我的授权而修改诱导系统。它处理诸如/ media/protected/GROUP_ID/file之类的URL,以便只有GROUP的成员才能下载这些文件。
+0

Django文档中描述的方法的另一个可能的问题是,它似乎使用基本身份验证 - 它以base64编码的明文形式发送密码,所以不安全,除非您还对所有请求使用SSL。 – 2009-08-27 12:53:36

回答

10

通常的方法做,这是一个特殊的头传回给Web服务器。

您可以使用x-accel-redirect与nginx一起使用,如Django snippet所示。

对于Apache,使用mod_xsendfile模块(Django用户邮件列表上的discussion and examples)应该非常相似。

+0

我打算给mod_xsendfile一个尝试。 – 2009-08-27 18:06:15

+0

它的工作!不得不改用WSGI,但这并不像我想象的那么困难。 – 2009-08-27 22:07:50

+0

在mod_wsgi 3.0中,您可以传回200状态的位置。目录需要通过URL映射,然后在Location中引用。由于需要URL映射,为了确保远程客户端无法访问它们,如果不是Apache子请求,则需要使用mod_rewrite规则来禁止它们。另一个选择是使用wsgi.file_wrapper扩展来最优地从Django返回文件直接。现在不能用Django来做到这一点,但是将来版本将允许这样做。 – 2009-08-28 11:03:52

2

如果你能自由地从Apache的切换到lighttpd,那么最简单的解决方案是使用mod_secdownload这将做的正是你想要的东西,那就是提供应用程序的认证,同时通过Web服务器提供服务的实际文件。

但是,如果你坚持使用Apache,那么我建议mod_auth_token,他们在这里提到PHP,但你可以用Python或任何其他语言生成标记。使用mod_auth_token,您将能够在应用程序中生成令牌,然后让Web服务器使用该令牌提供静态文件。