1. login登录

def login(request):
if request.method=="GET":
return render(request,'login.html')
else:
username=request.POST.get('user')
password=request.POST.get('pwd')
user=models.User.objects.filter(username=username,password=password).first()
if user:
init_permission(user,request)
return redirect('/index/')
else:
return redirect('/login/')

2. init_permission(user,request)定制Session

from django.conf import settings

def init_permission(user,request):
  # 取数据
permission_list = user.roles.values(
'permission__id',
'permission__title',
'permission__url',
'permission__code',
'permission__menu_group',
'permission__group_id',
'permission__group__caption',
'permission__group__menu_id',
'permission__group__menu__title',
).distinct()
current_url = request.path_info # 过滤权限相关的
result = {} # 用户所有的操作代码和可访问的url地址——权限相关
for item in permission_list:
group_id=item['permission__group_id']
code = item['permission__code']
url=item['permission__url']
if group_id in result:
result[group_id]['codes'].append(code)
result[group_id]['urls'].append(url)
else:
result[group_id]={
'codes':[code,],
'urls':[url,],
}
   # Session中添加字典
request.session[settings.PERMISSION_URL_DICT_KEY] = result # 过滤菜单相关的
menu_list = [] for item in permission_list:
msg = {
'id': item['permission__id'],
'title': item['permission__title'],
'url': item['permission__url'],
'menu_gp_id': item['permission__menu_group'],
'menu_id': item['permission__group__menu_id'],
'menu_title': item['permission__group__menu__title'],
}
menu_list.append(msg)
   # Session中添加字典 
request.session[settings.PERMISSION_MENU_KEY]=menu_list

3. setting配置

PERMISSION_URL_DICT_KEY='permission_url_dict'   # 权限url数据
PERMISSION_MENU_KEY='permission_menu_dict' # 菜单字典数据

4. 创建中间件

路径:E:\permission80\rbac\middleware\rbac.py  

import re
from django.conf import settings
from django.shortcuts import redirect,render,HttpResponse class MiddlewareMixin(object):
def __init__(self, get_response=None):
self.get_response = get_response
super(MiddlewareMixin, self).__init__() def __call__(self, request):
response = None
if hasattr(self, 'process_request'):
response = self.process_request(request)
if not response:
response = self.get_response(request)
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response
# 继承父类MiddlewareMixin方法
class RbacMiddleware(MiddlewareMixin):
def process_request(self,request):
current_url=request.path_info # 取到用户方法的路径信息:譬如 /index/,/userinfo/
     # 判断用户访问的路径是否在白名单中
for url in settings.VALID_URL:
regax="^{0}$".format(url)
       # 如果匹配成功停止匹配,None继续往后面执行其他中间件,如果没有则直接到url路由规则中匹配,(/index/ ,views.index)
if re.match(regax,current_url):
return None
     # 从Session中取到权限数据,用户权限下的路径
permission_dict=request.session.get(settings.PERMISSION_URL_DICT_KEY)
     # 如果没有则跳转到登录路径
if not permission_dict:
return redirect('/login/') flag=False
for group_id,code_url_dic in permission_dict.items(): for db_url in code_url_dic['urls']:
regax="^{0}$".format(db_url)
          # 匹配当前用户权限的路径是哪一个路径
if re.match(regax,current_url):
            # 给request中添加一个字典,values对应用户访问的权限下的codes代码:譬如 add list edit
request.permission_code_list=code_url_dic['codes']
flag=True
break
if flag:
break
if not flag:
return HttpResponse('无权访问')

5. setting配置中间件

# 白名单
VALID_URL=[
'/login/',
'/logoff/',
'/index/',
'/test/',
'/admin.*',
] # 加入中间件列表中
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'rbac.middleware.rbac.RbacMiddleware',
]

6. 自定义模板

路径:E:\permission80\rbac\templatetags\rbactag.py

a. 首先创建模板目录templatetags,名称必须一样

import re

from django.conf import settings
from django.template import Library register = Library() # 引用html文件tag.html
@register.inclusion_tag('tag.html')
def menu_html(request):
# 通过request取到定制session中的菜单数据
permission_menu = request.session[settings.PERMISSION_MENU_KEY]
current_url = request.path_info
menu_dict = {}
for item in permission_menu:
# 判断组内菜单是否在menu_dict中
if not item['menu_gp_id']:
menu_dict[item['menu_id']] = item for item in permission_menu:
regax = "^{0}$".format(item['url'])
# 匹配用户访问的路径是menu_dict中哪一个,给访问的路径添加一条actvie活动匹配
if re.match(regax, current_url):
menu_gp_id = item['menu_id']
if menu_gp_id:
# 菜单组添加active
menu_dict[menu_gp_id]['active'] = True
else:
# 组内菜单列表添加
menu_dict[item['id']]['active'] = True result = {}
for item in menu_dict.values():
active = item.get('active')
menu_id = item['menu_id']
if menu_id in result:
result[menu_id]['children'].append({'title': item['title'], 'url': item['url'], 'active': active})
if active:
result[menu_id]['active'] = True
else:
result[menu_id] = {
'menu_id': item['menu_id'],
'menu_title': item['menu_title'],
'active': active,
'children': [
{'title': item['title'], 'url': item['url'], 'active': active}
]
} return {'menu_dict': result}

  

  

  

 

  

Django web框架之权限管理二的更多相关文章

  1. Django web框架之权限管理一

    1. 需求分析: 准备:创建独立app, rbac #权限管理模块/组件 app01 #应用 分配权限,URL 2. 数据库设计 2.1 设计思路 第一版: 权限表: ID url title is_ ...

  2. 教程:Visual Studio 中的 Django Web 框架入门

    教程:Visual Studio 中的 Django Web 框架入门 Django 是高级 Python 框架,用于快速.安全及可扩展的 Web 开发. 本教程将在 Visual Studio 提供 ...

  3. 转:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权

    原文地址:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法.shiro认证与shiro授权 以下是部分内容,具体见原文. shiro介绍 什么是shiro shiro是Apache ...

  4. [oldboy-django][1初始django]web框架本质 + django框架 + ajax

    web框架本质 浏览器(socket客户端) - 发送请求(ip和端口,url http://www.baidu.com:80/index/) - GET 请求头(数据请求行的url上: Http1. ...

  5. Linux(CentOS7)系统中部署Django web框架

    1. 概述 部署django和vue架在逻辑上可以分为web层与数据库层:web前端通过实现了WSGI协议的模块对python代码进行解析,而python代码中则通过特定于数据库的操作接口对数据库进行 ...

  6. 初识DJango——Web框架

    一.Web框架 HTTP特点 1.简单快速:客户向服务器请求服务时,只需传送请求方法和路径.请求方法常用的有GET.HEAD.POST.每种方法规定了客户与服务器联系的类型不同. 由于HTTP协议简单 ...

  7. Django基础篇--用户权限管理和组管理

    Django作为一个成熟的python后台开发框架,为开发者提供了很多内置的功能,开发者只需要做一些配置就可以完成原生操作中比较复杂的代码编写.这些内置功能中其中一个比较强大的功能就是后台用户管理类. ...

  8. Django:web框架本质

    一,web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 1,自定义web框架 impo ...

  9. Django【进阶】权限管理

    一.权限 RBAC:role basic access control   1.什么是权限: 一个权限就是一个url,不同个权限对应不同的url,拥有权限即可以访问这个url.   2.权限划分: 如 ...

随机推荐

  1. React Render Callback Pattern(渲染回调模式)

    React Render Callback Pattern,渲染回调模式,其实是将this.props.children当做函数来调用. 例如: 要根据user参数确定渲染Loading还是Profi ...

  2. python3.5安装pycrypto

    在python中使用AES加密是一种有效的加密方式,如果你研究过微信公众号api就会发现,它也用的是这个加密的.在写代码的时候,要安装crypto模块,在linux或者mac上都好说,但是在windo ...

  3. ucenter通信实现同步登录、同步退出(详细)

    首先,需要去官网下载一个ucenter的包.然后解压下来. 先把ucenter/ucenter这个文件夹复制到你的项目根目录下改名为uc_server;(这里只是我建议修改,以便于我下面写的配置); ...

  4. 洛谷P1667/[10.22 模拟赛] 数列 (思维+模拟)

    洛谷P1667 数列 题目描述 给定一个长度是n的数列A,我们称一个数列是完美的,当且仅当对于其任意连续子序列的和都是正的.现在你有一个操作可以改变数列,选择一个区间[X,Y]满足\(A_X +A_{ ...

  5. luncence

    问题的提出: 我们在访问淘宝,京东这些商城系统的时候,我们可以随意的在文本框输入关键字就可以获取到所想要的信息或者相关的信息,那么我们到底是如何实现这个功能的呢,为什么可以随意的输入就可以显示相关的信 ...

  6. Moodle配置

    Moodle配置 1.   内部设置 在 Moodle 站点管理员界面中有一系列的配置页面(可以从'设置' 块中访问 '网站管理'区).这里有一些重要的系统设置,你需要进行检查. 根据提示信息并结合实 ...

  7. C#中static void Main(string[] args)的含义

    static:是将main方法声明为静态的. void:说明main方法不会返回任何内容. String[]args:这是用来接收命令行传入的参数,String[]是声明args是可以存储字符串数组. ...

  8. 地精排序Gnome Sort

    号称最简单的排序算法,只有一层循环,默认情况下前进冒泡,一旦遇到冒泡的情况发生就往回冒,直到把这个数字放好为止 直接看它排序的过程,待排数组[6 2 4 1 5 9] 先设计一个标识i=0然后从头开始 ...

  9. 诱惑当前 你的孩子能hold住吗?

    1.打好态度.动机.价值观基础 培养未成熟主体远大的志向,并不是向他们讲一些抽象的道理,而是根据他们的年龄特点,从形象的故事.童话开始,从身边的人物.事例出发,逐渐渗透一些人生的哲理.有一位自觉性非常 ...

  10. codeforces——contest 864 problemE

    Polycarp is in really serious trouble — his house is on fire! It's time to save the most valuable it ...