django自带的权限管理Permission用法说明
作者:C丶卡萝尔 发布时间:2023-07-25 04:18:06
前言
一些公司内部的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这个权限了。
来源:https://blog.csdn.net/u012790802/article/details/105297928


猜你喜欢
- 最终效果前言这是最近在学qt这个东西,然后又学会了调用api,然后就想了用pyqt5做一个GUI界面,后期也可以打包分享给其他人使用,所以就
- python如何跳过异常继续执行下面有两种解决方法第一种是类似if…else…;另外一种是使用语
- 本文实例为大家分享了用KNN算法手写体识别的具体代码,供大家参考,具体内容如下#!/usr/bin/python #coding:utf-8
- 简单的2048小游戏不多说,直接上图,这里并未实现GUI之类的,需要的话,可自行实现:接下来就是代码模块,其中的2048游戏原来网络上有很多
- 在Apache, PHP, MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分。对于Discuz!论坛程序也是如此,M
- 1.前言Python中函数的参数类型比较丰富,比如我们经常见到*args和**kwargs作为参数。初学者遇到这个多少都有点懵逼,今天我们来
- 神经网络框架使用方法及设计思想在框自己手写架上基本模仿pytorch,用以学习神经网络的基本算法,如前向传播、反向传播、各种层、各种激活函数
- 前言:我们先定义一个test01.py的文件。test01.py中代码如下所示:def step():print(__name__) &nb
- 工具:Jupyter notebook + Anaconda游戏规则: * 一种玩法是买尾号。2元一个数字,中奖是20元。每个数字出现的概率
- PHP 向它运行的任何脚本提供了大量的预定义常量。魔术常量准确来说并不能算是常量,常量我们在之前的文章中我们介绍到,常量被定义之后是不能被改
- 一、安装Pyinstaller环境:python3.6、window10注意事项:python64位版本打包的exe,只能在64位操作系统使
- 1引言实现磁带备份数据的功能有两方面的困难:首先,SQL Server(以下简称SQL)所提供的数据库的整体备份及恢复功能不能直接满足本系统
- 本文实例讲述了Python实现获取磁盘剩余空间的2种方法。分享给大家供大家参考,具体如下:方法1:import ctypesimport o
- 一提到python,大家经常会提到爬虫,爬虫近来兴起的原因我觉得主要还是因为大数据的原因,大数据导致了我们的数据不在只存在于自己的服务器,而
- 目录创建conda环境下载Apple提供的tensorflow支持安装环境前准备工作安装依赖及相关库测试参考资料苹果为M1芯片的Mac提供了
- 目录前言数据泵的导入数据泵的导出总结前言今天王子要分享的内容是关于Oracle的一个实战内容,Oracle的数据泵。网上有很多关于此的内容,
- 在通过拼组sql语句来实现数据插入的应用中,我们很有可能会遇到需要插入大型数据的情况,例如,在oracle中需要插入字节数超过4000的字段
- 1、实现效果2、实现步骤模块导入import os,sys,timefrom PyQt5 import QtCore,QtWidgets,Q
- 1.var、let、const简介 ECMAS
- 要说基本操作,大家基本都会,但是有时候,有些操作使用小技巧会节省很多时间。本篇描述的就是使用dict小技巧,保存到数据库,用来节省大家编码的