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


Posted in Python onMay 13, 2020

前言

一些公司内部的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>

目录结构:

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

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

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

第二种写法

使用模板里面的全局变量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

打开数据库验证,成功。

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

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

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

Python 相关文章推荐
python使用range函数计算一组数和的方法
May 07 Python
Pandas 合并多个Dataframe(merge,concat)的方法
Jun 08 Python
使用python判断你是青少年还是老年人
Nov 29 Python
Python 函数返回值的示例代码
Mar 11 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
Apr 09 Python
使用Python自动生成HTML的方法示例
Aug 06 Python
python实现的自动发送消息功能详解
Aug 15 Python
Pytorch反向求导更新网络参数的方法
Aug 17 Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
May 18 Python
详解Python openpyxl库的基本应用
Feb 26 Python
Python中三种花式打印的示例详解
Mar 19 Python
Python基于jieba, wordcloud库生成中文词云
May 13 #Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 #Python
Jupyter notebook如何实现指定浏览器打开
May 13 #Python
基于FME使用Python过程图解
May 13 #Python
django rest framework serializers序列化实例
May 13 #Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
May 13 #Python
Python使用Numpy模块读取文件并绘制图片
May 13 #Python
You might like
BBS(php &amp; mysql)完整版(一)
2006/10/09 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
2014/05/23 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
php中smarty变量修饰用法实例分析
2015/06/11 PHP
ThinkPHP中使用Ueditor富文本编辑器
2015/09/02 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
PHP网页缓存技术优点及代码实例
2020/07/29 PHP
解决 FireFox 下[使用event很麻烦] 的问题.
2006/08/22 Javascript
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
js function定义函数的几种不错方法
2014/02/27 Javascript
jquery实现弹出层遮罩效果的简单实例
2014/03/03 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
基于Bootstrap仿淘宝分页控件实现代码
2016/11/07 Javascript
bootstrap select插件封装成Vue2.0组件
2017/04/17 Javascript
原生JS获取元素的位置与尺寸实现方法
2017/10/18 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
使用pkg打包Node.js应用的方法步骤
2018/10/19 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
Vue项目实现换肤功能的一种方案分析
2019/08/28 Javascript
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
简析Python的闭包和装饰器
2016/02/26 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
python 切换root 执行命令的方法
2019/01/19 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
如何基于Python创建目录文件夹
2019/12/31 Python
django从后台返回html代码的实例
2020/03/11 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
欧洲最大的预定车位市场:JustPark
2020/01/06 全球购物
优秀学生获奖感言
2014/02/15 职场文书
环保志愿者活动总结
2014/06/27 职场文书
羽毛球社团活动总结
2014/06/27 职场文书
写作技巧:如何撰写商业计划书
2019/08/08 职场文书
Python的property属性详细讲解
2022/04/11 Python