django自带的权限管理Permission用法说明

 更新时间:2020年05月13日 10:07:32   作者:C丶卡萝尔  
这篇文章主要介绍了django自带的权限管理Permission用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

前言

一些公司内部的CMS系统存在某些内容让指定的用户有权限访问,这时候可以用django自带的权限管理进行限制,比较方便。

缺点:django自带的权限是针对model(模型)的,不能针对单条数据,要针对单条数据需要额外的操作。

默认的权限(add, change, delete, view)

django针对每个模型,生成了四个默认的权限(add, change, delete, view)。例如,我有一个model叫Log,那么这四个默认权限在数据库的存储格式为:

表auth_permission(注:id字段的值是随便取的,使用python manage.py migrate的时候会自动生成)

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:自动生成的

name: 描述权限的的内容,无太大的实际作用

content_type_id:与django_content_type中的id字段对应

codename:权限表示值,换句话说用add_log来表示用户对Log模型有新增权限。验证权限的时候就是验证这个值

那如果我的模型叫Student呢,把上面表中的log替换成student就行了。

name字段中Can add xx,Can change xx等都是固定的,只有xx是根据模型来的。

同理,codename字段也是一样,add_xxx,change_xxx。

auth_permission表中content_type_id字段还没有解释,先来看下面这张表:

表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字段就对应这个值

app_label:属于哪个app包,上面的Log就是test app下的模型

model:模型名字

使用方法

在函数中验证权限,使用user.has_perm

例如:我们有一个书店,有普通员工A(model User),现在需要去出版社订购一批书(model Book),我们判断这个人是否有权利添加(add_book)书籍。

user = User.objects.get(username='A')
# has_permission是一个boolean,因为Book模型是放在test app下面的
has_permission = user.has_perm('test.add_book')

为什么验证权限的时候前面要加app名,很好理解啊,不同app有同样名字的权限,到底是验证哪个呢?

验证函数是否有执行权限,使用@permission_required

@permission_required
def function():
 pass

permission_required有三个参数:

perm,描述权限的字符串,格式为:app名.权限。如"auth.add_user",“auth.delete_user”

login_url,如果没有权限需要跳转的url字符串,如"/login",“https://www.baidu.com”

raise_exception,boolean值,没有权限是否触发PermissionDenied异常,触发异常则直接返回,不会跳转到login_url指向的地址

在template上使用权限验证

第一种写法

首先,我们需要在app的根目录下创建一个名为templatetags的包(IDEA会自动在包下创建__init__文件),接着在包里面创建一个文件my_tags.py,在my_tags.py里面定义一个过滤器has_permission,使用这个滤器对用户进行权限验证,它接收两个参数:

user,当前登录的用户对象

perm,需要验证的权限字符串

from django import template

register = template.Library()

@register.filter
def has_permisstion(user, perm):
 if user:
  return user.has_perm(perm)
 return False

接着,我们创建一个名为index.html的模板页面,一定要记得加载标签文件{% load my_tags %}。

<!DOCTYPE html>
{% load my_tags %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<p>后面的内容只有有权限的人才能看到,
{% if request.user|has_permisstion:'test.add_department' %}
我有权限
{% endif %}
</p>
</body>
</html>

目录结构:

演示结果,我已经登录过了,并且有权限了:

第二种写法

使用模板里面的全局变量perms,例如perms.test.add_department

{% if perms.应用名.权限标识 %}
 <!-- 这里是有权限才显示的内容 -->
{% endif %}

自定义权限

首先,我在test app的model文件中建立了一个Department模型,然后给他增加了一个自定义权限。

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是一个元组,记得每组权限后面加逗号,下面是一组权限
  permissions = (
   # (权限,权限描述),
   ('customize_permission', 'This is my customize permission'),
  )

执行下面语句进行数据库同步修改:

python manage.py makemigrations
python manage.py migrate

系统输出,说明增加成功

>> Migrations for 'test':
 test\migrations\0003_auto_20200407_1645.py
  - Change Meta options on department

打开数据库验证,成功。

然后,我们就能像前面一样使用customize_permission这个权限了。

以上这篇django自带的权限管理Permission用法说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python基于数列实现购物车程序过程详解

    Python基于数列实现购物车程序过程详解

    这篇文章主要介绍了Python基于数列实现购物车程序过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 使用python实现简单五子棋游戏

    使用python实现简单五子棋游戏

    这篇文章主要为大家详细介绍了使用python实现简单五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • Python基础教程之异常详解

    Python基础教程之异常详解

    调试Python程序时,经常会报出一些异常,下面这篇文章就来给大家介绍了关于Python基础教程之异常的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2019-01-01
  • Pytorch损失函数torch.nn.NLLLoss()的使用

    Pytorch损失函数torch.nn.NLLLoss()的使用

    这篇文章主要介绍了Pytorch损失函数torch.nn.NLLLoss()的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 使用Python为中秋节绘制一块美味的月饼

    使用Python为中秋节绘制一块美味的月饼

    这篇文章主要介绍了使用Python为中秋节绘制一块美味的月饼,,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Python ckeditor富文本编辑器代码实例解析

    Python ckeditor富文本编辑器代码实例解析

    这篇文章主要介绍了Python ckeditor富文本编辑器代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • django queryset相加和筛选教程

    django queryset相加和筛选教程

    这篇文章主要介绍了django queryset相加和筛选教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • 详解Python中RegEx在数据处理中的应用

    详解Python中RegEx在数据处理中的应用

    正则表达式(Regular Expressions,简称 RegEx)是一种强大的文本匹配和搜索工具,它在数据处理、文本解析和字符串操作中发挥着关键作用,下面就跟随小编一起来了解一下RegEx的具体使用吧
    2024-01-01
  • Python中使用支持向量机(SVM)算法

    Python中使用支持向量机(SVM)算法

    这篇文章主要为大家详细介绍了Python中使用支持向量机SVM算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

    Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

    今天来分享一篇办公干货文章,对于财务专业等学生或者公司财务人员来说,将报账发票等汇总到excel简直就是一个折磨.尤其是到年底的时候,公司的财务人员面对一大堆的发票简直就是苦不堪言.正好我们学会了Python,我们应该将Python的优势发挥起来,需要的朋友可以参考下
    2021-06-06

最新评论