当我们为应用创建一个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 modelsadmin.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.nameclass 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的namedef perm_check(request, *args, **kwargs):url_obj = resolve(request.path_info)url_name = url_obj.url_nameperm_name = ''#权限必须和urlname配合使得if url_name:#获取请求方法,和请求参数url_method, url_args = request.method, request.GETurl_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.nameperm_str = 'school.%s' % perm_nameif request.user.has_perm(perm_str):print('====》权限已匹配')return Trueelse:print('---->权限没有匹配')return Falseelse:return Falseelse: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 adminurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^school/', include('school.urls')),
]

school下的urls.py:

from django.conf.urls import url
from school import viewsurlpatterns = [url(r'students/$', views.students, name='students_list'),
]

到这算是完全写好了,下面来验证一下:

登录admin设置一下lishi的权限,我们先不给任何权限,访问http://localhost:8000/school/students看看结果:

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

再给lishi一个查看的权限:

再来访问一下:

到此为止吧.

转载于:https://www.cnblogs.com/huangxm/p/5770735.html

django权限管理相关推荐

  1. Django 权限管理-后台根据用户权限动态生成菜单

    Django权限管理 实现目标: 1.管理用户,添加角色,用户关联角色 2.添加权限.角色关联权限 3.添加动作.权限关联动作 4.添加菜单.权限关联菜单 实现动态生成用户权限菜单(可设置多级菜单嵌套 ...

  2. Django 权限管理

    对于Django而言,虽然自带了一些基本的通用权限限制,但现实中,可能我们更希望自己去定义业务权限划分 Django对于权限这块的部分验证方法 1 user = request.user 2 user ...

  3. 基于Django实现RBAC权限管理

    概述 RBAC(Role-Based Access Control,基于角色的访问控制),通过角色绑定权限,然后给用户划分角色.在web应用中,可以将权限理解为url,一个权限对应一个url. 在实际 ...

  4. django自带的权限管理Permission用法

    Permission的用法 前言 默认的权限(add, change, delete, view) 使用方法 在函数中验证权限,使用user.has_perm 验证函数是否有执行权限,使用@permi ...

  5. django认证系统实现自定义权限管理的方法 - python

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 本文记录使用django自带的认证系统实现自定义的权限管理系统,包含组权限.用户权限等实现. 0x01. django认 ...

  6. django权限系统实现步骤_Django权限机制的实现

    django-permission 本文涉及的技术,已应用于我基于django 1.8+ 开发的博客系统--MayBlog,欢迎交流. 1. Django权限机制概述 权限机制能够约束用户行为,控制页 ...

  7. python开发信息系统权限设置_[Python学习] Django 权限控制

    本文为大家讲解 Django 框架里自带的权限模型,从理论到实战演练,带领大家了解 Django 里权限是怎么一回事. 主要内容 什么是权限管理? Web 权限 Django 权限机制 Django ...

  8. django 用户管理相关的表

    Django 用户管理相关的表: create table django_content_type (/*内容类型表*/id int(11) not null auto_increment,app_l ...

  9. django权限二(多级菜单的设计以及展示)

    多级权限菜单设计级标题栏 我们现在只有数据展示,要进入其他url还需要手动的输入路径,非常的麻烦,所以我们要设计 一个导航栏以及侧边多级菜单栏,这个展示是通过stark组件的设计的增删改查页面,而 每 ...

最新文章

  1. 简单介绍nginx 变量使用
  2. python安装mysqldb模块
  3. Application Virtualization 4.5 部署之(三)(
  4. Swift基础学习(二)数据类型
  5. 虚拟化解决方案 并不仅限于SDN
  6. 克罗谈投资策略02_赢家和输家
  7. 正则表达式与java String.split()
  8. python webdriver 从无到有搭建混合驱动自动化测试框架的过程和总结
  9. 如何在IDEA中配置Tomcat,解决配置时No Artifacts Configured问题
  10. nubia android root权限,努比亚Z11 root教程及获取root权限的方法
  11. k8s搭建xxl-job过程
  12. html是什么简答题,网页设计与制作简答题.doc
  13. class07:Express框架、中间件
  14. Scrum: 时间框 (Timeboxing) 是什么?
  15. Express中res.render和res.redirect的区别
  16. 【单片机仿真项目】数码管(proteus原理图+keil代码)
  17. 最好用的几款epub阅读器
  18. 其他的一些生活小常识
  19. win10系统启用老版windows照片查看器
  20. 频谱分析仪是什么?以及频谱分析仪的应用领域及工作原理

热门文章

  1. 接口测试用例设计思路
  2. 安装phpstudy之后发现80端口被占用
  3. Android动画模式
  4. final/override控制
  5. cocos2d-x jni相关目录分析
  6. 转载:Linux kernel SPI驱动解释
  7. Linux查看CPU型号及内存频率及其它信息与清理内存的命令
  8. 3.14-19 wc、iconv、dos2unix、diff、vimdiff、rev
  9. 【拔刀吧少年】之循环三兄弟for while until
  10. 旅行商问题c语言,【算法作业】用回溯法求解旅行商问题