2009-08-27 41 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服務器使用該令牌提供靜態文件。