对Django中的权限和分组管理实例讲解

权限

Django中内置了权限的功能。他的权限都是针对表或者说是模型级别的。比如对某个模型上的数据是否可以进行增删改查操作。他不能针对数据级别的,比如对某个表中的某条数据能否进行增删改查操作(如果要实现数据级别的,考虑使用django-guardian)。创建完一个模型后,针对这个模型默认就有四种权限,分别是增/删/改/查。可以在执行完migrate命令后,查看数据库中的auth_permission表中的所有权限。

字段:

content_type_id:是一个外键,参考表是django_content_type这个表,django就是根据这个来找到某一个具体的模型的。

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','拉黑文章的权限'),
 ]

然后执行makemigrations和migrate命令,就添加好了这一条权限。我们可以数据库中的auth_permission表中看到我们添加的这一条权限。

通过代码来添加权限。

权限都是django.contrib.auth.Permission的实例。这个模型包含三个字段,name、codename以及content_type,其中的content_type表示这个permission是属于哪个app下的哪个models。

定义一个视图函数,然后写入代码:

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('权限创建成功')

然后执行这个视图函数,就能够添加这个权限了。

注意: name字段是不能有重复的,否则会报错。

用户与权限管理:

权限本身只是一个数据,必须和用户进行绑定,才能起到作用。User模型和权限之间的管理,可以通过以下几种方式来管理:

1、myuser.user_permissions.set(permission_list):直接给定一个权限的列表。

2、myuser.user_permissions.add(permission,permission,…):一个个添加权限。这里就不能传入一个列表了,只能一个一个的传入数据了。

3、myuser.user_permissions.remove(permission,permission,…):一个个删除权限。

4、myuser.user_permissions.clear():清除所有的权限。

5、myuser.has_perm('<app_name>.'):判断是否拥有某个权限。权限参数是一个字符串,格式是app_name.codename。

6、myuser.get_all_permissons():获取所有的权限。

注意:

这个地方的User模型并不是我们自定义的User模型,而是Django内置的一个User模型,而我们自定义的模型是不能够这样进行操作的。django内置的User模型我们需要导入:from django.contrib.auth.models import User。

现在,我们给User模型绑定Article模型的一些权限:

执行上面的add方法和remove方法后需要执行一下save()方法,否则将不能保存到数据库中去。

views中新建一个视图:

首先我们需要创建一个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('用户创建成功')

然后对该用户的权限进行操作:

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内置的一个登录函数来登录,登录成功之后会设置一个session值
 login(request,user)
 else:
 return HttpResponse('用户名或密码错误')

然后我们再写入添加文章的函数视图:

def add_article(request):
 # 判断用户是否登录了,这里的用户是指后台管理员的用户,也就是Django的User模型中的用户
 # 而不是浏览网站的用户

 # 通过这个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('你还没有登录,请登录!!!')

这样,我们就实现了对某个用户的权限限制了。

上面这种方法是我们自己手动实现的,Django也内置一个装饰器permission_required,来帮我们实现了这个功能:

from django.contrib.auth.decorators import permission_required

# login_url没有登录跳转至的页面
# raise_exception=True,当你没有权限访问这个页面的时候,就会抛出一个403错误
# 如果我们在网站中写了403那个页面的话,就会重定向到403哪一个页面
@permission_required('front.add_article',login_url='front/login',raise_exception=True)
def add_article(request):
 # 判断用户是否登录了,这里的用户是指后台管理员的用户,也就是Django的User模型中的用户
 # 而不是浏览网站的用户
 # 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('添加文章的页面')

这样,我们就不用写上面那么多代码了,只需要写入我们的主体函数就可以了。

注意: 如果一个函数视图需要多个权限才能进入的话,我们可以将需要的权限放入一个列表中,然后再将这个列表放在装饰器中。这个时候如果我们手动实现这个装饰器的功能的话,就要使用has_perms方法来判断了。

分组:

权限有很多,一个模型就有最少四个权限,如果一些用户拥有相同的权限,那么每次都要重复添加。这时候分组就可以帮我们解决这种问题了,我们可以把一些权限归类,然后添加到某个分组中,之后再把和把需要赋予这些权限的用户添加到这个分组中,就比较好管理了。分组我们使用的是django.contrib.auth.models.Group模型, 每个用户组拥有id和name两个字段,该模型在数据库被映射为auth_group数据表。

分组操作:

Group.object.create(group_name):创建分组。

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('操作分组')

这里我们就创建了一个运营的分组,并且将Article这个模型所有的权限都添加进去了。

然后我们可以查看我们的数据库中我们添加的信息。在表auth_group和auth_group_permissions中,因为group和permissions是一个多对多的关系,所以它们拥有一个中间表。

我们创建好了一个组,那么我们就需要添加一个用户进去了。

修改上面的函数为:

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中的权限和分组管理实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Django的用户模块与权限系统的示例代码

    一 导言 设计一个好的用户系统往往不是那么容易,Django提供的用户系统可以快速实现基本的功能,并可以在此基础上继续扩展以满足我们的需求. 先看看Django的用户系统都提供哪些功能: 提供用户模块(User Model) 权限验证(默认添加已有模块的增加删除修改权限) 用户组与组权限功能 用户鉴权与登录功能 与用户登录验证相关的一些函数与装饰方法 如配置了Django的用户系统,仅需调用Django提供的几个函数,便可实现用户的登录,注销,权限验证等功能.例如以下情景 1.登录 # some

  • Django权限机制实现代码详解

    本文研究的主要是Django权限机制的相关内容,具体如下. 1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发,理清Django权限机制是非常必要的. 1.1 Django的权限控制 Django用user, group和permission完成了权限机制,这个权限机制是将属于model的某个permission赋予user或group,可以理解为全局的权限,即如果用户A对数

  • Django用户认证系统 组与权限解析

    Django的权限系统很简单,它可以赋予users或groups中的users以权限. Django admin后台就使用了该权限系统,不过也可以用到你自己的代码中. User对象具有两个ManyToManyField字段,groups和user_permissions groups = models.ManyToManyField(Group, verbose_name=_('groups'), blank=True, help_text=_('The groups this user bel

  • 详解Django中的权限和组以及消息

    在认证框架中还有其他的一些功能. 我们会在接下来的几个部分中进一步地了解它们. 权限 权限可以很方便地标识用户和用户组可以执行的操作. 它们被Django的admin管理站点所使用,你也可以在你自己的代码中使用它们. Django的admin站点如下使用权限: 只有设置了 add 权限的用户才能使用添加表单,添加对象的视图. 只有设置了 change 权限的用户才能使用变更列表,变更表格,变更对象的视图. 只有设置了 delete 权限的用户才能删除一个对象. 权限是根据每一个类型的对象而设置的

  • Django 内置权限扩展案例详解

    当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统,Django内置权限系统基于model层做控制,新的model创建后会默认新建三个权限,分别为:add.change.delete,如果给用户或组赋予delete的权限,那么用户将可以删除这个model下的所有数据. 原本overmind只管理了我们自己部门的数据库,权限设置只针对具体的功能不针对细粒度的数据库实例,例如用户A 有审核的权限,那么用户A 可以审核所有的DB,此

  • 对Django中的权限和分组管理实例讲解

    权限 Django中内置了权限的功能.他的权限都是针对表或者说是模型级别的.比如对某个模型上的数据是否可以进行增删改查操作.他不能针对数据级别的,比如对某个表中的某条数据能否进行增删改查操作(如果要实现数据级别的,考虑使用django-guardian).创建完一个模型后,针对这个模型默认就有四种权限,分别是增/删/改/查.可以在执行完migrate命令后,查看数据库中的auth_permission表中的所有权限. 字段: content_type_id:是一个外键,参考表是django_co

  • Django中反向生成models.py的实例讲解

    命令行中进入Django项目目录,执行 python manage.py inspectdb testmodel_test 其中testmodel_test为数据表,生成的结果 from django.db import models class TestmodelTest(models.Model): name = models.CharField(max_length=20) c1 = models.CharField(max_length=255, blank=True, null=Tru

  • 对Django中内置的User模型实例详解

    User模型 User模型是这个框架的核心部分.他的完整的路径是在django.contrib.auth.models.User. 字段 内置的User模型拥有以下的字段: 1.username: 用户名.150个字符以内.可以包含数字和英文字符,以及_.@.+..和-字符.不能为空,且必须唯一! 2.first_name:歪果仁的first_name,在30个字符以内.可以为空. 3.last_name:歪果仁的last_name,在150个字符以内.可以为空. 4.email:邮箱.可以为空

  • Django中的cookie与session操作实例代码

    添加cookie: def login(req): if req.method=="POST": uf = UserInfoForm(req.POST) if uf.is_valid(): username = uf.cleaned_data["username"] password = uf.cleaned_data["password"] print username,password users = UserInfo.objects.fil

  • 在Windows中设置Python环境变量的实例讲解

    在 Windows 设置环境变量 在环境变量中添加Python目录: 在命令提示框中(cmd) : 输入 path=%path%;C:\Python 按下"Enter". 注意: C:\Python 是Python的安装目录. 也可以通过以下方式设置: • 右键点击"计算机",然后点击"属性" • 然后点击"高级系统设置" • 选择"系统变量"窗口下面的"Path",双击即可! • 然后

  • java中volatile不能保证线程安全(实例讲解)

    今天打了打代码研究了一下java的volatile关键字到底能不能保证线程安全,经过实践,volatile是不能保证线程安全的,它只是保证了数据的可见性,不会再缓存,每个线程都是从主存中读到的数据,而不是从缓存中读取的数据,附上代码如下,当synchronized去掉的时候,每个线程的结果是乱的,加上的时候结果才是正确的. /** * * 类简要描述 * * <p> * 类详细描述 * </p> * * @author think * */ public class Volatil

  • python中判断文件编码的chardet(实例讲解)

    1.实测,这个版本在32位window7和python3.2环境下正常使用. 2.使用方法:把解压后所得的chardet和docs两个文件夹拷贝到python3.2目录下的Lib\site-packages目录下就可以正常使用了. 3.判断文件编码的参考代码如下: file = open(fileName, "rb")#要有"rb",如果没有这个的话,默认使用gbk读文件. buf = file.read() result = chardet.detect(buf)

  • 基于TabLayout中的Tab间隔设置方法(实例讲解)

    TabLayout和ViewPager搭配使用,是有很多方便性,但是TabLayout这东西还是有很多被人吐槽的地方. 这里只讲怎么设置tab之间的间隔,网上找了一堆方法,什么padding和margin的啥都没用,没办法,想用TabLayout只能自己想办法了.效果如下: 一.实现方法,既然这东西不好设置,那就直接在背景上做点事情,布局代码如下: <android.support.design.widget.TabLayout xmlns:app="http://schemas.andr

  • python中字符串变二维数组的实例讲解

    有一道算法题题目的意思是在二维数组里找到一个峰值.要求复杂度为n. 解题思路是找田字(四边和中间横竖两行)中最大值,用分治法递归下一个象限的田字. 在用python定义一个二维数组时可以有list和numpy.array两种方式,看了几篇python中二维数组的建立的博客发现大多都是建立的初始化的二维数组,而我需要通过文件读取得到的是字符串,再把字符串转换为二维数组,找不到解决方法还是决定自己来转换. 首先,最开始的字符串输出如下,数字之间有空格 思路就是把先按换行符进行切片,再对每一行的字符再

  • Python 使用PIL中的resize进行缩放的实例讲解

    今天突然发现自己缩放程序有问题,图片缩放尺度大了就会失真.小编一直使用的是缩小的功能,图片缩小整体0.7还可以,整体缩小0.65就会有部分的信息丢失,怎奈我的图都是大图,没办法只能寻找解决方法. 原来代码 img = img.resize((width, height)) 后来找资料发现 PIL带ANTIALIAS滤镜缩放结果 所以将代码改为: img = img.resize((width, height),Image.ANTIALIAS) 以上这篇Python 使用PIL中的resize进行

随机推荐