我的Django專案中的許可權機制

王海波發表於2016-05-31

本文主要介紹我在Django部落格使用的許可權設定,我的部落格中幾乎所有的許可權設定都是我自己寫的。這麼做的原因是我在寫Flask部落格的時候,學到了一些這方面的知識,感覺很不錯。因此就借鑑裡面的邏輯,自己寫了這方面的程式碼。

1、關於文章的訪問許可權

我就從Model和View兩層來說。

首先我在Model中定義一個欄位,用來指示是否公開,是否允許別人可見: 原始碼如下:

access欄位指定該欄位是否公開。如果設為公開那麼所有人可以訪問;如果設為私密,那麼就不允許一些使用者訪問。那此時問題來了,該如何設定限制訪問邏輯。我的程式碼如下,該方法也定義在Model中:

上面的程式碼很簡單,如果是私密的,只有文章作者或者管理員可以訪問。

在View中的程式碼:

看這段程式碼最後面,如果can_acees方法返回False,就丟擲一個禁止Django內建的禁止訪問的異常,即返回403頁面。

2、自定義檢視許可權裝飾器

首先自己定義一個裝飾器函式,用來修飾要設定許可權的檢視函式或類方法。 裝飾器函式原始碼:

這是自己寫的一個三層裝飾器函式,程式碼很簡單。如果http_exception為403,當不是管理員許可權就丟擲禁止訪問異常;當http_exception為401,當使用者沒有登入就跳轉到登入頁面。

在View中:

這是一個用於測試的檢視函式。

上面講解了如何使用裝飾器函式裝飾檢視函式,那麼該如何裝飾基於類的檢視呢?
在Django中的官網上給出了答案。

最簡單的方法是在URLconf 中裝飾,裝飾類的as_view方法:

如現在我在View中定義了一個基於類的檢視:

直接在URl中配置: url(r’^author/$’, permission_forbidden(http_exception=403)(AuthorView.as_view()),name=’blog_author’),

這樣就可實現上面對檢視函式相同的裝飾。這個方法在每個例項的基礎上運用裝飾器。如果想讓檢視的每個例項都被裝飾,你需要一種不同的方法。

下面是摘抄自官方文件:

類的方法和獨立的函式不完全相同,所以你不可以直接將函式裝飾器運用到方法上 —— 你首先需要將它轉換成一個方法裝飾器。

method_decorator 裝飾器將函式裝飾器轉換成方法裝飾器,這樣它就可以用於例項方法上。例如:

在這個例子中,ProtectedView 的每個例項都將有登入保護。

不過有一點要說明:我用這個方法測試沒有成功!!!

上面說了這麼多我自定義的許可權設定,這裡也說一下Django內建的許可權系統。

詳細的內容請參考下面的兩個連結,一個是個人部落格,一個是Django官方文件:

  • http://www.cnblogs.com/esperyong/archive/2012/12/20/2826690.html
  • http://python.usyiyi.cn/django/topics/auth/default.html

我這裡只說兩點:

一是分配許可權的問題。

預設情況下,Django會為每一個Model自動生成一add,delete,change的許可權,並儲存在auth_permission資料表中。

我們要想把許可權分配給使用者,就要用User的user_permissions屬性。

對於超級使用者來講,他擁有所有的許可權,並不需要再做分配。

2、模板中的許可權變數

在setting.py中,我們定義了:

context_processor會自動新增一些上下文,當然,其中包括perms.原始碼:

它新增了,user和perms兩個變數,perms指的是當前使用者的所有許可權。 這樣,在模板中,就可以使用perms變數了。

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

任選一種支付方式

我的Django專案中的許可權機制 我的Django專案中的許可權機制

相關文章