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绘制MySQL数据图实现数据可视化
Mar 30 Python
python获取从命令行输入数字的方法
Apr 29 Python
深入理解python try异常处理机制
Jun 01 Python
python基础教程之五种数据类型详解
Jan 12 Python
pandas.DataFrame的pivot()和unstack()实现行转列
Jul 06 Python
Python中利用LSTM模型进行时间序列预测分析的实现
Jul 26 Python
PyQt+socket实现远程操作服务器的方法示例
Aug 22 Python
python二分法查找算法实现方法【递归与非递归】
Dec 06 Python
django框架中间件原理与用法详解
Dec 10 Python
python爬虫实现获取下一页代码
Mar 13 Python
解决tensorflow读取本地MNITS_data失败的原因
Jun 22 Python
python使用pycharm安装pyqt5以及相关配置
Apr 22 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
如何将数据从文本导入到mysql
2006/10/09 PHP
E路文章系统PHP
2006/12/11 PHP
PHP+XML 制作简单的留言本 图文教程
2009/11/02 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
2013/06/21 PHP
ThinkPHP中I(),U(),$this-&gt;post()等函数用法
2014/11/22 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
2017/02/08 PHP
jQuery给多个不同元素添加class样式的方法
2015/03/26 Javascript
JS中的Replace方法使用经验分享
2015/05/20 Javascript
每天一篇javascript学习小结(面向对象编程)
2015/11/20 Javascript
基于javascript实现图片切换效果
2016/04/17 Javascript
在Vue中如何使用Cookie操作实例
2017/07/27 Javascript
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
nodejs简单实现TCP服务器端和客户端的聊天功能示例
2018/01/04 NodeJs
vuejs实现递归树型菜单组件
2018/01/13 Javascript
快速解决layui弹窗按enter键不停弹窗的问题
2019/09/18 Javascript
vue 解决computed修改data数据的问题
2019/11/06 Javascript
[02:33]DOTA2亚洲邀请赛趣味视频之吐真话筒
2018/03/31 DOTA
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[51:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/30 DOTA
python连接sql server乱码的解决方法
2013/01/28 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
Python 3.8 新功能大揭秘【新手必学】
2020/02/05 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
django实现日志按日期分割
2020/05/21 Python
div或img图片高度随宽度自适应的方法
2020/02/06 HTML / CSS
荷兰家电购物网站:Expert.nl
2020/01/18 全球购物
服装促销活动方案
2014/02/23 职场文书
2014年师德师风学习材料
2014/05/16 职场文书
宿舍标语大全
2014/06/19 职场文书
银行反四风对照检查材料
2014/09/29 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书