内容简介:为了解决 跳转页面时,也保留菜单栏的数据, 可以再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 发布,权限管理及快速开发框架
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First Rails
David Griffiths / O'Reilly Media / 2008-12-30 / USD 49.99
Figure its about time that you hop on the Ruby on Rails bandwagon? You've heard that it'll increase your productivity exponentially, and allow you to created full fledged web applications with minimal......一起来看看 《Head First Rails》 这本书的介绍吧!