中間件可以檢查URL中是否有值(例如圖像ID(「/ image/152 /」)),如果是,則執行一些檢查以確保當前用戶有權查看該圖片,如果不重定向到另一個網址?Django中間件+ URL的
我不得不爲這個網站推出我自己的權限,我正在努力,而且我不想阻塞我爲整個網站使用相同代碼編寫的幾乎所有視圖,所以我認爲中間件會是一個好的這個想法,但我不知道如何去做。
中間件可以檢查URL中是否有值(例如圖像ID(「/ image/152 /」)),如果是,則執行一些檢查以確保當前用戶有權查看該圖片,如果不重定向到另一個網址?Django中間件+ URL的
我不得不爲這個網站推出我自己的權限,我正在努力,而且我不想阻塞我爲整個網站使用相同代碼編寫的幾乎所有視圖,所以我認爲中間件會是一個好的這個想法,但我不知道如何去做。
是的,這是可能的。 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如果這種訴求。
如果要實現在中間件授權(許可制度),你最終將有兩個選擇:
如果您的要求非常簡單,沒關係,因爲您不必觸摸視圖。
但在一般情況下,權限系統是非常複雜得多,例如:
如果你想實現上述3一起,我建議以創作g您自己的授權後端,DJango樂於與之合作。你需要做的只是實現一些方法(你的特定邏輯)並作爲後端附加。
閱讀:http://docs.djangoproject.com/en/dev/topics/auth/#handling-authorization-in-custom-backends