1.權限控制的流程+表結構html
內容回顧:前端
wsgi:socket進行收發消息python
中間件:(超級重點的面試題)在全局範圍內控制django的輸入和輸出的一個鉤子,處理輸入和輸出說白了就是處理請求和響應request對象和response對象,他說的是一個全局的鉤子,認爲是全部的請求都要進來,鉤子的概念是什麼?只要把功能寫上去就能運行,中間件註冊上就能用,註銷了,整個東西就沒有了,可插拔性很是好,寫好了就能用,沒寫好就不能用,提早預留好了.說到這裏,咱們知道form裏邊有局部鉤子和全局鉤子,web
session是將數據存儲到內存中,數據的讀取會很是的快.鏈接數據庫的話也是能夠的,每次登錄都須要進行讀取一遍,速度回慢一些,壓力比較大.面試
下面,咱們分析一下上邊的流程,看一下都完成了哪些事情,第一次,假如說是沒有登陸的話,直接訪問某個頁面,好比說是customer_list,瀏覽器進來,走wsgi.封裝成request對象,來走中間件,中間件裏邊定義了一些權限控制的中間件,中間件裏邊有(白名單),白名單沒有經過校驗,進入登陸狀態的校驗,沒有登陸狀態,這個時候就會返回頁面,也就是redirect重定向,本質上就是一個響應頭,返回給了瀏覽器,瀏覽器看到以後,再次向login發送一個登陸的get請求,請求進來先走wsgi,再走過了中間件的白名單,經過白名單,向後走,走到urls.py匹配,訪問login的視圖函數,執行view裏邊的視圖函數,而後打印模板,渲染一個login的登陸頁面,這樣往回走,走到中間件的時候,須要再走全部中間件的process_response方法,雖然咱們寫的中間函數中沒有,可是其餘中間件中可能有,再走wsgi,再回到瀏覽器.瀏覽器就能夠看到登陸頁面,登陸頁面中輸入用戶名和密碼,發送POST請求,再走wsgi,而後走中間件,依然是login白名單,再走urls.py,而後走views.py的視圖函數,在views.py進行校驗用戶名和密碼,這個時候,走model,而後從數據庫中db進行查詢,查詢以後,返回查詢的結果,數據庫返回一行行數據,有了models以後,才封裝成models對象,這個時候在view.py拿到models對象,所以,咱們本身建立的models對象,和在數據庫中經過ORM拿到的models對象是同樣的,區別是,本身建立的話,本身填充數據,ORM操做是從數據庫中拿到數據,而後封裝成對象,本身封裝的對象.save會保存到數據庫中,或者拿到一個對象修改它的屬性,再去save,會到數據庫中進行修改,沒用查找對象,認證失敗,返回給瀏覽器須要從新登陸,再次發POST請求.假如認證成功了,權限信息的初始化,保存的信息有哪些,保存權限的list,保存登陸狀態,保存菜單的dict,存入session中,返回重定向,這個時候,給的是index走到瀏覽器返回的是location,sql
地址寫的是index,瀏覽器再次發送一個請求index,走wsgi,再走中間件,獲取到地址是index,白名單校驗一下,發現不是白名單,接着往下走,可是數據庫
是一個登陸狀態,接着日後走,發現是一個免認證的地址,而後return,再走到urls.py,再次走到view視圖中,返回一個index頁面,這個時候用到了母版和繼承,繼承了layout.html,layout裏邊有咱們自定義的menu標籤,{% menu request%},這個地方用到了inclusiontag,結果是動態的html字碼段,經過代碼塊,在大模板裏邊套了一個小母版,而後放在母版裏邊了,最後經過index進行繼承,再把index寫的字符串,添加到block塊裏邊,最後咱們拿到,大模板套着小母版,這個html頁面,而後返回給瀏覽器,這個時候就用到了,動態生成菜單的結果,用到的是inclusiontag,這個時候瀏覽器顯示的是有權限的信息了,點開的是一級菜單,二級菜單是咱們能夠訪問的一些權限信息,而後點擊二級菜單,先看圖
django
點擊進入一級菜單,顯示二級菜單,顯示咱們能夠訪問的一些權限,咱們再點擊二級菜單,開始發送請求,再走wsgi,再走中間件,一次經過(白名單,登陸狀態的校驗,免認證的地址)都不是,下面咱們開始進行權限的校驗,須要,獲取當前用戶的權限信息,這個時候,從session中拿到權限信息,而後和當前的地址,作一一的匹配,能匹配成功說明有這個權限,return就往回走,若是都沒有匹配成功,就沒有權限,就直接返回了給瀏覽器,這個是權限的控制,正常狀況下有菜單是有權限的,咱們經過菜單點出來,都是有權限的,日後走,好比"視圖",再經過model,再拿數據庫中的數據,返回一個queryset一個對象列表,而後咱們再套模板,而後再渲染用戶的一個個數據,用到了模板的繼承,這個時候layout和{%menu request%}再次使用了,生成一個完整的html頁面,再返回給瀏覽器,這個時候能夠看到用戶展現的列表,剩下的頁面都是一樣的效果,json
代碼有哪幾部分?瀏覽器
中間件和rbac相關的,因此把中間件寫在rbac裏邊,
登陸用戶和密碼,這是登陸相關的業務邏輯,須要寫在業務的app裏邊,
權限信息的初始化和業務邏輯是沒有太多關係的,只不過是登陸成功以後所作的事情,咱們也把這部分代碼拿出來,放在rbac的app裏邊,
只要能找到,調用使用就能夠了,這個時候咱們是須要動態生成菜單的也就是 母版和繼承&&layout&&{%menu request%}
這個html也是和權限rbac相關的,根據權限生成的菜單,把這部分也寫在rbac的template裏邊的tags,也叫rbac進行區別,也就是和控制相關的,
還有一個關鍵的東西,settings.py,進行相關的配置.
訪問127.0.0.1:8000至關因而訪問127.0.0.1:8000/,(也就是指的是訪問根目錄)這個地址是沒有訪問權限的,
咱們訪問的是127.0.0.1:8000/login/地址,經過白名單以後拿到的頁面.
輸入root用戶&&密碼123
下面咱們梳理下這個流程:
首先咱們看中間件,也就是settings.py,
django幫助咱們封裝的中間件,請求進來經過這個中間件以後,纔會封裝成request.session,出去的時候,在視圖中用到了request.session賦值,也就是在視圖中出去時,再次通過request_session,會對用戶進行設置,用到這個時候,咱們須要註銷的,
csrf是用來作校驗的,
最下面的rbac是咱們本身註冊的中間件,咱們須要看下這個流程.
下面是settings.py裏邊的一些設置
咱們向login發送post請求用戶名和密碼,
第一個白名單url匹配成功就return,再路由匹配,也就是項目的根的路由匹配,admin不是,訪問這個空的
點擊進入include裏邊的urls,咱們將就進入二級url裏邊看一下,
找到路徑以後,咱們進入"視圖",
若是用戶名或密碼錯了,下面的obj就是None,結果就會返回登陸頁面,咱們須要從新登陸login,顯示"用戶名或密碼錯誤"
經過密碼和用戶了,咱們就須要驚醒"權限信息初始化(權限,菜單)",點擊進入init_permission函數
obj表明用戶對象,obj.roles表明管理對象,幫助咱們管理多對多的關係對象,
後邊調用filter或者all才能拿到queryset,將角色的權限爲空的權限去除掉
思考,多表查詢的方式,有哪幾種?
子查詢,查詢完以後再去另外一張表中查詢,
連表查詢:內鏈接,左鏈接,右鏈接,
內鏈接只會羅列出:兩張表中都有的信息,
左鏈接是左邊有右邊沒有,右邊就補空,
目前,咱們的狀況是,就是補空的形式,角色表有這個形式,對應的權限沒有id,和角色id對應匹配上,因此數據局勢空,也就是這個filter裏邊爲空的設置,要去除掉空的數據(url權限爲空的部分),而後咱們經過values取對應字段的值.最後的結果就是queryset,裏邊的形式就是一個字典,
找權限表裏邊的url和title,以及經過全下表再找到菜單表裏邊的title&&icon&&id.
上圖中,再往下走是,構建權限的列表permission_list,菜單字典menu_dict
最終咱們把結果存放到session當中了,
咱們將session存放的鍵,放在settings.py中
感受繞的話,也能夠寫死,可是咱們能夠經過配置,優化了程序,和上邊同樣
下面,咱們看一下構建的數據結構:
permission_query指的就是每個字典的權限信息,
下邊一個構建的是權限列表,一個是構建的菜單字典
上邊就是構建一級和二級菜單的地址
初始化,完成以後,咱們再重定向到index首頁
這個時候咱們再訪問中間件rbac.py
url=index...,白名單也不是,獲取登陸狀態,也已經在permission.py裏邊設置過了,而後,
再看一下,是否是免認證的狀態,若是是裏面認證的,在settings.py裏邊有免認證的地址,
而後return,日後走,路由的匹配,先項目,在二級路由,找到視圖函數index.py
在index頁面裏邊,咱們先繼承,而後寫鉤子裏邊的東西:
用上圖所示的內容,至關於調用相關的函數,menu,執行menu,點擊menu進去查看一下,在
menu_dict就是獲取菜單的數據結構:
獲得下圖這樣的字典:
上圖包含一級和二級菜單的信息,
而後咱們返回菜單字典裏的值
也就是找到裝飾器裏邊的menu.html進行循環出來
生成菜單列表以後,咱們就將生成的結果放在母版頁layout.html裏邊的,下圖對應的位置:
上圖中的menu指的是函數名.這樣就包含模板裏邊生成的內容
同時看到的首頁,也就會將index填充到layout.html中對應的block對應的前端位置.以下圖
而後交還給瀏覽器,就能夠看到對應的頁面
二級菜單的難點:1構建數據結構,2inclusion_tag優勢難度(記住這個inclusion_filter||inclusion_simple)記住用法和顯示的結果就能夠了,三個方法其實都是模板中調用函數3.表結構和對應的含義4.對應的流程圖
發出一個請求對應一個響應,與下次請求沒有關係,若是想要有關係,須要保存一個session 5.以及模板裏邊的對應關係等等.
今日內容:
(1)一級菜單排序
(2)二級菜單選中而且展開
(3)非菜單權限的歸屬
(4)路徑導航
(5)權限粒度控制到按鈕級別
2.一級菜單排序
標準:什麼樣的權限在上邊,什麼樣的權限在下邊,這個須要咱們先規定好,如何處理?須要有依據,加東西,一級菜單排序
原來的菜單表樣子:
下面,咱們須要對它加上對應的權重,進行排序,
二級菜單結構對應的樣子,以下圖:
修改以後的樣子:
只須要修改數據庫對應的權重大小,就能夠修改對應的順序.
咱們是在menu.html中循環生成的,循環下圖字典中1和2對應的值
目前的問題:字典是無序的
python3.5字典是無序的
python3.6字典顯示是有序的,內部是無序的
python3.7才真正的是和插入順序是一致的.
爲了保證字典有序,咱們須要用到有序字典模塊.
collections包中的orderedDict類 form表單中的setfields,也就是定義字段中的順序,後邊是字段對象.
字典的排序:
按照插入順序排序,如何排序呢?sorted()
sorted默認是升序排列,加上reverse=True就是降序排列
上圖咱們循環的是menu_list裏邊的鍵,將順序按照鍵來進行排序
咱們如今的需求是按照wight來進行排序
,如何處理?結合匿名函數處理下面的一些關係,按照從大到小排序
修改參數,再看一下
如何實現這個功能呢?思考一下子
首先執行數據庫遷移
咱們須要將右側的數據庫移除,從新拖動進去sqllites,而後打開menu表,修改一下權重,將1改爲100
建議中間空上幾個值,方便插入其餘的菜單
下面咱們處理順序,注意這個時候咱們是在自定義的裏邊進行處理,
原來的樣子:
在permission中再加上一個篩選的權重wight,
這個時候,咱們按照降序排列,數值大的在前面
而後賦值,循環就能夠了,另外一個就是,咱們如今返回的值是有序字典的值
這個時候,運行,從新登陸一下root,咱們看一下結果:(運行報錯,將上邊的ret=的裏邊的weight改爲wight)
這個時候,財務管理就在上邊了,
咱們現再修改一下數據庫的權重,刷新頁面看一下結果
結果沒有發生改變,緣由是session中的數據,不會由於你修改數據庫就修改session裏邊的數據.
只有再次登陸纔會修改結果,下圖是從新登陸以後的結果:
二級菜單若是想排序也是能夠加上權重,構造的時候,須要將下圖的數據排好才行
3.二級菜單默認選中並展開
首先,咱們拿當前的url地址,而後循環每個標籤的地址,匹配上咱們就加active,這樣就結束了,如今的狀況是一級菜單套二級菜單,如今咱們想拿二級菜單裏邊的url地址
原來的寫法:
item表明一級菜單的結果,咱們須要循環二級菜單的結果,看下面的寫法:
item裏邊的i表明二級菜單裏邊的一個個字典,而後正則匹配.
如今咱們拿到的是children裏邊的字典,見下圖:拿下面的url
下面咱們開始匹配當前的地址,拿到以後加上active
循環完成以後,咱們再交給menu.html頁面進行渲染
匹配完成以後,咱們再處理,
運行程序:
解釋:如今咱們作的效果是,在原來的基礎上在瀏覽器點擊到二級菜單,瀏覽器的搜索框添加上對應的搜索地址
如今咱們獲得的結果默認,都是展開的狀態
須要在body上加上hide
也就是在menu菜單裏邊加上hide
這個時候,全部的都是閉合的,
所以,hide咱們不能寫死,想要去掉,須要用js去掉
咱們能夠默認是展開的,而後進行操做
下圖中item表明一級菜單的信息,咱們能夠設置
如今咱們在一級菜單都加上hide
下面的兩個菜單都是hide,
如今也是表示默認都是關閉的
如今咱們應該訪問哪一個頁面,哪一個頁面就應該是展開的狀態,也就是訪問二級菜單,應該顯示的是選中的狀態.
也就是,如今咱們進去了,hide改爲空字符串""
這個時候,我麼再運行程序,選中的頁面展開,
咱們須要的效果是,點擊就打開,點擊另外一個,就關上上一個打開的菜單.
咱們須要經過js實現代碼
原來的js代碼:
運行程序:
js也在其餘地方可能用到,也是須要拿出來的
這個時候,咱們只須要在模板頁中引入便可,咱們就成功修改了二級菜單的問題
4.非菜單權限的歸屬
咱們點擊上圖中的"添加客戶",獲得下圖:
這個時候,咱們不但願菜單欄關上,
左側菜單:
客戶管理
展現客戶 (一對多的關係)
添加客戶
編輯客戶
刪除客戶
...
財務管理
繳費列表
...
權限表:
id url title menu_id parent_id
1 /customer/list/ 展現客戶 5(菜單id的1) null
2 /customer/add/ 添加客戶 null 1(id爲1)
3 /customer/edit/(d+) 編輯客戶 null 1
咱們如今須要作的是產生關係在 展現客戶和添加客戶之間
而且是1對多的關係.
咱們讓"展現客戶"成爲"父選項",添加,編輯,刪除,成爲子選項
思考,如何實現上邊的表結構?
咱們須要作路由匹配:
咱們須要作的事情是,不論是訪問什麼只要找到: 添加和編輯刪除的url對應的父親就能夠了,
咱們的目的是:找到父親url就能夠了,
咱們訪問二級菜單,找到對應的url就能夠了
點擊客戶,找到對應的父權限.不論是訪問二級菜單仍是子權限,咱們只須要找到對應的父親就能夠了
本身關聯本身1對多
下面運行,數據庫遷移
如今,咱們在admin裏邊添加權限信息
下面,咱們開始獲取了
在這裏只是拿本身的關係字段:
下面咱們在"菜單字典"裏邊添加內容
咱們打印一下二級菜單裏邊的內容
服務端信息
這個時候,咱們就拿到了二級菜單的權限信息,
在菜單裏邊,咱們須要進行配置,菜單裏邊已經有了,咱們須要加上本身的id
咱們再次訪問這個地址:
獲得的結果:
也就是url的地址.
再走展現客戶的地址
咱們再從新登陸一下:
如今,咱們獲得的是二級菜單裏邊的內容:
咱們如今,訪問"展現客戶"裏邊的內容:
服務端獲得的結果:
倒數第三行的id是二級菜單的id,
咱們再看一下url地址的匹配:
服務端對應所示的內容:
咱們在這裏的i拿到的是中間件的權限信息,
須要獲取這個東西
咱們獲取的是兩種請求的方式字典
第一種訪問的是"父權限",第二種是"子權限"
咱們須要的是父權限的id,應該如何處理這個問題?
這個時候,咱們保存的就是二級菜單的id
咱們再將存儲的id和打印的id對比一下.
i在這裏表示的是二級菜單的字典,
咱們就將這裏的二級菜單的id和咱們剛纔存儲的id作比較.
比對成功,咱們就將下圖的地址作相關的展現
原來的代碼:
修改以後的代碼:進行比較
思路,咱們不論是獲取的是二級菜單仍是二級菜單裏邊的內容,都要把二級菜單獲取到
這個時候的小問題:(訪問index的時候,咱們找不到)
走中間件,從上到下,從"白名單"到"獲取登陸狀態",再到免認證,最後走到下圖所示的內容:
所以,咱們須要在一開始定義一個默認值,
這個時候,咱們再刷新:
咱們再設置一個settings.py裏邊的一個配置
思考一下,這個時候,走到中間件應該怎樣用?
中間件配置完成再用反射進行設置
這個時候,咱們再在自定義的rbac裏邊取值
這樣咱們就將程寫活了,
咱們只是換了一種寫法,
反射的方法很方便,可是反射的流程會複雜一些,也能夠先寫死,多看幾遍再寫.
71-5最後2分鐘復原,若是須要的話
回覆以前的樣子:也能夠反着回覆過去
5.
下午回顧:
咱們思考一下能不能優化一下程序:
原來的樣子:
優化後的樣子:
上邊方塊是循環前,下邊是循環後的代碼塊
兩連等:
複習的內容:
1. 一級菜單的排序 有序字典 sorted(menu_dict, key=lambda x: menu_dict[x]['wight'], reverse=True) 2. 二級菜單選中而且展開 hide active 3. 非菜單權限的歸屬 客戶管理 展現客戶 添加客戶 編輯客戶 刪除客戶 財務管理 繳費列表 權限表 id url title menu_id parent_id 1 /customer/list/ 展現客戶 5 null 2 /customer/add/ 添加客戶 null 1 3 /customer/edit/(\d+)/ 編輯客戶 null 1
5.路徑導航,也就是下圖中的花紅框的內容:
咱們須要添加url地址和標題
咱們須要將寫死的變成動態的導航效果:
這個時候layout.html就再也不寫死了,將下圖紅框內容註釋掉
i是定義的字典,下面咱們經過循環出來.
當走到上圖的權限校驗,咱們就知道訪問的是哪一個地址了
服務端裏邊沒有title,因此咱們須要加上,見下圖
下圖是咱們篩選出的title信息
上圖中的權限列表加上title,
這個時候,咱們從新登陸一下root
這個時候,已經能夠成功顯示了
這個時候,咱們看到已經存在了title
這個時候,咱們再點擊"添加繳費記錄"
這個時候就沒有了
由於這個時候走的是if裏邊,見下圖
下面咱們進行嘗試,把面刀導航欄也加到子權限中,看結果
見上圖,如今就有了"添加繳費"
見上圖,"編輯繳費"也有了
如今惟一少的是父親的導航標籤
經過打印,咱們能夠看到部分添加到列表的信息
打印的位置是中間件,基於角色的權限訪問控制
如何經過服務端的信息拿二級菜單的title.
如何更方便的取到?
思考,可不能夠將列表換成字典?
將上圖的id當作key
看一下組織數據結構的思路:
從上邊的結構修改爲下邊的結果,會更好處理一些
下面咱們將權限的列表修改爲權限的字典
原來列表的添加方式:
如今的添加的方式:
下圖這個session中存儲的地方要修改爲權限的字典
必須改爲這樣,不然下邊會報錯
存儲的時候會產生影響,天然取的時候也會產生影響,
中間件rbac須要修改的內容:
修改後的結果:
這個時候二者都用到,咱們就將語句放在最下邊
運行:
緣由是咱們沒有登陸:
如今咱們從新登陸root&&123試一下
報錯:
以上是一些錯誤緣由,須要進行修改:
這個時候,再運行,
登陸:
點擊"添加客戶"
也就是咱們拿pid的時候出錯了
拿到的是1,爲何報錯?
細節問題
咱們將data1這樣的一個字典,存儲到session中,作序列化,原來的狀況是數字,咱們如今作了json的序列化以後,字典的鍵是數字的話,會轉化成"字符串",
見下圖:
這個時候,原來的狀況變成了字符串了,咱們對中間件進行操做:
這個時候,咱們再次點擊"添加客戶"
成功獲得下圖:
咱們將導航欄寫在,母版頁面
咱們須要再定義一個inclusion_tag,和上邊的菜單欄是同樣的
應該如何操做呢?
如今咱們只須要拿breadlist就能夠了
由於上邊已經寫了,load,咱們只須要寫自定義函數的請求就能夠了
這個時候,咱們刷新頁面:
如今咱們存在的問題是小問題是,在當前頁面的時候不須要,點擊"繳費列表",到最後一個不用點就好了
咱們只須要修改循環的次數,進行判斷:
這樣最後一個就沒有a標籤了,經過id判斷
經過子權限找到父權限的信息,
咱們將權限列表修改爲了權限字典,json字符串的轉化,最後一個麪包屑的位置沒有a標籤
6.權限粒度控制到按鈕級別
咱們須要作的是有權限就展現,沒有權限就不展現了,這個就是權限粒度控制到按鈕級別
咱們如今須要作的是對應用戶可以展現的結果:
咱們將全部的權限放到一個列表當中,if和else進行判斷
拿什麼表明權限?url
什麼和url有關係?
路由系統裏邊的name也能表明一個url
咱們將用戶所擁有的的name收集起來,
咱們還能夠經過customer_list.html進行相關的反向解析,url和name是1對1對應的.
若是在列表中,咱們就進行展現,沒有在列表中咱們就不進行展現
name 如今咱們思考應該怎麼處理?
咱們須要在rbac文件夾下的models.py裏邊的Permission類(也就是表)中,再添加一個屬性.可是這個名字必須惟一,若是表中已經建立了,不要先加惟一,須要進行一些處理
咱們先演示一下上邊操做以後的錯誤顯示,
1)須要在提供一個一次性默認值,
2)須要再添加一個default
咱們選擇1
隨便寫一個"xx"
報錯:
報錯
由於咱們向數據庫中存儲數據有約束,因此,所以咱們不能給url默認值,不能是同樣的
咱們先刪掉,數據庫遷移裏邊的name
咱們再將上邊的name的惟一值去掉,
再次執行命令,以及提供默認值
再執行上圖,咱們將成功生成到數據庫當中去了,
這個時候,當前的全部字段都是xxx
這個時候,咱們在url中,先加上name以後,咱們再加上約束
咱們知道web當中的urls.py
咱們將別名一次添加到權限列表中:
點擊上傳:
處理完成以後,咱們再添加約束
若是表是空的,咱們一開始就能添加,可是咱們的表不是空的,須要先加上默認值,再加上修改以後的不一樣值,也就是別名以後,
咱們須要再添加unique=True
這個時候,咱們再執行命令:
這個時候,就沒有問題了.
這樣咱們就把數據保存起來了,咱們如今須要找的是列表或者集合進行處理
咱們能夠在permission中再次添加一個數據結構,添加以後保存在session中,可是沒有必要,咱們還能夠怎樣操做呢?
咱們如今拿到的是權限的id作的是key,見下圖,
id的特色是惟一,不重複.name加上unique至關因而惟一的,不重複的,咱們也能夠吧name當作key進行處理.
咱們須要將權限id,修改爲權限name
原來的代碼
如今的代碼:
之後咱們能夠經過keys拿到全部的權限了
修改以後,存在一個問題,路徑導航會找不到了,緣由是什麼?
緣由是數據結構發生了改變:這個時候從"子權限"找"父權限"已經找不到了
咱們能夠換一種方式,找parent_name
下圖是修改以後的數據結構:
查詢下面的權限表中的父親,而後找名字name,是兩個下劃線
注意,後邊的"逗號"必定要加上
這個時候就查詢拿到父權限的name,
下面,咱們在打印一下構建的字典:
登陸root&&123
運行:http://127.0.0.1:8000/login/
登陸root&&123
服務器端,這個時候能夠獲得字典:
這個時候,咱們獲得的data2和data3是同樣的
如今咱們再修改一下中間件內部的信息
修改以後的內容:
展現客戶沒有問題:
添加客戶也沒有問題:
註釋,下邊兩行的內容:
如今,咱們直接判斷字典:
咱們看一下settings.py中的信息
上邊,咱們作的是,若是有這個權限就顯示,沒有這個權限,咱們就不顯示
運行,登陸qiangge&&123帳戶
登陸以後,只有一個"展現客戶"的權限
咱們將權限的別名當作字典的key
上邊的if end寫法寫死了,下面咱們開始,用filter進行再次定義一下
咱們再將a i a註釋掉
刷新:
登陸root帳戶,依然獲得的是下面的結果:
咱們如今,仍是隻須要,作簡單的if判斷就好了
咱們再定義一個,
若是兩個都沒有權限,如何處理?
編輯和刪除,存在一個咱們就顯示,不存在就再也不顯示了
選項裏邊,也須要加上這部份內容:
這個時候,咱們再次登陸qiangge&&123,看一下顯示
這個時候,由於沒有權限,就不在顯示"編輯"和刪除了
咱們給"祕書",再添加一個"編輯用戶",點擊保存.
再次登陸qiangge&&123
這個時候,就能夠登錄了
粒度顯示,就是作if...else判斷,有就顯示,沒有就不顯示,表結構上的改變,name也就是別名,記錄url,而且不能重複,有了這個條件,咱們就能夠作字典中的key了
修改上圖的時候,會對"子權限"找"父權限",產生影響,這個時候,咱們用pname找,也能夠找到了,
咱們自定義的這個filter方法,就須要判斷當前的name是否是在權限字典裏邊,若是存在,直接return,不存在,則None,
須要生成頁面的話,尤爲是須要控制到按鈕級別,就須要將判斷一個一個加到按鈕連接上邊,咱們須要對每個按鈕作判斷,咱們作的事情就是麻煩的事情.
,還須要大力複習,前面的知識點.