對Django中的權限和分組管理實例講解
權限
Django中內置了權限的功能。他的權限都是針對表或者說是模型級別的。比如對某個模型上的數(shù)據(jù)是否可以進行增刪改查操作。他不能針對數(shù)據(jù)級別的,比如對某個表中的某條數(shù)據(jù)能否進行增刪改查操作(如果要實現(xiàn)數(shù)據(jù)級別的,考慮使用django-guardian)。創(chuàng)建完一個模型后,針對這個模型默認就有四種權限,分別是增/刪/改/查??梢栽趫?zhí)行完migrate命令后,查看數(shù)據(jù)庫中的auth_permission表中的所有權限。
字段:
content_type_id:是一個外鍵,參考表是django_content_type這個表,django就是根據(jù)這個來找到某一個具體的模型的。
codename: 表示權限的名字。
name: 對該權限的描述。
添加權限
通過定義模型添加權限:
如果我們想要增加新的權限,比如查看某個模型的權限,那么我們可以在定義模型的時候在Meta中定義好。
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
author = models.CharField(max_length=20)
class Meta:
permissions = [
('black_article','拉黑文章的權限'),
]
然后執(zhí)行makemigrations和migrate命令,就添加好了這一條權限。我們可以數(shù)據(jù)庫中的auth_permission表中看到我們添加的這一條權限。
通過代碼來添加權限。
權限都是django.contrib.auth.Permission的實例。這個模型包含三個字段,name、codename以及content_type,其中的content_type表示這個permission是屬于哪個app下的哪個models。
定義一個視圖函數(shù),然后寫入代碼:
from django.http import HttpResponse
from .models import Article
from django.contrib.auth.models import Permission,ContentType
# Create your views here.
def add_permission(request):
content_type = ContentType.objects.get_for_model(Article)
permission = Permission.objects.create(codename='white_article',name='將文章加入白名單',content_type=content_type)
return HttpResponse('權限創(chuàng)建成功')
然后執(zhí)行這個視圖函數(shù),就能夠添加這個權限了。
注意: name字段是不能有重復的,否則會報錯。
用戶與權限管理:
權限本身只是一個數(shù)據(jù),必須和用戶進行綁定,才能起到作用。User模型和權限之間的管理,可以通過以下幾種方式來管理:
1、myuser.user_permissions.set(permission_list):直接給定一個權限的列表。
2、myuser.user_permissions.add(permission,permission,…):一個個添加權限。這里就不能傳入一個列表了,只能一個一個的傳入數(shù)據(jù)了。
3、myuser.user_permissions.remove(permission,permission,…):一個個刪除權限。
4、myuser.user_permissions.clear():清除所有的權限。
5、myuser.has_perm('<app_name>.'):判斷是否擁有某個權限。權限參數(shù)是一個字符串,格式是app_name.codename。
6、myuser.get_all_permissons():獲取所有的權限。
注意:
這個地方的User模型并不是我們自定義的User模型,而是Django內置的一個User模型,而我們自定義的模型是不能夠這樣進行操作的。django內置的User模型我們需要導入:from django.contrib.auth.models import User。
現(xiàn)在,我們給User模型綁定Article模型的一些權限:
執(zhí)行上面的add方法和remove方法后需要執(zhí)行一下save()方法,否則將不能保存到數(shù)據(jù)庫中去。
views中新建一個視圖:
首先我們需要創(chuàng)建一個User用戶:
from django.contrib.auth.models import Permission,ContentType,User
def createUser(request):
user = User.objects.create_user(username='xujin',email='qq@qq.com',password='111111')
return HttpResponse('用戶創(chuàng)建成功')
然后對該用戶的權限進行操作:
from django.http import HttpResponse
from .models import Article
from django.contrib.auth.models import Permission,ContentType,User
def operate_permission(request):
user = User.objects.first()
content_type = ContentType.objects.get_for_model(Article)
permissions = Permission.objects.filter(content_type=content_type)
for permission in permissions:
print(permission)
# 添加權限
user.user_permissions.set(permissions)
# 清除所有的權限
# user.user_permissions.clear()
# 查看是否擁有某個權限
if user.has_perm('authority.view_article'):
print('這個用戶擁有view_article的權限')
else:
print('這個用戶沒有view_article的權限')
return HttpResponse('操作權限的視圖')
權限限定裝飾器:
我們可以判斷某一個用戶是否擁有某個權限,再對它判斷是否可以訪問某一個頁面。
要判斷某個用戶是否擁有某個權限,我們首先得登錄:
from django.contrib.auth import authenticate,login
def my_login(request):
username = 'xujin'
password = '111111'
# username和password輸入正確后這里會返回一個User對象
user = authenticate(request,username=username,password=password)
# 判斷是否有該用戶
if user:
# 使用django內置的一個登錄函數(shù)來登錄,登錄成功之后會設置一個session值
login(request,user)
else:
return HttpResponse('用戶名或密碼錯誤')
然后我們再寫入添加文章的函數(shù)視圖:
def add_article(request):
# 判斷用戶是否登錄了,這里的用戶是指后臺管理員的用戶,也就是Django的User模型中的用戶
# 而不是瀏覽網(wǎng)站的用戶
# 通過這個request.user.is_authenticated可以判斷是否登錄了
if request.user.is_authenticated:
print('已經登錄了')
# 再判斷是否擁有這個權限
if request.user.has_perm('authority.add_article'):
return HttpResponse('添加文章的頁面')
else:
# 403表示沒有權限的意思
return HttpResponse('你沒有訪問該頁面的權限',status=403)
else:
return HttpResponse('你還沒有登錄,請登錄?。?!')
這樣,我們就實現(xiàn)了對某個用戶的權限限制了。
上面這種方法是我們自己手動實現(xiàn)的,Django也內置一個裝飾器permission_required,來幫我們實現(xiàn)了這個功能:
from django.contrib.auth.decorators import permission_required
# login_url沒有登錄跳轉至的頁面
# raise_exception=True,當你沒有權限訪問這個頁面的時候,就會拋出一個403錯誤
# 如果我們在網(wǎng)站中寫了403那個頁面的話,就會重定向到403哪一個頁面
@permission_required('front.add_article',login_url='front/login',raise_exception=True)
def add_article(request):
# 判斷用戶是否登錄了,這里的用戶是指后臺管理員的用戶,也就是Django的User模型中的用戶
# 而不是瀏覽網(wǎng)站的用戶
# if request.user.is_authenticated:
# print('已經登錄了')
# if request.user.has_perm('authority.add_article'):
# return HttpResponse('添加文章的頁面')
# else:
# # 403表示沒有權限的意思
# return HttpResponse('你沒有訪問該頁面的權限',status=403)
# else:
# return HttpResponse('你還沒有登錄,請登錄!??!')
return HttpResponse('添加文章的頁面')
這樣,我們就不用寫上面那么多代碼了,只需要寫入我們的主體函數(shù)就可以了。
注意: 如果一個函數(shù)視圖需要多個權限才能進入的話,我們可以將需要的權限放入一個列表中,然后再將這個列表放在裝飾器中。這個時候如果我們手動實現(xiàn)這個裝飾器的功能的話,就要使用has_perms方法來判斷了。
分組:
權限有很多,一個模型就有最少四個權限,如果一些用戶擁有相同的權限,那么每次都要重復添加。這時候分組就可以幫我們解決這種問題了,我們可以把一些權限歸類,然后添加到某個分組中,之后再把和把需要賦予這些權限的用戶添加到這個分組中,就比較好管理了。分組我們使用的是django.contrib.auth.models.Group模型, 每個用戶組擁有id和name兩個字段,該模型在數(shù)據(jù)庫被映射為auth_group數(shù)據(jù)表。
分組操作:
Group.object.create(group_name):創(chuàng)建分組。
group.permissions:某個分組上的權限。多對多的關系。
group.permissions.add:添加權限。
group.permissions.remove:移除權限。
group.permissions.clear:清除所有權限。
user.get_group_permissions():獲取用戶所屬組的權限。
user.groups:某個用戶上的所有分組。多對多的關系。
我們首先新建一個分組:
from django.contrib.auth.models import Permission,ContentType,Group
from .models import Article
def operate_group(request):
group = Group.objects.create(name='運營')
# 額到Article這個模型的content_type_id
content_type = ContentType.objects.get_for_model(Article)
permissions = Permission.objects.filter(content_type=content_type)
group.permissions.set(permissions)
return HttpResponse('操作分組')
這里我們就創(chuàng)建了一個運營的分組,并且將Article這個模型所有的權限都添加進去了。
然后我們可以查看我們的數(shù)據(jù)庫中我們添加的信息。在表auth_group和auth_group_permissions中,因為group和permissions是一個多對多的關系,所以它們擁有一個中間表。
我們創(chuàng)建好了一個組,那么我們就需要添加一個用戶進去了。
修改上面的函數(shù)為:
def operate_group(request):
# group = Group.objects.create(name='運營')
# # 額到Article這個模型的content_type_id
# content_type = ContentType.objects.get_for_model(Article)
# permissions = Permission.objects.filter(content_type=content_type)
# group.permissions.set(permissions)
group = Group.objects.filter(name='運營').first()
user = User.objects.first()
user.groups.add(group)
user.save()
return HttpResponse('操作分組')
這樣,我們就對運營這個組添加了一個用戶進去了。
判斷某個group下的某個用戶的所有權限:
def operate_group(request):
# group = Group.objects.create(name='運營')
# # 額到Article這個模型的content_type_id
# content_type = ContentType.objects.get_for_model(Article)
# permissions = Permission.objects.filter(content_type=content_type)
# group.permissions.set(permissions)
# group = Group.objects.filter(name='運營').first()
# user = User.objects.first()
# user.groups.add(group)
# user.save()
user = User.objects.first()
permissions = user.get_group_permissions()
print(permissions)
return HttpResponse('操作分組')
在模板中使用權限:
在settings.TEMPLATES.OPTIONS.context_processors下,因為添加了django.contrib.auth.context_processors.auth上下文處理器,因此在模板中可以直接通過perms來獲取用戶的所有權限。
我們新建一個index.html的文件,然后渲染一下這個頁面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>首頁</h1>
{#如果擁有這個權限,我就顯示這個標簽#}
{% if perms.authority.add_article %}
<a href="#" rel="external nofollow" >添加文章</a>
{% endif %}
</body>
</html>
然后新建一個視圖來渲染這個頁面:
def index(request): return render(request,'index.html')
然后添加url,就可以了。當我們沒有登錄的時候,也不會顯示出來。
以上這篇對Django中的權限和分組管理實例講解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
django使用django-apscheduler 實現(xiàn)定時任務的例子
今天小編就為大家分享一篇django使用django-apscheduler 實現(xiàn)定時任務的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Python使用Pandas處理測試數(shù)據(jù)的方法
Pandas是一個功能極其強大的數(shù)據(jù)分析庫,可以高效地操作各種數(shù)據(jù)集,這篇文章主要介紹了Python自動化測試-使用Pandas來高效處理測試數(shù)據(jù),需要的朋友可以參考下2023-02-02
Python 格式化打印json數(shù)據(jù)方法(展開狀態(tài))
今天小編就為大家分享一篇Python 格式化打印json數(shù)據(jù)方法(展開狀態(tài)),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Python實現(xiàn)爬取需要登錄的網(wǎng)站完整示例
這篇文章主要介紹了Python實現(xiàn)爬取需要登錄的網(wǎng)站,結合完整實例形式分析了Python登陸網(wǎng)站及數(shù)據(jù)抓取相關操作技巧,需要的朋友可以參考下2017-08-08
Python實現(xiàn)FTP上傳文件或文件夾實例(遞歸)
本篇文章主要介紹了Python實現(xiàn)FTP上傳文件或文件夾實例(遞歸),具有一定的參考價值,有興趣的可以了解一下。2017-01-01
Python小程序編程實現(xiàn)一鍵自動整理文件解壓文件
這篇文章主要為大家介紹了Python小程序編程實現(xiàn)一鍵自動整理文件解壓文件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
pandas pivot_table() 按日期分多列數(shù)據(jù)的方法
今天小編就為大家分享一篇pandas pivot_table() 按日期分多列數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11

