首页 » Python » python3 高级篇 » 正文

Django框架–权限代码+左侧菜单和权限应用

为了解决 跳转页面时,也保留菜单栏的数据, 可以再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拿到;

views.py

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'),  ##跨表取到authurl信息
					'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视图中太臃肿,而且没有任何逻辑性,看起来也比较乱。我们可以封装为一个函数,通过传值即可调用函数:

views.py

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'),  ##跨表取到authurl信息
			'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账户:

mark

ceshi1账户:

mark

赞 (0)

发表评论