django自帶的權(quán)限管理Permission用法說(shuō)明
前言
一些公司內(nèi)部的CMS系統(tǒng)存在某些內(nèi)容讓指定的用戶有權(quán)限訪問(wèn),這時(shí)候可以用django自帶的權(quán)限管理進(jìn)行限制,比較方便。
缺點(diǎn):django自帶的權(quán)限是針對(duì)model(模型)的,不能針對(duì)單條數(shù)據(jù),要針對(duì)單條數(shù)據(jù)需要額外的操作。
默認(rèn)的權(quán)限(add, change, delete, view)
django針對(duì)每個(gè)模型,生成了四個(gè)默認(rèn)的權(quán)限(add, change, delete, view)。例如,我有一個(gè)model叫Log,那么這四個(gè)默認(rèn)權(quán)限在數(shù)據(jù)庫(kù)的存儲(chǔ)格式為:
表auth_permission(注:id字段的值是隨便取的,使用python manage.py migrate的時(shí)候會(huì)自動(dòng)生成)
id | name | content_type_id | codename |
---|---|---|---|
1 | Can add log | 7 | add_log |
2 | Can change log | 7 | change_log |
3 | Can delete log | 7 | delete_log |
4 | Can view log | 7 | view_log |
字段解釋
id:自動(dòng)生成的
name: 描述權(quán)限的的內(nèi)容,無(wú)太大的實(shí)際作用
content_type_id:與django_content_type中的id字段對(duì)應(yīng)
codename:權(quán)限表示值,換句話說(shuō)用add_log來(lái)表示用戶對(duì)Log模型有新增權(quán)限。驗(yàn)證權(quán)限的時(shí)候就是驗(yàn)證這個(gè)值
那如果我的模型叫Student呢,把上面表中的log替換成student就行了。
name字段中Can add xx,Can change xx等都是固定的,只有xx是根據(jù)模型來(lái)的。
同理,codename字段也是一樣,add_xxx,change_xxx。
auth_permission表中content_type_id字段還沒(méi)有解釋,先來(lái)看下面這張表:
表django_content_type
id | app_label | model |
---|---|---|
1 | admin | logentry |
3 | auth | group |
2 | auth | permission |
4 | auth | user |
5 | contenttypes | contenttype |
6 | sessions | session |
7 | test | log |
字段解釋
id:自增字段;auth_permission表的content_type_id字段就對(duì)應(yīng)這個(gè)值
app_label:屬于哪個(gè)app包,上面的Log就是test app下的模型
model:模型名字
使用方法
在函數(shù)中驗(yàn)證權(quán)限,使用user.has_perm
例如:我們有一個(gè)書(shū)店,有普通員工A(model User),現(xiàn)在需要去出版社訂購(gòu)一批書(shū)(model Book),我們判斷這個(gè)人是否有權(quán)利添加(add_book)書(shū)籍。
user = User.objects.get(username='A') # has_permission是一個(gè)boolean,因?yàn)锽ook模型是放在test app下面的 has_permission = user.has_perm('test.add_book')
為什么驗(yàn)證權(quán)限的時(shí)候前面要加app名,很好理解啊,不同app有同樣名字的權(quán)限,到底是驗(yàn)證哪個(gè)呢?
驗(yàn)證函數(shù)是否有執(zhí)行權(quán)限,使用@permission_required
@permission_required def function(): pass
permission_required有三個(gè)參數(shù):
perm,描述權(quán)限的字符串,格式為:app名.權(quán)限。如"auth.add_user",“auth.delete_user”
login_url,如果沒(méi)有權(quán)限需要跳轉(zhuǎn)的url字符串,如"/login",“https://www.baidu.com”
raise_exception,boolean值,沒(méi)有權(quán)限是否觸發(fā)PermissionDenied異常,觸發(fā)異常則直接返回,不會(huì)跳轉(zhuǎn)到login_url指向的地址
在template上使用權(quán)限驗(yàn)證
第一種寫(xiě)法
首先,我們需要在app的根目錄下創(chuàng)建一個(gè)名為templatetags的包(IDEA會(huì)自動(dòng)在包下創(chuàng)建__init__文件),接著在包里面創(chuàng)建一個(gè)文件my_tags.py,在my_tags.py里面定義一個(gè)過(guò)濾器has_permission,使用這個(gè)濾器對(duì)用戶進(jìn)行權(quán)限驗(yàn)證,它接收兩個(gè)參數(shù):
user,當(dāng)前登錄的用戶對(duì)象
perm,需要驗(yàn)證的權(quán)限字符串
from django import template register = template.Library() @register.filter def has_permisstion(user, perm): if user: return user.has_perm(perm) return False
接著,我們創(chuàng)建一個(gè)名為index.html的模板頁(yè)面,一定要記得加載標(biāo)簽文件{% load my_tags %}。
<!DOCTYPE html> {% load my_tags %} <html lang="en"> <head> <meta charset="UTF-8"> <title>首頁(yè)</title> </head> <body> <p>后面的內(nèi)容只有有權(quán)限的人才能看到, {% if request.user|has_permisstion:'test.add_department' %} 我有權(quán)限 {% endif %} </p> </body> </html>
目錄結(jié)構(gòu):
演示結(jié)果,我已經(jīng)登錄過(guò)了,并且有權(quán)限了:
第二種寫(xiě)法
使用模板里面的全局變量perms,例如perms.test.add_department
{% if perms.應(yīng)用名.權(quán)限標(biāo)識(shí) %} <!-- 這里是有權(quán)限才顯示的內(nèi)容 --> {% endif %}
自定義權(quán)限
首先,我在test app的model文件中建立了一個(gè)Department模型,然后給他增加了一個(gè)自定義權(quán)限。
class Department(models.Model): name = models.CharField(null=True, max_length=20) user = models.ManyToManyField(User) one_user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='one_user') class Meta: # permissions是一個(gè)元組,記得每組權(quán)限后面加逗號(hào),下面是一組權(quán)限 permissions = ( # (權(quán)限,權(quán)限描述), ('customize_permission', 'This is my customize permission'), )
執(zhí)行下面語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)同步修改:
python manage.py makemigrations
python manage.py migrate
系統(tǒng)輸出,說(shuō)明增加成功
>> Migrations for 'test': test\migrations\0003_auto_20200407_1645.py - Change Meta options on department
打開(kāi)數(shù)據(jù)庫(kù)驗(yàn)證,成功。
然后,我們就能像前面一樣使用customize_permission這個(gè)權(quán)限了。
以上這篇django自帶的權(quán)限管理Permission用法說(shuō)明就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python基于數(shù)列實(shí)現(xiàn)購(gòu)物車程序過(guò)程詳解
這篇文章主要介紹了Python基于數(shù)列實(shí)現(xiàn)購(gòu)物車程序過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06使用python實(shí)現(xiàn)簡(jiǎn)單五子棋游戲
這篇文章主要為大家詳細(xì)介紹了使用python實(shí)現(xiàn)簡(jiǎn)單五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06Pytorch損失函數(shù)torch.nn.NLLLoss()的使用
這篇文章主要介紹了Pytorch損失函數(shù)torch.nn.NLLLoss()的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Python ckeditor富文本編輯器代碼實(shí)例解析
這篇文章主要介紹了Python ckeditor富文本編輯器代碼實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06詳解Python中RegEx在數(shù)據(jù)處理中的應(yīng)用
正則表達(dá)式(Regular?Expressions,簡(jiǎn)稱?RegEx)是一種強(qiáng)大的文本匹配和搜索工具,它在數(shù)據(jù)處理、文本解析和字符串操作中發(fā)揮著關(guān)鍵作用,下面就跟隨小編一起來(lái)了解一下RegEx的具體使用吧2024-01-01Python辦公自動(dòng)化之教你用Python批量識(shí)別發(fā)票并錄入到Excel表格中
今天來(lái)分享一篇辦公干貨文章,對(duì)于財(cái)務(wù)專業(yè)等學(xué)生或者公司財(cái)務(wù)人員來(lái)說(shuō),將報(bào)賬發(fā)票等匯總到excel簡(jiǎn)直就是一個(gè)折磨.尤其是到年底的時(shí)候,公司的財(cái)務(wù)人員面對(duì)一大堆的發(fā)票簡(jiǎn)直就是苦不堪言.正好我們學(xué)會(huì)了Python,我們應(yīng)該將Python的優(yōu)勢(shì)發(fā)揮起來(lái),需要的朋友可以參考下2021-06-06