django权限管理
当我们为应用创建一个Models, 在同步到数据库里,django默认给了三个权限 ,就是 add, change, delete权限。
首先,我们创建一个perm_test的project, 然后再创建一个school的app.
django-admin.py startproject perm_test
cd perm_test
python manage.py startapp school
models:
from django.db import models # Create your models here. class Student(models.Model):
name = models.CharField('姓名', max_length=64)
age = models.SmallIntegerField('年龄')
choices = (
(1, '男'),
(2, '女'),
(3, '未知')
)
sex = models.SmallIntegerField('性别', choices=choices)
admin.py
from django.contrib import admin # Register your models here.
from . import models admin.site.register(models.Student)
同步到数据库并创建superuser:
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
启动web服务,登录admin(http://localhost:8000)
python manage.py runserver
在后台先创建一个用户试试, 看到选择权限的地方如下:

先不加任何权限保存后,用新用户登录admin:

直接提示无权修改任何东西,因为没有任何权限。
尝试增加一个Student的change的权限,刷新一下:

只有修改的权限, 因为我们加的就是修改的权限, 但是这里好你有删除选项,执行试一下

无法显示,显然是没有权限 删除的

到django shell里查询一下权限:
>>> python manage.py shell
>>> from django.contrib.auth.models import User
>>> user_obj = User.objects.get(name='lishi')
#可以使用dir来看有哪些方法可以用
>>> dir(user_obj)
#获取用户的所有权限
>>> user_obj.get_all_permissions()
{'school.change_student'}
以上这些都是django内置的权限, 那我们怎么来定义自己的权限呢?
下面来定义自己的权限 并应用在自己的页面上呢?
首先要说的是,我们必须为url设置name, 因为权限需要和urlname配合使用,urlname就是url(r’’, views.method, name=’urlname’)里的name值。还要建立权限名称和具体操作的映射关系, 即权限名称与(urlname, 请求方法,参数列表)的对应关系,如果用字典表示,就是这样的:
{'add student', 'get', []}
第一步,要在models中建立权限的名称和描述信息,这个信息是在django admin中设置权限时显示的信息
第二步,建立一个权限表Permission, 将权限的名称,url名称,请求方法(get or post), 参数列表保存进去
第三步, 定义判断权限的方法
下面来实验一下,我们定义一个查看学员列表的权限:
第一步: 在models中建立权限表,我是将映射关系存放在数据库中:
class Permission(models.Model):
name = models.CharField("权限名称", max_length=64)
url = models.CharField('URL名称', max_length=255)
chioces = ((1, 'GET'), (2, 'POST'))
per_method = models.SmallIntegerField('请求方法', choices=chioces, default=1)
argument_list = models.CharField('参数列表', max_length=255, help_text='多个参数之间用英文半角逗号隔开', blank=True, null=True)
describe = models.CharField('描述', max_length=255) def __str__(self):
return self.name class Meta:
verbose_name = '权限表'
verbose_name_plural = verbose_name
#权限信息,这里定义的权限的名字,后面是描述信息,描述信息是在django admin中显示权限用的
permissions = (
('views_student_list', '查看学员信息表'),
('views_student_info', '查看学员详细信息'),
)
第二步:在权限表中添加内容,将对应权限写入数据库:

第三步: 定义权限验证方法, 逻辑是这样,请求访问学员列表, 先获取url地址,根据url地址得到urlname, 再获取请求方法和参数,然后使用urlname, 请求方法,参数列表到数据库中查询,能查询到之后说明这个权限存在;然后再使用request.user.has_perm()来判断该用户是否具有该权限。
在应用school目录下建立permission.py文件,我们将权限验证方法写在这里面:
from django.shortcuts import render
from school import models
from django.db.models import Q
from django.core.urlresolvers import resolve #此方法可以将url地址转换成url的name def perm_check(request, *args, **kwargs):
url_obj = resolve(request.path_info)
url_name = url_obj.url_name
perm_name = ''
#权限必须和urlname配合使得
if url_name:
#获取请求方法,和请求参数
url_method, url_args = request.method, request.GET
url_args_list = []
#将各个参数的值用逗号隔开组成字符串,因为数据库中是这样存的
for i in url_args:
url_args_list.append(str(url_args[i]))
url_args_list = ','.join(url_args_list)
#操作数据库
get_perm = models.Permission.objects.filter(Q(url=url_name) and Q(per_method=url_method) and Q(argument_list=url_args_list))
if get_perm:
for i in get_perm:
perm_name = i.name
perm_str = 'school.%s' % perm_name
if request.user.has_perm(perm_str):
print('====》权限已匹配')
return True
else:
print('---->权限没有匹配')
return False
else:
return False
else:
return False #没有权限设置,默认不放过 def check_permission(fun): #定义一个装饰器,在views中应用
def wapper(request, *args, **kwargs):
if perm_check(request, *args, **kwargs): #调用上面的权限验证方法
return fun(request, *args, **kwargs)
return render(request, '403.html', locals())
return wapper
到这里自定义权限已经完成了,接下来要做的是在我们自己的页面中使用:
创建一个student_list.html页面,展示学员列表:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table>
<tr>
<td>姓名</td>
<td>年龄</td>
<td>性别</td>
</tr>
{% for student_obj in students_obj %}
<tr>
<td>{{ student_obj.name }}</td>
<td>{{ student_obj.age }}</td>
<td>{{ student_obj.get_sex_display }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
创建views方法:
from django.shortcuts import render
from school import models
from school.permission import check_permission
# Create your views here. @check_permission
def students(request):
students_obj = models.Student.objects.all()
return render(request, 'students_list.html', locals())
我们使用装饰器的方法来检查权限。当用户具有权限时,返回渲染的页面。但似乎还少了点什么,在权限验证方法里,当检测没有权限时返加403页面,所以我们还要创建一个403页面403.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>403</h1>
<h2>You don't have enought permissions to this action!</h2>
</body>
</html>
最后建立urls.py吧:
project下的urls.py:
from django.conf.urls import url, include
from django.contrib import admin urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^school/', include('school.urls')),
]
school下的urls.py:
from django.conf.urls import url
from school import views urlpatterns = [
url(r'students/$', views.students, name='students_list'),
]
到这算是完全写好了,下面来验证一下:
登录admin设置一下lishi的权限,我们先不给任何权限,访问http://localhost:8000/school/students看看结果:

访问结果, 是我们想要的结果,提示没有权限:

再给lishi一个查看的权限:

再来访问一下:

到此为止吧.
django权限管理的更多相关文章
- 【Python】django权限管理
参考:http://www.cnblogs.com/esperyong/ 参考:https://docs.djangoproject.com/en/1.8/topics/auth/default/#t ...
- Django 权限管理(二)
权限菜单展示 1.展示的效果 实现该效果,涉及到的核心点(突破点) 1. 权限分类: (1)菜单权限 (主要用来展示的权限(url)如查看权限 url, 如上图中的每个权限都归类为菜单权限,主要用来 ...
- django权限管理(一)
权限:权限就是一个包含正则的url. Rbac 权限管理: Role-Based Access Control,基于角色的访问控制.用户通过角色与权限进行关联,一个用户可以有多个角色,一个角色可以有多 ...
- 一.8.django权限管理/drf权限管理
1.什么是权限管理: .权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源 .权限管理好比如钥匙,有了钥匙就能把门打开,但是权限设置是有级别之分的,假如这个系 ...
- Django 权限管理
对于Django而言,虽然自带了一些基本的通用权限限制,但现实中,可能我们更希望自己去定义业务权限划分 Django对于权限这块的部分验证方法 user = request.user user.is_ ...
- Django权限管理测试
测试内容:当我单击登录页面登录的时候页面会弹出当前用户的个人信息 当我点击提交的时候可以看到我当前用户的所有权限: 测试成功,接下来看一下后台的简单代码: class User(models.Mode ...
- Django之权限管理
Django权限管理之初步完整版 项目背景:这是一个权限管理系统(给一些角色和他们的权限指URL和页面可以删除的按钮比如:增删改查) 使用到了中间件,和初始化权限,使用了admin的后台管理系统. 我 ...
- [Django]用户权限学习系列之权限管理界面实现
本系列前三章: http://www.cnblogs.com/CQ-LQJ/p/5604331.htmlPermission权限基本操作指令 http://www.cnblogs.com/CQ-LQJ ...
- [Django]用户权限学习系列之设计自有权限管理系统设计思路
若在阅读本片文章遇到权限操作问题,请查看本系列的前两章! http://www.cnblogs.com/CQ-LQJ/p/5609690.html和http://www.cnblogs.com/CQ- ...
随机推荐
- Flink窗口介绍及应用
Windows是Flink流计算的核心,本文将概括的介绍几种窗口的概念,重点只放在窗口的应用上. 本实验的数据采用自拟电影评分数据(userId, movieId, rating, timestamp ...
- 运行fdisk命令时,弹出 bash:fdisk:command not found
原因:命令fdisk 不在你的命令搜索路径中 第一种解决办法,将fdisk添加到你的命令搜索路径中 首先查看你当前的命令搜索路径: [root@host sbin]# echo $PATH/usr/k ...
- Dubbo学习笔记10:Dubbo服务消费方启动流程源码分析
同理我们看下服务消费端启动流程时序图: 在<Dubbo整体架构分析>一文中,我们提到服务消费方需要使用ReferenceConfig API来消费服务,具体是调用代码(1)get()方法来 ...
- Stochastic Optimization Techniques
Stochastic Optimization Techniques Neural networks are often trained stochastically, i.e. using a me ...
- ASP.NET实现网站的自动升级
网站的自动升级主要是要实现从一台服务器上下载某些文件到本服务器上,然后对下载下来的文件进行更新等操作. 比如,现在有服务器A,服务器B和客户端C. 作为COM公司开发的产品DIV网站系统被安装到服务器 ...
- BZOJ1009 GT考试
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数X1X2.. ...
- MySQL索引背后的数据结构及算法原理 (转)
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- 移动option标签
<%@ page language="java" pageEncoding="UTF-8"%> <%@taglib uri="/st ...
- Tju_Oj_3988Password
这个题是给树的前序和中序,输出后序. 做法是根据前序找根,根据根在中序中找中序的左右子树,根据左右子树长度找前序的左右子树,依此递归. 做过之后感觉还是比较基础的,废话不多说,上题上代码. Bob w ...
- 【洛谷 P2726】 [SHOI2005]树的双中心(树的重心)
先考虑一个\(O(N^2)\)做法. 设选的两个点为\(x,y\),则一定可以将树分成两个集合\(A,B\),使得\(A\)集合所有点都去\(x\),\(B\)集合所有点都去\(y\),而这两个集合的 ...