Django--权限信息操作
一 . 权限控制
表结构的设计
rbca(Role Based Access Control) 基于角色的权限控制
3个model 5张表
class User(models.Model):
# 用户表
username = models.CharField(max_length=16)
password = models.CharField(max_length=16)
# 多对多的外键一般写在查询方便的那一边
roles = models.ManyToManyField('Role', verbose_name='用户和角色关系表',blank=True) class Role(models.Model):
# 角色表
username = models.CharField('角色',max_length=16)
permissions = models.ManyToManyField('Permission', verbose_name='角色和权限关系表', blank=True) class Permission(models.Model):
# 权限表
url = models.CharField('权限', max_length=64)
title = models.CharField('标题', max_length=16)
 
   
    
# 权限表里面的url一定要加上 / / , 这样用正则的时候才能匹配成功
 
 
二 . 在admin中对表进行操作
# 创建超级用户的命令
python manage.py createsuperuser # 然后在admin文件中创建表
from django.contrib import admin
admin.site.register(models.Permission)
admin.site.register(models.User)
admin.site.register(models.Role
登录admin,样式不是我们想要的,我们需要进行一下操作
  
然后在admin中写上:
  
修改之后的结果
  
还可以在展示页面上直接对字段进行编辑
  
展示结果
  
三 . 权限控制的流程
其实我们控制权限的实质就是让某些人能访问特定的url
我们需要把权限控制的验证写到中间件中去
# 视图函数
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
obj = models.User.objects.filter(username=username, password=password).first()
if not obj:
return render(request, 'login.html', {'error': '用户名或密码错误'})
# 跨表查询用双下划线 ORM获取到权限信息 过滤掉权限为空的 去重
permission_query = obj.roles.filter(permissions__url__isnull=False).values('permissions__url', 'permissions__title').distinct() # session的值需要是可序列化的, 需要把QuerySet变成列表
request.session['permission'] = list(permission_query)
request.session['is_login'] = True
return redirect('index')
return render(request,'login.html')
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse, redirect
from django.conf import settings
import re
class RbacMiddleWare(MiddlewareMixin):
def process_request(self,request):
# 获取当前访问的页面
url = request.path # 白名单
for i in settings.WHITE_LIST:
# match 匹配上得到一个对象,匹配不上返回None
if re.match(i, url):
return
# 获取登录状态
is_login = request.session['is_login']
# 没有登录跳转登录页面
if not is_login:
return redirect('login') # 免认证
for i in settings.NO_PERMISSION_LIST:
# match 匹配上得到一个对象,匹配不上返回None
if re.match(i, url):
return # 获取当前用户的权限, 要用get去拿,没有显示None,[]就会报错
permission_list = request.session.get('permission')
# print(permission_list)
# 权限的校验
for permission in permission_list:
# print('>>>>',permission)
if re.match(f'^{permission["permissions__url"]}$', url):
return
# 没有匹配成功
return HttpResponse('你的level不够!!')
权限认证中间件
  
我们在其他py文件中引入settings的时候,要用以下方式
from django.conf import settings
Django--权限信息操作的更多相关文章
- 《玩转Django2.0》读书笔记-Django配置信息
		<玩转Django2.0>读书笔记-Django配置信息 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 项目配置是根据实际开发需求从而对整个Web框架编写相应配置信息. ... 
- django权限管理
		当我们为应用创建一个Models, 在同步到数据库里,django默认给了三个权限 ,就是 add, change, delete权限. 首先,我们创建一个perm_test的project, 然后再 ... 
- Django权限控制进阶
		一.一级菜单的排序 我们用字典存放菜单信息,而字典是无序的,当一级菜单过多时可能会出现乱序情况,因此需要给一级菜单排序 1.给一级菜单表的model中加一个weight权重的字段 ,权重越大越靠前 w ... 
- django权限之二级菜单
		遗漏知识点 1.构建表结构时,谁被关联谁就是主表,在层级删除的时候,删除子表的时候,主表不会被删除,反之删除主表的话,字表也会被删除, 使用related_name=None 反向查询,起名用的 ... 
- Django之Model操作
		Django之Model操作 本节内容 字段 字段参数 元信息 多表关系及参数 ORM操作 1. 字段 字段列表 AutoField(Field) - int自增列,必须填入参数 primary_ke ... 
- 【Python】django权限管理
		参考:http://www.cnblogs.com/esperyong/ 参考:https://docs.djangoproject.com/en/1.8/topics/auth/default/#t ... 
- Python之路【第二十二篇】:Django之Model操作
		Django之Model操作 一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bi ... 
- [Python学习] Django 权限控制
		本文为大家讲解 Django 框架里自带的权限模型,从理论到实战演练,带领大家了解 Django 里权限是怎么一回事. 一.主要内容 1.什么是权限管理? 2.Web 权限 3.Django 权限机制 ... 
- Django之ORM操作
		Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ... 
随机推荐
- 手把手丨我们在UCL找到了一个糖尿病数据集,用机器学习预测糖尿病(三)
			梯度提升: from sklearn.ensemble import GradientBoostingClassifier gb=GradientBoostingClassifier(random_s ... 
- 如何利用pip自动生成和安装requirements.txt依赖
			在查看别人的Python项目时,经常会看到一个requirements.txt文件,里面记录了当前程序的所有依赖包及其精确版本号.这个文件有点类似与Rails的Gemfile.其作用是用来在另一台PC ... 
- GUNS后台管理框架部署与发布
			一.GUNS介绍 Guns基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springmvc + shiro + mybatis-plus + beetl + flowable!Gun ... 
- masm的调试命令(debug)
			-u命令:查看汇编代码: -t命令:执行下一条语句 -g + 的内存:跳转到该内存所对应的语句(再用t命令执行该条命令) -r命令:查看寄存器的内容(后可直接接寄存器的名称,就只查看该寄存器的内容) ... 
- 008_python列表的传值与传址
			一. 今天发现一个奇怪的现象,代码如下: aList = ['xyz', 'zara', 'abc', 'xyz','xysdfji','xywooudd'] for x in aList: if x ... 
- wxWidgets 在 Linux 下开发环境配置
			本文基于 CodeBlocks (16.0.1) 和 wxWidgets (3.0.2) 搭建 Linux 下 GUI 开发环境. 1. 安装 CodeBlocks Ubuntu 默认的源当前 Cod ... 
- Emacs 中 GDB 的使用
			Emacs 提供了方便的 GDB 调试功能,使用方法简明如下, 1. 编译时加入调试信息, 例如: $ clang++ -g -Wall t.cpp -o t 2. 调试 t ,直接用命令 M-x g ... 
- 理解Shadow DOM(一)
			1. 什么是Shadow DOM? Shadow DOM 如果按照英文翻译的话可以理解为 影子DOM, 何为影子DOM呢?可以理解为一般情况下使用肉眼看不到的DOM结构,那如果一般情况下看不到的话,那 ... 
- Mac支持ntfs格式的移动硬盘读写操作
			转好文:https://blog.csdn.net/u013247765/article/details/77932144 本机环境: macOS Sierra version 10.12.6 201 ... 
- 如何添加一种新Case协议
			这里以添加基础http为例 首先要在脚本文件(XML文件)中定义好这种协议的基本信息 您必须在这里设计好您协议预先需要的数据(比如串口协议,那波特率,串口号等可能是不会经常改变的就可以在这里先 ... 
