2009-04-15 45 views
2

中間件可以檢查URL中是否有值(例如圖像ID(「/ image/152 /」)),如果是,則執行一些檢查以確保當前用戶有權查看該圖片,如果不重定向到另一個網址?Django中間件+ URL的

我不得不爲這個網站推出我自己的權限,我正在努力,而且我不想阻塞我爲整個網站使用相同代碼編寫的幾乎所有視圖,所以我認爲中間件會是一個好的這個想法,但我不知道如何去做。

回答

8

是的,這是可能的。 Django的middleware docs for process_request表明:

DEF process_request(個體,請求)

請求是一個HttpRequest對象。在Django決定執行哪個視圖之前,每個請求都會調用此方法。

process_request()應返回None或HttpResponse對象。如果返回None,Django將繼續處理該請求,執行任何其他中間件,然後執行相應的視圖。如果它返回一個HttpResponse對象,Django不會打擾任何其他請求,視圖或異常中間件或相應的視圖;它會返回該HttpResponse。

HttpRequest對象具有path屬性,該屬性將爲您提供請求的URL。

但是,如果您願意,還可以注意,您還可以擴展Django的身份驗證後端系統,以根據任意標準(例如您的手動權限方案)權限填充請求中的用戶。這樣,您就可以利用默認身份驗證裝飾器(@permission_required@user_passes_test),其他應用程序/管理站點也將能夠尊重您的權限。創建的User對象和權限不需要駐留在Django的用戶/權限表中,並且可以在登錄時虛擬創建;我已經取得了相當的成功。

參見Writing an authentication backend如果這種訴求。

0

如果要實現在中間件授權(許可制度),你最終將有兩個選擇:

  1. 檢查URL,並允許訪問
  2. 檢查URL,並拒絕訪問

如果您的要求非常簡單,沒關係,因爲您不必觸摸視圖。

但在一般情況下,權限系統是非常複雜得多,例如:

  1. 用戶可以訪問FOO/SHOW_ALL/
  2. 但是,他無法看到或訪問foo的實例,即FOO /顯示/ FOO_1/
  3. 因爲,他不能訪問FOO_1情況下,我們不應該在SHOW_ALL 告訴他們(所有FOO實例)

如果你想實現上述3一起,我建議以創作g您自己的授權後端,DJango樂於與之合作。你需要做的只是實現一些方法(你的特定邏輯)並作爲後端附加。

閱讀:http://docs.djangoproject.com/en/dev/topics/auth/#handling-authorization-in-custom-backends