最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

對Django中的權(quán)限和分組管理實(shí)例講解

 更新時間:2019年08月16日 18:02:28   作者:stu_xujin  
今天小編就為大家分享一篇對Django中的權(quán)限和分組管理實(shí)例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

權(quán)限

Django中內(nèi)置了權(quán)限的功能。他的權(quán)限都是針對表或者說是模型級別的。比如對某個模型上的數(shù)據(jù)是否可以進(jìn)行增刪改查操作。他不能針對數(shù)據(jù)級別的,比如對某個表中的某條數(shù)據(jù)能否進(jìn)行增刪改查操作(如果要實(shí)現(xiàn)數(shù)據(jù)級別的,考慮使用django-guardian)。創(chuàng)建完一個模型后,針對這個模型默認(rèn)就有四種權(quán)限,分別是增/刪/改/查。可以在執(zhí)行完migrate命令后,查看數(shù)據(jù)庫中的auth_permission表中的所有權(quán)限。

字段:

content_type_id:是一個外鍵,參考表是django_content_type這個表,django就是根據(jù)這個來找到某一個具體的模型的。

codename: 表示權(quán)限的名字。

name: 對該權(quán)限的描述。

添加權(quán)限

通過定義模型添加權(quán)限:

如果我們想要增加新的權(quán)限,比如查看某個模型的權(quán)限,那么我們可以在定義模型的時候在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','拉黑文章的權(quán)限'),
 ]

然后執(zhí)行makemigrations和migrate命令,就添加好了這一條權(quán)限。我們可以數(shù)據(jù)庫中的auth_permission表中看到我們添加的這一條權(quán)限。

通過代碼來添加權(quán)限。

權(quán)限都是django.contrib.auth.Permission的實(shí)例。這個模型包含三個字段,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('權(quán)限創(chuàng)建成功') 

然后執(zhí)行這個視圖函數(shù),就能夠添加這個權(quán)限了。

注意: name字段是不能有重復(fù)的,否則會報錯。

用戶與權(quán)限管理:

權(quán)限本身只是一個數(shù)據(jù),必須和用戶進(jìn)行綁定,才能起到作用。User模型和權(quán)限之間的管理,可以通過以下幾種方式來管理:

1、myuser.user_permissions.set(permission_list):直接給定一個權(quán)限的列表。

2、myuser.user_permissions.add(permission,permission,…):一個個添加權(quán)限。這里就不能傳入一個列表了,只能一個一個的傳入數(shù)據(jù)了。

3、myuser.user_permissions.remove(permission,permission,…):一個個刪除權(quán)限。

4、myuser.user_permissions.clear():清除所有的權(quán)限。

5、myuser.has_perm('<app_name>.'):判斷是否擁有某個權(quán)限。權(quán)限參數(shù)是一個字符串,格式是app_name.codename。

6、myuser.get_all_permissons():獲取所有的權(quán)限。

注意:

這個地方的User模型并不是我們自定義的User模型,而是Django內(nèi)置的一個User模型,而我們自定義的模型是不能夠這樣進(jìn)行操作的。django內(nèi)置的User模型我們需要導(dǎo)入:from django.contrib.auth.models import User。

現(xiàn)在,我們給User模型綁定Article模型的一些權(quán)限:

執(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)建成功')

然后對該用戶的權(quán)限進(jìn)行操作:

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)
 # 添加權(quán)限
 user.user_permissions.set(permissions)
 # 清除所有的權(quán)限
 # user.user_permissions.clear()
 # 查看是否擁有某個權(quán)限
 if user.has_perm('authority.view_article'):
 print('這個用戶擁有view_article的權(quán)限')
 else:
 print('這個用戶沒有view_article的權(quán)限')
 return HttpResponse('操作權(quán)限的視圖')

權(quán)限限定裝飾器:

我們可以判斷某一個用戶是否擁有某個權(quán)限,再對它判斷是否可以訪問某一個頁面。

要判斷某個用戶是否擁有某個權(quán)限,我們首先得登錄:

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內(nèi)置的一個登錄函數(shù)來登錄,登錄成功之后會設(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('已經(jīng)登錄了')
 # 再判斷是否擁有這個權(quán)限
 if request.user.has_perm('authority.add_article'):
  return HttpResponse('添加文章的頁面')
 else:
  # 403表示沒有權(quán)限的意思
  return HttpResponse('你沒有訪問該頁面的權(quán)限',status=403)
 else:
 return HttpResponse('你還沒有登錄,請登錄?。。?)

這樣,我們就實(shí)現(xiàn)了對某個用戶的權(quán)限限制了。

上面這種方法是我們自己手動實(shí)現(xiàn)的,Django也內(nèi)置一個裝飾器permission_required,來幫我們實(shí)現(xiàn)了這個功能:

from django.contrib.auth.decorators import permission_required

# login_url沒有登錄跳轉(zhuǎn)至的頁面
# raise_exception=True,當(dāng)你沒有權(quán)限訪問這個頁面的時候,就會拋出一個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('已經(jīng)登錄了')
 # if request.user.has_perm('authority.add_article'):
 #  return HttpResponse('添加文章的頁面')
 # else:
 #  # 403表示沒有權(quán)限的意思
 #  return HttpResponse('你沒有訪問該頁面的權(quán)限',status=403)
 # else:
 # return HttpResponse('你還沒有登錄,請登錄!??!')
 return HttpResponse('添加文章的頁面')

這樣,我們就不用寫上面那么多代碼了,只需要寫入我們的主體函數(shù)就可以了。

注意: 如果一個函數(shù)視圖需要多個權(quán)限才能進(jìn)入的話,我們可以將需要的權(quán)限放入一個列表中,然后再將這個列表放在裝飾器中。這個時候如果我們手動實(shí)現(xiàn)這個裝飾器的功能的話,就要使用has_perms方法來判斷了。

分組:

權(quán)限有很多,一個模型就有最少四個權(quán)限,如果一些用戶擁有相同的權(quán)限,那么每次都要重復(fù)添加。這時候分組就可以幫我們解決這種問題了,我們可以把一些權(quán)限歸類,然后添加到某個分組中,之后再把和把需要賦予這些權(quán)限的用戶添加到這個分組中,就比較好管理了。分組我們使用的是django.contrib.auth.models.Group模型, 每個用戶組擁有id和name兩個字段,該模型在數(shù)據(jù)庫被映射為auth_group數(shù)據(jù)表。

分組操作:

Group.object.create(group_name):創(chuàng)建分組。

group.permissions:某個分組上的權(quán)限。多對多的關(guān)系。

group.permissions.add:添加權(quán)限。

group.permissions.remove:移除權(quán)限。

group.permissions.clear:清除所有權(quán)限。

user.get_group_permissions():獲取用戶所屬組的權(quán)限。

user.groups:某個用戶上的所有分組。多對多的關(guān)系。

我們首先新建一個分組:

from django.contrib.auth.models import Permission,ContentType,Group
from .models import Article

def operate_group(request):
 group = Group.objects.create(name='運(yùn)營')
 # 額到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)建了一個運(yùn)營的分組,并且將Article這個模型所有的權(quán)限都添加進(jìn)去了。

然后我們可以查看我們的數(shù)據(jù)庫中我們添加的信息。在表auth_group和auth_group_permissions中,因?yàn)間roup和permissions是一個多對多的關(guān)系,所以它們擁有一個中間表。

我們創(chuàng)建好了一個組,那么我們就需要添加一個用戶進(jìn)去了。

修改上面的函數(shù)為:

def operate_group(request):
 # group = Group.objects.create(name='運(yùn)營')
 # # 額到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='運(yùn)營').first()
 user = User.objects.first()
 user.groups.add(group)
 user.save()
 return HttpResponse('操作分組')

這樣,我們就對運(yùn)營這個組添加了一個用戶進(jìn)去了。

判斷某個group下的某個用戶的所有權(quán)限:

def operate_group(request):
 # group = Group.objects.create(name='運(yùn)營')
 # # 額到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='運(yùn)營').first()
 # user = User.objects.first()
 # user.groups.add(group)
 # user.save()

 user = User.objects.first()
 permissions = user.get_group_permissions()
 print(permissions)
 return HttpResponse('操作分組')

在模板中使用權(quán)限:

在settings.TEMPLATES.OPTIONS.context_processors下,因?yàn)樘砑恿薲jango.contrib.auth.context_processors.auth上下文處理器,因此在模板中可以直接通過perms來獲取用戶的所有權(quán)限。

我們新建一個index.html的文件,然后渲染一下這個頁面:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>

<h1>首頁</h1>
{#如果擁有這個權(quán)限,我就顯示這個標(biāo)簽#}
{% if perms.authority.add_article %}
 <a href="#" rel="external nofollow" >添加文章</a>
{% endif %}

</body>
</html>

然后新建一個視圖來渲染這個頁面:

def index(request):
 return render(request,'index.html')

然后添加url,就可以了。當(dāng)我們沒有登錄的時候,也不會顯示出來。

以上這篇對Django中的權(quán)限和分組管理實(shí)例講解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python入門之實(shí)例方法、類方法和靜態(tài)方法的區(qū)別講解

    Python入門之實(shí)例方法、類方法和靜態(tài)方法的區(qū)別講解

    這篇文章主要介紹了Python入門之實(shí)例方法、類方法和靜態(tài)方法的區(qū)別講解,實(shí)例方法是在創(chuàng)建了類的實(shí)例之后才能被調(diào)用的方法,類方法是在不需要創(chuàng)建類的實(shí)例的情況下就可以調(diào)用的方法,最后,靜態(tài)方法是與類和類的實(shí)例都沒有綁定關(guān)系的方法,需要的朋友可以參考下
    2023-10-10
  • python的random和time模塊詳解

    python的random和time模塊詳解

    這篇文章主要介紹了python的random和time模塊,具有一定借鑒價值,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10
  • Python教程pandas數(shù)據(jù)分析去重復(fù)值

    Python教程pandas數(shù)據(jù)分析去重復(fù)值

    Pandas指定行進(jìn)行去重更新值,加載數(shù)據(jù)sample抽樣函數(shù),指定需要更新的值append直接添加append函數(shù)用法,根據(jù)某一列key值進(jìn)行去重key唯一
    2021-09-09
  • Python使用datetime庫實(shí)現(xiàn)對時間的獲取方法

    Python使用datetime庫實(shí)現(xiàn)對時間的獲取方法

    這篇文章通過一個簡單示例給大家介紹了Python如何使用datetime庫實(shí)現(xiàn)對時間的獲取方法,文章通過代碼示例給大家介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2023-11-11
  • python在新的圖片窗口顯示圖片(圖像)的方法

    python在新的圖片窗口顯示圖片(圖像)的方法

    今天小編就為大家分享一篇python在新的圖片窗口顯示圖片(圖像)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python3實(shí)現(xiàn)飛機(jī)大戰(zhàn)

    python3實(shí)現(xiàn)飛機(jī)大戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • python實(shí)現(xiàn)猜單詞游戲

    python實(shí)現(xiàn)猜單詞游戲

    這篇文章主要為大家詳細(xì)介紹了python猜單詞小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 關(guān)于python如何生成exe文件

    關(guān)于python如何生成exe文件

    這篇文章主要介紹了關(guān)于python如何生成exe文件,exe全稱“executable”,中文意思為“可執(zhí)行的”,是一種文件格式,是指一種可在操作系統(tǒng)存儲空間中浮動定位的可執(zhí)行程序,需要的朋友可以參考下
    2023-04-04
  • 詳解超星腳本出現(xiàn)亂碼問題的解決方法(Python)

    詳解超星腳本出現(xiàn)亂碼問題的解決方法(Python)

    超星助手是一款為孩子們提供學(xué)習(xí)的軟件,支持用戶們后臺運(yùn)行多開等,還可以簽到,查題等多功能,下面這篇文章主要給大家介紹了關(guān)于超星腳本出現(xiàn)亂碼問題的解決方法,需要的朋友可以參考下
    2022-05-05
  • 數(shù)組保存為txt, npy, csv 文件, 數(shù)組遍歷enumerate的方法

    數(shù)組保存為txt, npy, csv 文件, 數(shù)組遍歷enumerate的方法

    今天小編就為大家分享一篇數(shù)組保存為txt, npy, csv 文件, 數(shù)組遍歷enumerate的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07

最新評論

客服| 罗山县| 抚宁县| 农安县| 济宁市| 邯郸县| 理塘县| 米易县| 宜城市| 搜索| 凤阳县| 城固县| 抚顺县| 山阳县| 咸宁市| 潼南县| 苏州市| 汝州市| 阳信县| 房山区| 延庆县| 涞源县| 宿迁市| 大埔县| 长顺县| 永平县| 融水| 宿松县| 凉城县| 海淀区| 金川县| 蒲江县| 长岭县| 曲周县| 镇平县| 汾西县| 澎湖县| 彩票| 青阳县| 凌海市| 阜宁县|