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的几条建议分享
Feb 10 Python
在Django的视图中使用form对象的方法
Jul 18 Python
Tornado协程在python2.7如何返回值(实现方法)
Jun 22 Python
用python结合jieba和wordcloud实现词云效果
Sep 05 Python
无法使用pip命令安装python第三方库的原因及解决方法
Jun 12 Python
pandas进行数据的交集与并集方式的数据合并方法
Jun 27 Python
python爬虫之自动登录与验证码识别
Jun 15 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
May 31 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
利用python绘制正态分布曲线
Jan 04 Python
opencv用VS2013调试时用Image Watch插件查看图片
Jul 26 Python
python神经网络学习 使用Keras进行回归运算
May 04 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
对盗链说再见...
2006/10/09 PHP
基于php实现长连接的方法与注意事项的问题
2013/05/10 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
2014/05/04 PHP
WordPress中用于创建以及获取侧边栏的PHP函数讲解
2015/12/29 PHP
php获取linux命令结果的实例
2017/03/13 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
jquery 图片截取工具jquery.imagecropper.js
2010/04/09 Javascript
js 3种归并操作的实例代码
2013/10/30 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
2015/05/03 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
微信小程序 网络API Websocket详解
2016/11/09 Javascript
jQuery实现checkbox列表的全选、反选功能
2016/11/24 Javascript
Angular2使用jQuery的方法教程
2017/05/28 jQuery
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
JavaScript 异步时序问题
2020/11/20 Javascript
[51:17]Mski vs VGJ.S Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
python两种遍历字典(dict)的方法比较
2014/05/29 Python
详解duck typing鸭子类型程序设计与Python的实现示例
2016/06/03 Python
Python socket实现的简单通信功能示例
2018/08/21 Python
Python利用heapq实现一个优先级队列的方法
2019/02/03 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
Python流程控制语句的深入讲解
2020/06/15 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
HTML5新标签兼容——&gt; 的两种方法
2018/09/12 HTML / CSS
移动端HTML5开发神器之vconsole详解
2020/12/15 HTML / CSS
Mistine官方海外旗舰店:泰国国民彩妆品牌
2016/12/28 全球购物
MATCHESFASHION.COM美国官网:英国奢侈品零售商
2018/10/29 全球购物
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
临床医学专业学生的自我评价分享
2013/11/21 职场文书
小学生班会演讲稿
2014/01/09 职场文书
给实习单位的感谢信
2014/02/01 职场文书
本科毕业论文指导教师评语
2014/12/30 职场文书
助学感谢信范文
2015/01/21 职场文书
解决Navicat for Mysql连接报错1251的问题(连接失败)
2021/05/27 MySQL