内容简介:为了解决 跳转页面时,也保留菜单栏的数据, 可以再auth表里添加一个 foreignkey 关联自己的方式自锁:最终的输出:(json格式化后:)
为了解决 跳转页面时,也保留菜单栏的数据, 可以再auth表里添加一个 foreignkey 关联自己的方式自锁:
class Auth(models.Model): ##权限表 name = models.CharField(max_length=64, blank=True, null=True, verbose_name="显示路径名") url = models.CharField(max_length=64, blank=True, null=True, verbose_name="路径") groupauth = models.ForeignKey(to='AuthGroup', blank=True, null=True, verbose_name="组权限", related_name="authgroup") #组和权限是一对多的关系,一个组有多个权限 to_display = models.ForeignKey(to='Auth', blank=True, null=True, verbose_name='显示', related_name='authauth') ##增加的此句 def __str__(self): return self.url class Meta: verbose_name_plural = "权限表"
更新数据表:
python manage.py makemigrations python manage.py migrate
登录后需要做的两件事:
- 把菜单相关的数据拿到; - 把用户所有能访问的url拿到;
from django.shortcuts import render,HttpResponse,redirect # Create your views here. from auth_server import models def auth_demo(request): if request.method == 'GET': return render(request, 'login.html', locals()) else: username = request.POST.get('username') password = request.POST.get('password') user_obj_li = models.UserInfo.objects.filter(name=username, password=password) if user_obj_li.first(): obj_all = user_obj_li.values('userPosition__auth__url', 'userPosition__auth__name', 'userPosition__auth__to_display__name', 'userPosition__auth__group__name', 'userPosition__auth__group__name', 'userPosition__auth__group__menu__name', ) print(obj_all) ###菜单 menu_dic = {} for i in obj_all: menu_auth_dic = { 'url': i.get('userPosition__auth__url'), ##跨表取到auth的url信息 'name': i.get('userPosition__auth__name'), 'display_url': i.get('userPosition__auth__to_display__url'), 'display_name': i.get('userPosition__auth__to_display__name') } if i.get('userPosition__auth__group__menu__name') in menu_dic.keys(): if not i.get('userPosition__auth__to_display__name'): menu_dic[i.get('userPosition__auth__group__menu__name')]['lower'].append(menu_auth_dic) else: menu_dic[i.get('userPosition__auth__group__menu__name')] = {} menu_dic[i.get('userPosition__auth__group__menu__name')]['name'] = i.get('userPosition__auth__group__menu__name') if not i.get('userPosition__auth__to_display__name'): menu_dic[i.get('userPosition__auth__group__menu__name')]['lower'] = [menu_auth_dic, ] else: menu_dic[i.get('userPosition__auth__group__menu__name')]['lower'] = [] print("菜单-->", menu_dic) ###权限 auth_dic = {} for i in obj_all: if i.get('userPosition__auth__group__name') in auth_dic.keys(): auth_dic[i.get('userPosition__auth__group__name')]['url'].append(i.get('userPosition__auth__name')) else: auth_dic[i.get('userPosition__auth__group__name')] = {'url': [i.get('userPosition__auth__name'), ], } print('权限 ---> ', auth_dic) else: error = "用户名或密码不正确!" return render(request, 'login.html', locals()) return HttpResponse("登录成功!")
最终的输出:(json格式化后:)
菜单-- > { '权限': { 'lower': [{ 'display_url': None, 'display_name': None, 'name': '/auth/add.html', 'url': '增加权限' }, { 'display_url': None, 'display_name': None, 'name': '/auth/(\\d+)/update.html', 'url': '更新权限' }, { 'display_url': None, 'display_name': None, 'name': '/auth/(\\d+)/del.html', 'url': '删除权限' }, { 'display_url': None, 'display_name': None, 'name': '/auth/list.html', 'url': '查看权限' }, { 'display_url': None, 'display_name': None, 'name': '/auth/host/list.html', 'url': '查看主机' }, { 'display_url': None, 'display_name': None, 'name': '/auth/host/(\\d+)/update.html', 'url': '更新主机' }, { 'display_url': None, 'display_name': None, 'name': '/auth/host/(\\d+)/del.html', 'url': '删除主机' }, { 'display_url': None, 'display_name': None, 'name': '/auth/host/add.html', 'url': '增加主机' }, { 'display_url': None, 'display_name': None, 'name': '/auth/authgroup/(\\d+)/update.html', 'url': '更新权限组' }, { 'display_url': None, 'display_name': None, 'name': '/auth/authgroup/(\\d+)/del.html', 'url': '删除权限组' }, { 'display_url': None, 'display_name': None, 'name': '/auth/authgroup/add.html', 'url': '增加权限组' }, { 'display_url': None, 'display_name': None, 'name': '/auth/menu/(\\d+)/del.html', 'url': '删除菜单' }, { 'display_url': None, 'display_name': None, 'name': '/auth/menu/(\\d+)/update.html', 'url': '更新菜单' }, { 'display_url': None, 'display_name': None, 'name': '/auth/menu/list.html', 'url': '查看菜单' }, { 'display_url': None, 'display_name': None, 'name': '/auth/menu/add.html', 'url': '增加菜单' }, { 'display_url': None, 'display_name': None, 'name': '/auth/user/(\\d+)/del.html', 'url': '删除用户' }, { 'display_url': None, 'display_name': None, 'name': '/auth/user/(\\d+)/update.html', 'url': '更新用户' }, { 'display_url': None, 'display_name': None, 'name': '/auth/user/add.html', 'url': '增加用户' }, { 'display_url': None, 'display_name': None, 'name': '/auth/user/list.html', 'url': '查看用户' }, { 'display_url': None, 'display_name': None, 'name': '/auth/position/add.html', 'url': '增加职位' }, { 'display_url': None, 'display_name': None, 'name': '/auth/position/list.html', 'url': '查看职位' }, { 'display_url': None, 'display_name': None, 'name': '/auth/position/(\\d+)/update.html', 'url': '更新职位' }, { 'display_url': None, 'display_name': None, 'name': '/auth/position/(\\d+)/delete.html', 'url': '删除职位' }], 'name': '权限' } } ---- 权限-- - > { '用户表': { 'url': ['/auth/user/(\\d+)/del.html', '/auth/user/(\\d+)/update.html', '/auth/user/add.html', '/auth/user/list.html'] }, '职位表': { 'url': ['/auth/position/add.html', '/auth/position/list.html', '/auth/position/(\\d+)/update.html', '/auth/position/(\\d+)/delete.html'] }, '主机': { 'url': ['/auth/host/list.html', '/auth/host/(\\d+)/update.html', '/auth/host/(\\d+)/del.html', '/auth/host/add.html'] }, '菜单表': { 'url': ['/auth/menu/(\\d+)/del.html', '/auth/menu/(\\d+)/update.html', '/auth/menu/list.html', '/auth/menu/add.html'] }, '权限表': { 'url': ['/auth/add.html', '/auth/(\\d+)/update.html', '/auth/(\\d+)/del.html', '/auth/list.html'] }, '权限组表': { 'url': ['/auth/authgroup/(\\d+)/update.html', '/auth/authgroup/(\\d+)/del.html', '/auth/authgroup/add.html', '/auth/authgroup/list.html'] } }
如上的obj_all中的querySetList:
< QuerySet[{ 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '增加权限', 'userPosition__auth__group__name': '权限表', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/add.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '更新权限', 'userPosition__auth__group__name': '权限表', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/(\\d+)/update.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '删除权限', 'userPosition__auth__group__name': '权限表', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/(\\d+)/del.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '查看权限', 'userPosition__auth__group__name': '权限表', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/list.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '查看主机', 'userPosition__auth__group__name': '主机', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/host/list.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '更新主机', 'userPosition__auth__group__name': '主机', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/host/(\\d+)/update.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '删除主机', 'userPosition__auth__group__name': '主机', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/host/(\\d+)/del.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '增加主机', 'userPosition__auth__group__name': '主机', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/host/add.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '更新权限组', 'userPosition__auth__group__name': '权限组表', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/authgroup/(\\d+)/update.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '删除权限组', 'userPosition__auth__group__name': '权限组表', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/authgroup/(\\d+)/del.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '增加权限组', 'userPosition__auth__group__name': '权限组表', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/authgroup/add.html' }, { 'userPosition__auth__to_display__name': '/auth/authgroup/list.html', 'userPosition__auth__url': '查看权限组', 'userPosition__auth__group__name': '权限组表', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/authgroup/list.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '删除菜单', 'userPosition__auth__group__name': '菜单表', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/menu/(\\d+)/del.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '更新菜单', 'userPosition__auth__group__name': '菜单表', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/menu/(\\d+)/update.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '查看菜单', 'userPosition__auth__group__name': '菜单表', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/menu/list.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '增加菜单', 'userPosition__auth__group__name': '菜单表', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/menu/add.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '删除用户', 'userPosition__auth__group__name': '用户表', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/user/(\\d+)/del.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '更新用户', 'userPosition__auth__group__name': '用户表', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/user/(\\d+)/update.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '增加用户', 'userPosition__auth__group__name': '用户表', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/user/add.html' }, { 'userPosition__auth__to_display__name': None, 'userPosition__auth__url': '查看用户', 'userPosition__auth__group__name': '用户表', 'userPosition__auth__group__menu__name': '权限', 'userPosition__auth__name': '/auth/user/list.html' }, '...(remaining elements truncated)...'] >
二、左侧菜单和权限应用
如上代码如果直接写在view视图中太臃肿,而且没有任何逻辑性,看起来也比较乱。我们可以封装为一个函数,通过传值即可调用函数:
from django.shortcuts import render,HttpResponse,redirect # Create your views here. from auth_server import models from utils import login_auth def auth_demo(request): if request.method == 'GET': return render(request, 'login.html', locals()) else: username = request.POST.get('username') password = request.POST.get('password') user_obj_li = models.UserInfo.objects.filter(name=username, password=password) if user_obj_li.first(): ###用户名,密码输入正确,初始化数据: login_auth.menu_auth(user_obj_li, request) ###跳转到index页面: print("123123") return redirect('/index.html') else: ###用户名或密码错误: print("345345") error = "用户名或密码错误!!" return render(request, 'login.html',locals()) def index(request): menu_dic = request.session.get('menu_dic') print("666666") print("menu_dic--->", menu_dic) return render(request, 'index.html', {'menu_dic': menu_dic})
如上我们所用的方式是直接在pycharm界面打印出来这部分数据,现在我们就需要将这部分数据保存到 内存,数据库或者session中;然后我们直接去取这部分数据即可!
login_auth.py (将数据存入session中)
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019-2-2 15:27 # @Author : zhdya@zhdya.cn # @File : login_auth.py from django.shortcuts import render,HttpResponse def menu_auth(user_obj_li, request): obj_all = user_obj_li.values('userPosition__auth__url', 'userPosition__auth__name', 'userPosition__auth__to_display__url', 'userPosition__auth__to_display__name', 'userPosition__auth__group__name', 'userPosition__auth__group__menu__name', ) print(obj_all) ###菜单 menu_dic = {} for i in obj_all: menu_auth_dic = { 'url': i.get('userPosition__auth__url'), ##跨表取到auth的url信息 'name': i.get('userPosition__auth__name'), 'display_url': i.get('userPosition__auth__to_display__url'), 'display_name': i.get('userPosition__auth__to_display__name') } if i.get('userPosition__auth__group__menu__name') in menu_dic.keys(): # 第一次是空字典,所以是走else if not i.get('userPosition__auth__to_display__name'): # 第二次 字典有值了 判断 to_display 一对多关系 menu_dic[i.get('userPosition__auth__group__menu__name')]['lower'].append(menu_auth_dic) # menu_dic.get(i.get('userPosition__auth__group__menu__name')).get('lower').append(menu_auth_dic) # 将字典的lower 的值, 是一个列表 [{},{},{}],往里面添加列表的值(字典) -> append(dict) else: menu_dic[i.get('userPosition__auth__group__menu__name')] = {} menu_dic[i.get('userPosition__auth__group__menu__name')]['name'] = i.get('userPosition__auth__group__menu__name') # menu_dic.get(i.get('userPosition__auth__group__menu__name')) = {} # menu_dic.get(i.get('userPosition__auth__group__menu__name')).get('name') = i.get('userPosition__auth__group__menu__name') if not i.get('userPosition__auth__to_display__name'): menu_dic[i.get('userPosition__auth__group__menu__name')]['lower'] = [menu_auth_dic, ] else: menu_dic[i.get('userPosition__auth__group__menu__name')]['lower'] = [] print("菜单-->", menu_dic) request.session['menu_dic'] = menu_dic ###存入session ###权限 auth_dic = {} for i in obj_all: if i.get('userPosition__auth__group__name') in auth_dic.keys(): auth_dic[i.get('userPosition__auth__group__name')]['url'].append(i.get('userPosition__auth__name')) else: auth_dic[i.get('userPosition__auth__group__name')] = {'url': [i.get('userPosition__auth__name'), ], } print('权限 ---> ', auth_dic) request.session['auth_dic'] = auth_dic ###存入session
在写index前,先来看下我们获取的menu_dic数据:(部分)
菜单-- > { '权限': { 'lower': [{ 'display_name': None, 'url': '增加权限', 'display_url': None, 'name': '/auth/add.html' }, { 'display_name': None, 'url': '更新权限', 'display_url': None, 'name': '/auth/(\\d+)/update.html' }, { 'display_name': None, 'url': '删除权限', 'display_url': None, 'name': '/auth/(\\d+)/del.html' },
index.html(根据如上数据,获取需要的数据)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="index"> {% for item in menu_dic.values %} <h2>{{ item.name }}</h2> {% for i in item.lower %} <div> <a href="{{ i.name }}"> {{ i.url }} </a> </div> {% endfor %} {% endfor %} </div> </body> </html>使用不同的账户,得到的是不同的权限:
BOSS1账户:
ceshi1账户:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Spring-Security权限管理框架(1)——根据角色权限登录
- 三大渗透框架权限维持
- Django框架–权限表设计
- ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理
- 基于注解的6.0权限动态请求框架——JPermission
- YuebonCore 1.0.1 发布,权限管理及快速开发框架
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。