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

栏目: Python · 发布时间: 6年前

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

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

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

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

ceshi1账户:

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Head First Rails

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》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具