【案例】权限管理

数据库表结构
models.py

from django.db import modelsclass Permission(models.Model):""" 权限表 """code = models.CharField(verbose_name="路由名称", max_length=32)name = models.CharField(verbose_name="名称", max_length=32)class Role(models.Model):""" 角色表 """name = models.CharField(verbose_name="名称", max_length=32)permissions = models.ManyToManyField(verbose_name="权限", to="Permission")class User(models.Model):""" 用户表 """username = models.CharField(verbose_name="用户名", max_length=32)password = models.CharField(verbose_name="密码", max_length=32)is_super = models.BooleanField(verbose_name="是否管理员", default=False)roles = models.ManyToManyField(verbose_name="权限", to="Role")class Computer(models.Model):""" 电脑 """title = models.CharField(verbose_name="名称", max_length=32)price = models.IntegerField(verbose_name="价格")class Order(models.Model):""" 订单 """title = models.CharField(verbose_name="订单", max_length=32)price = models.IntegerField(verbose_name="价格")

使用命令行创建超级用户
management/commands/superuser.py

from django.core.management.base import BaseCommand
from www import modelsclass Command(BaseCommand):def handle(self, *args, **options):username = input("请输入用户名:")password = input("请输入密码:")models.User.objects.create(username=username, password=password, is_super=True)

使用离线脚本创建角色和用户
scripts/创建普通用户及权限.py

import django
import os
import sysbase_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir)os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'rbac.settings')
django.setup()from www import models
#
# models.Permission.objects.bulk_create([
#     models.Permission(code="computer", name="电脑管理"),
#     models.Permission(code="computer_add", name="电脑添加"),
#     models.Permission(code="computer_edit", name="电脑编辑"),
#     models.Permission(code="computer_del", name="电脑删除"),
# ])
#
# role = models.Role.objects.create(name="运营实习生")
# role.permissions.set([1, 2])
#
# role = models.Role.objects.create(name="正式员工")
# role.permissions.set([1, 2, 3, 4])
#
# user = models.User.objects.create(username="cqn", password="123", is_super=False)
# user.roles.set([1])
#
# user = models.User.objects.create(username="zkf", password="123", is_super=False)
# user.roles.set([1, 2])

views.py

from django.shortcuts import render, HttpResponse, redirect
from django.forms import ModelForm
from django.forms.models import model_to_dict
from www import modelsclass LoginModelForm(ModelForm):class Meta:model = models.Userfields = ["username", "password"]def login(request):if request.method == "GET":form = LoginModelForm()return render(request, "login.html", {"form": form})form = LoginModelForm(data=request.POST)if not form.is_valid():return render(request, "login.html", {"form": form})user_object = models.User.objects.filter(**form.cleaned_data).first()if not user_object:form.add_error("password", "用户名或密码错误")return render(request, "login.html", {"form": form})# request.session["user_session_key"] = {#     "id": user_object.id,#     "username": user_object.username,#     "is_super": user_object.is_super# }request.session["user_session_key"] = model_to_dict(user_object, fields=["id", "username", "is_super"])return redirect("home")def home(request):return HttpResponse("HOME")def computer(request):return render(request, 'computer.html')def computer_add(request):return HttpResponse("OK")def computer_edit(request, id):return HttpResponse("OK")def computer_del(request, id):return HttpResponse("OK")def order(request):return HttpResponse("OK")def order_add(request):return HttpResponse("OK")def order_edit(request, id):return HttpResponse("OK")def order_del(request, id):return HttpResponse("OK")

中间件
utils/md.py

from django.contrib.auth.middleware import MiddlewareMixin
from django.urls import reverse
from django.shortcuts import redirect, HttpResponse
from www import modelsclass AuthMiddleware(MiddlewareMixin):def process_request(self, request):if request.path_info in [reverse("login")]:returnuser_dict = request.session.get("user_session_key")if not user_dict:return redirect("login")request.user_dict = user_dictclass PermissionMiddleware(MiddlewareMixin):def process_view(self, request, callback, *args, **kwargs):if request.path_info in [reverse("login")]:returnif request.user_dict["is_super"]:return# 用户访问的rlurl_name = request.resolver_match.url_nameprint("PermissionMiddleware中间件: ", url_name)# 用户对象user_object = models.User.objects.filter(id=request.user_dict['id']).first()# 用户所有的角色,角色对应的权限user_per_list = user_object.roles.all().values("permissions__code", "permissions__name")permission_dict = {item["permissions__code"]: item["permissions__name"] for item in user_per_list}print("PermissionMiddleware中间件: ", permission_dict)request.permission_dict = permission_dictif url_name in permission_dict:returnreturn HttpResponse("无权访问")

前端页面
templates/login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h2>用户登录</h2>
<form method="post" novalidate>{% csrf_token %}{{ form.as_p }}<button type="submit">登录</button>
</form></body>
</html>

templates/computer.html

{% load permission %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
{% if request|has_permission:"computer_add" %}<a href="{% url "computer_add" %}">新增</a>
{% endif %}{% if request|has_permission:"computer_edit" %}<a href="{% url "computer_edit" id=1 %}">编辑</a>
{% endif %}{% if request|has_permission:"computer_del" %}<a href="{% url "computer_del" id=1 %}">删除</a>
{% endif %}</body>
</html>

templatetags/permission.py

from django.template import Libraryregister = Library()@register.filter
def has_permission(request, route_name):is_super = request.user_dict['is_super']if is_super:return Trueif route_name in request.permission_dict:return Truereturn False

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot kafka在kafka server AUTH变动后consumer自动销毁

前言 笔者使用了kafka用来传输数据&#xff0c;笔者在今年10月写了文章&#xff0c;怎么使用配置化实现kafka的装载&#xff1a;springboot kafka多数据源&#xff0c;通过配置动态加载发送者和消费者-CSDN博客 不过在实际运行中&#xff0c;kafka broker是加密的&#xff0c…

在Windows下编译支持https的wsdl2h

下载源码 在官网下载源码 安装Openssl 下载OpenSSL并安装&#xff0c;安装完成后需要将OpenSSL的路径添加到环境变量中 配置VS 1、打开工程 2、因为前面安装的OpenSLL是64位的&#xff0c;因此需要创建一个X64的配置 打开配置管理器&#xff0c;然后选择新建&#xff0…

【Webgl_glslThreejs】制作流水效果/毛玻璃效果材质

效果预览 shadertory源码 source&#xff1a; https://www.shadertoy.com/view/lldyDs 材质代码 import { DoubleSide, ShaderChunk, ShaderMaterial, TextureLoader } from "three"; /** * * source https://www.shadertoy.com/view/lldyDs */export default fu…

个性化联邦学习方法

基于知识蒸馏的个性化联邦学习方法 基于 Logit 的知识蒸馏方法&#xff1a; 基于 logit 的知识蒸馏方法也是知识蒸馏中的一种常见技术。通常&#xff0c;logit 是指模型输出的原始预测值&#xff08;未经过 softmax 函数处理的类别分数&#xff09;。在知识蒸馏中&#xff0c;…

《解锁决策树算法:机器学习领域的实用利器及其多面应用》

一、引言 在当今数据驱动的时代&#xff0c;机器学习正深刻改变着我们生活与工作的方方面面&#xff0c;而决策树算法作为其中的经典算法&#xff0c;凭借直观易懂、高效实用的优势&#xff0c;在众多领域都占据着重要地位。本文将带领大家全方位深入探究决策树算法&#xff0…

vue3+ts+uniapp微信小程序顶部导航栏

这是colorui改的&#xff0c;不用就不用看啦 color-ui(https://docs.xzeu.com/#/) 新建component文件夹创建topNavigation.vue <template><view><view class"cu-custom" :style"height: CustomBar px"><view class"cu-bar…

【AI战略思考13】克服懒惰,保持专注,提升效率,不再焦虑

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 引言 我发现自己最近非常懒惰&#xff0c;浪费了很多时间&#xff0c;也容易分心&#xff0c;不够专注&#xff0c;效率低下&#xff0c;且每天都有点焦虑&#xff0c;因此制定了下面的要求和作息时间表。 目…

Unity3D ngui和ugui区别与优缺点详解

前言 Unity3D是一款跨平台的游戏开发引擎&#xff0c;它支持多种平台&#xff0c;包括PC、移动设备和主机。在Unity3D中&#xff0c;UI系统是游戏开发中非常重要的一部分&#xff0c;它负责游戏中的用户界面的显示和交互。 对惹&#xff0c;这里有一个游戏开发交流小组&#…

openssl使用哈希算法生成随机密钥

文章目录 一、openssl中随机数函数**OpenSSL 随机数函数概览**1. **核心随机数函数** **常用函数详解**1. RAND_bytes2. RAND_priv_bytes3. RAND_seed 和 RAND_add4. RAND_status **随机数生成器的熵池****常见用例****注意事项** 二、使用哈希算法生成随机的密钥 一、openssl中…

大模型翻译能力评测

1. 背景介绍 随着自然语言处理技术的飞速发展&#xff0c;机器翻译已经成为一个重要的研究领域。近年来&#xff0c;基于大模型的语言模型在机器翻译任务上取得了显著的进展。这些大模型通常具有数亿甚至数千亿的参数&#xff0c;能够更好地理解和生成自然语言。 但是&#xf…

刷题日常(找到字符串中所有字母异位词,​ 和为 K 的子数组​,​ 滑动窗口最大值​,全排列)

找到字符串中所有字母异位词 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 题目分析&#xff1a; 1.将p里面的字符先丢进一个hash1中&#xff0c;只需要在S字符里面找到多少个和他相同的has…

【汇编语言】call 和 ret 指令(三) —— 深度解析汇编语言中的批量数据传递与寄存器冲突

文章目录 前言1. 批量数据的传递1.1 存在的问题1.2 如何解决这个问题1.3 示例演示1.3.1 问题说明1.3.2 程序实现 2. 寄存器冲突问题的引入2.1 问题引入2.2 分析与解决问题2.2.1 字符串定义方式2.2.2 分析子程序功能2.2.3 得到子程序代码 2.3 子程序的应用2.3.1 示例12.3.2 示例…

青训营-豆包MarsCode技术训练营试题解析九

介绍 ‌豆包青训营‌是由字节跳动和稀土掘金社区共同发起的技术培训和人才选拔项目&#xff0c;主要面向在校大学生。该项目的目标是培养具有职业竞争力的优秀开发工程师&#xff0c;并提供全程免费的课程&#xff0c;不收取任何费用‌。 课程内容和方向 豆包青训营的课程涵…

前端的面试题

1.常用的块与行属性内标签有哪些&#xff1f;有什么特征&#xff1f; 块标签&#xff1a;div、h1~h6、ul、li、table、p、br、form。 特征&#xff1a;独占一行&#xff0c;换行显示&#xff0c;可以设置宽高&#xff0c;可以嵌套块和行 行标签&#xff1a;span、a、img、text…

`asyncio.wait` 和 `asyncio.gather` 的区别

asyncio.wait 和 asyncio.gather 的区别 1. asyncio.wait2. asyncio.gather主要区别总结 在Python的异步编程中&#xff0c;asyncio.wait 和 asyncio.gather 都是用于等待多个异步任务完成的工具&#xff0c;但它们在功能和使用方式上有一些关键的区别。本文将详细解释这两个函…

48-基于单片机的LCD12864时间调控和串口抱站

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机的公交报站系统&#xff0c;可以手动报站&#xff0c;站名十个。 在lcd12864上显示时间&#xff08;年月日时分秒&#xff09;和站名&#xff0c;时间可以设置&#xff0c; 仿真中可以…

如何为 XFS 文件系统的 /dev/centos/root 增加 800G 空间

如何为 XFS 文件系统的 /dev/centos/root 增加 800G 空间 一、前言二、准备工作三、扩展逻辑卷1. 检查现有 LVM 配置2. 扩展物理卷3. 扩展卷组4. 扩展逻辑卷四、调整文件系统大小1. 检查文件系统状态2. 扩展文件系统五、处理可能出现的问题1. 文件系统无法扩展2. 磁盘空间不足3…

爬虫框架快速入门——Scrapy

适用人群&#xff1a;零基础、对网络爬虫有兴趣但不知道从何开始的小白。 什么是 Scrapy&#xff1f; Scrapy 是一个基于 Python 的网络爬虫框架&#xff0c;它能帮助你快速爬取网站上的数据&#xff0c;并将数据保存到文件或数据库中。 特点&#xff1a; 高效&#xff1a;支…

Redis 分布式锁实现方案

一、概述 分布式锁&#xff0c;即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题&#xff0c;而分布式锁&#xff0c;就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是&#xff0c;分布式系统中竞争共享资源的最小粒度从线程升级…

前端node.js

一.什么是node.js 官网解释:Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。 二.初步使用node.js 需要区分开的是node.js和javascript互通的只有console和定时器两个API. 三.Buffer Buffer 是一个类似于数组的 对象&#xff0c;用于表示固定长度的字节序列。Buffer…