网站重新备案需要多长时间深圳移动网站建设

news/2025/9/25 22:48:08/文章来源:
网站重新备案需要多长时间,深圳移动网站建设,找网站建设公司哪家好,百度一下百度首页官网当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统#xff0c;Django内置权限系统基于model层做控制#xff0c;新的model创建后会默认新建三个权限#xff0c;分别为#xff1a;add、change、delete#xff0c;如果给… 当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统Django内置权限系统基于model层做控制新的model创建后会默认新建三个权限分别为add、change、delete如果给用户或组赋予delete的权限那么用户将可以删除这个model下的所有数据。 原本overmind只管理了我们自己部门的数据库权限设置只针对具体的功能不针对细粒度的数据库实例例如用户A 有审核的权限那么用户A 可以审核所有的DB此时使用内置的权限系统就可以满足需求了但随着系统的不断完善要接入其他部门的数据库管理这就要求针对不同用户开放不同DB的权限了例如A部门的用户只能操作A部门的DBDjango内置基于model的权限无法满足需求了。 实现过程 先来确定下需求 保持原本的基于功能的权限控制不变例如用户A有查询权限B有审核权限增加针对DB实例的权限控制例如用户A只能查询特定的DBB只能审核特定的DB对于上边需求1用内置的权限系统已经可以实现这里不赘述重点看下需求2DB信息都存放在同一个表里不同用户能操作不同的DB也就是需要把每一条DB信息与有权限操作的用户进行关联为了方便操作我们考虑把DB跟用户组关联在用户组里的用户都有权限而操作类型经过分析主要有两类读和写那么需要给每个MySQL实例添加两个字段分别记录对此实例有读和写权限的用户组 如下代码在原来的model基础上添加read_groups和write_groups字段DB实例跟用户组应是ManyToManyField多对多关系一个实例可以关联多个用户组一个用户组也可以属于多个实例 class Mysql(models.Model):Env ((1, Dev),(2, Qa),(3, Prod),)create_time models.DateTimeField(auto_now_addTrue, verbose_name创建时间)update_time models.DateTimeField(auto_nowTrue, verbose_name更新时间)project_id models.IntegerField(verbose_name项目)project_tmp models.CharField(max_length128, default)environment models.IntegerField(choicesEnv, verbose_name环境)master_host models.GenericIPAddressField(verbose_namemaster主机)master_port models.IntegerField(default3306, verbose_namemaster端口)slave_host models.GenericIPAddressField(nullTrue, verbose_nameslave主机)slave_port models.IntegerField(nullTrue, default3306, verbose_nameslave端口)database models.CharField(max_length64, verbose_name数据库)read_groups models.ManyToManyField(Group, related_nameread, verbose_name读权限)write_groups models.ManyToManyField(Group, related_namewrite, verbose_name写权限)description models.TextField(nullTrue, verbose_name备注) model确定了接下来我们分三部分详细介绍下权限验证的具体实现 列表页权限控制 如上图列表页每个用户进入系统后只能查看自己有读权限的MySQL实例列表管理员能查看所有代码如下 def mysql(request):if request.method GET:if request.user.is_superuser:_lists Mysql.objects.all().order_by(id)else:# 获取登录用户的所有组_user_groups request.user.groups.all()# 构造一个空的QuerySet然后合并_lists Mysql.objects.none()for group in _user_groups:_lists _lists | group.read.all()return render(request, overmind/mysql.index.html, {request: request, lPage: _lists}) 实现的思路是获取登录用户的所有组然后循环查询每个组有读取权限的数据库实例最后把每个组有权限读的数据库实例进行合并返回 获取登录用户的所有组用到了ManyToMany的查询方法request.user.groups.all() 最终返回的一个结果是QuerySet所以我们需要先构造一个空的QuerysetMysql.objects.none() QuerySet合并不能用简单的相加应为QuerySet-1 | QuerySet-2 查询接口权限控制 如上图系统中有很多功能是需要根据项目、环境查询对应的DB信息的对于此类接口也需要控制用户只能查询自己有权限读的DB实例管理员能查看所有代码如下 def get_project_database(request, project, environment):if request.method GET:_jsondata {}if request.user.is_superuser:# 返回所有项目和环境匹配的DB_lists Mysql.objects.filter(project_idint(project),environmentint(environment))_jsondata {i.id: i.database for i in _lists}else:# 只返回用户有权限查询的DB_user_groups request.user.groups.all()for group in _user_groups:# 循环mysql表中有read_groups权限的所有组for mysql in group.read.all():if mysql.project_id int(project) and mysql.environment int(environment):_jsondata[mysql.id] mysql.databasereturn JsonResponse(_jsondata) 实现思路与上边类似只是多了一步根据项目和环境再进行判断 需要根据group去反查都有哪些DB实例包含了该组这里用到了M2M的related_name属性group.read.all() 更多关于Django ORM查询的内容可以看这篇文章Django model select的各种用法详解有详细的总结 执行操作权限控制 除了上边的两个场景之外我们还需要在执行具体的操作之前去判断是否有权限例如执行审核操作前判断用户是否对此DB有写权限 有很多地方都需要做这个判断所以把这个权限判断单独写个方法来处理代码如下 def check_permission(perm, mysql, user):# 如果用户是超级管理员则有权限if user.is_superuser:return True# 取出用户所属的所有组_user_groups user.groups.all()# 取出Mysql对应权限的所有组if perm read:_mysql_groups mysql.read_groups.all()if perm write:_mysql_groups mysql.write_groups.all()# 用户组和DB权限组取交集有则表示有权限否则没有权限group_list list(set(_user_groups).intersection(set(_mysql_groups)))return False if len(group_list) 0 else True 实现思路是根据传入的第三个用户参数来获取到用户所有的组然后根据传入的第一个参数类型读取或写入和第二个参数DB实例来获取到有权限的所有组然后对两个组取交集交集不为空则表示有权限为空则没有 M2M的.all()取出来的结果是个list两个list取交集的方法为list(set(list-A).intersection(set(list-B))) view中使用就很简单了如下 def query(request):if request.method POST:postdata request.body.decode(utf-8)_host get_object_or_404(Mysql, idint(postdata.get(database)))# 检查用户是否有DB的查询权限if check_permission(read, _host, request.user) False:return JsonResponse({state: 0, message: 当前用户没有查询此DB的权限}) 写在最后 Django有第三方的基于object的权限管理模块Django-guardian本项目没有使用主要是因为一来权限需求并不复杂自己实现也很方便二来个人在非必要的情况下并不喜欢引用过多第三方的包后续升级维护都是负担方案和代码不尽完美各位有更好的方案建议或更优雅的代码写法欢迎与我交流 相关文章推荐阅读 DjangoJWT实现Token认证我们自研的那些Devops工具转载于:https://www.cnblogs.com/37Y37/p/10514575.html

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

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

相关文章

做网站的顶部图片怎么打开文件做的网站

目录 一.平台架构与技术特点 二、DeepSeek R1模型介绍与优势 DeepSeek R1 模型简介 DeepSeek R1 模型优势 三.蓝耘智算平台使用DeepSeek教程 展望未来 耘元生代智算云是蓝耘科技推出的一款智算云平台有着以下特点: 一.平台架构与技术特点 基于 Kubernetes 原…

AC自动机在线版本(alert命中报警)

模板洛谷p3311 code: #include<bits/stdc++.h> using namespace std; typedef long long LL; // 常量定义:N为AC自动机状态数上限、数位DP位数上限;mod为答案取模值 const int N=2010,mod=1e9+7;// AC自动机核…

US$79 BMW FEM/BDC Key Programmer Data Desktop Test Platform for FEM/BDC Key and Program ECU Gearbox

BMW FEM/BDC Key Programmer Data Desktop Test Platform for FEM/BDC Key and Program ECU GearboxFEM BDC Module Testing Platform for BMW F20 F30 F35 X5 X6 I3With your FEM/BDC keys, FEM BDC Module Testing P…

week1 homework

C语言代码规范 参考了大公司的标准 1、程序采用缩进风格,每层缩进使用一个制表位(TAB) 2、源程序使用英文书写,尽量不含有中文。 3、左花括号要另起一行,不能跟在上一行的行末; 4、一个变量定义占一行,一个语句…

(南科大深度学习课程笔记)Lecture_2_Mathematical background(数学背景)(上) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

app那个网站开发比较好xp优化大师

Serverless 话题涉及范围极广&#xff0c;几乎包含了代码管理、测试、发布、运维和扩容等与应用生命周期关联的所有环节。在线应用如何不改代码也能迁移到 Serverless 架构&#xff1f;今天&#xff0c;我们来揭秘阿里巴巴成千上万在线应用的Serverless 演进过程。 AWS Lambda …

最牛网站建设是谁装饰公司办公室图片

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 什么是WebSocket&#xff1f; WebSocket是一种在Web应用程序中实现双向通信的协议。它允许在客户端和服务器之间建立持久…

Java EE ----- Spring MVC (上) - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

秦皇岛网站排名郑州手机网站制作公司哪家好

可以删一下 按住alt按移除可以删掉 选择你要删的那些线 按住alt点移除

浦东做网站如何在社交网站做销售

一、介绍部分 (win7 下的 GUI 效果图见 本篇文章的最后部分截图2张)wxWidgets是一个开源的跨平台的C构架库(framework)&#xff0c;它可以提供GUI(图形用户界面)和其它工具。目前的2.x版本支持所有版本的Windows、带GTK或Motif的Unix和MacOS。相当于大家熟悉的 VC。二、wxWidge…

Windows 10 C盘占用释放 - tfel

C盘又要撑爆...前言 安装的Windows 10 LSTC, 系统盘留了 200G 最近发现可用只剩下50G, 甚至还在减少 排查 使用 SpaceSniffer 看下具体占用 好用,到Windows 10我也觉得它装机必备!!!占用大头 网易云音乐 缓存它默认…

CherryStudio+cpolar:让智能工作流突破组织边界 - 详解

CherryStudio+cpolar:让智能工作流突破组织边界 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

科学计算方法--矩阵分析记录

1. 前言砚上三五笔,落墨鹧鸪啼本文用于记录:科学计算方法--矩阵分析记录 最近有点忘记矩阵了(汗),这里记录一下。 如有不对,欢迎评论区指正! 2. 正文 2.1 矩阵(matrix) 矩阵理解为空间中的一种变换,作用到对…

window.addEventListener(message,()={})中的回调函数无故被一直触发的问题 - broky

遇到的问题使用第一个进入无痕模式就没有被一直触发的问题了 一、最可能的 3 个 “隐式消息发送源”(非你主动写的代码)浏览器插件 / 扩展程序发送的消息 很多浏览器插件(如广告拦截、翻译、开发者工具插件)会通过…

建设单位网站设计有了公网ip如何做网站

盒模型是界面布局需要掌握的基本功。盒模型基本概念 盒模型四要素&#xff1a;margin、border、padding、content。 盒模型分为&#xff1a;标准盒模型&#xff08;W3C盒模型&#xff09; 、 怪异盒模型&#xff08;IE盒模型&#xff09; 盒模型区别 怪异盒模型总宽度 content…

做网站包括什么网站备案的意思

list: quert.list()方法会将从数据库查找到的数据库放到一级缓存和二级缓存,但是不能从一级和二级缓存读取数据,但是可以从二级缓存的查询缓存读取数据, iterate: quert.iterate()方法总会先查找数据表的主键,然后根据每一个主键发送对应的sql语句从数据库读取数据,它可以把数据…

iis7重启 网站河南网站建设服务公司

当然&#xff0c;可以使用 Python 编写一个简单的程序来查找给定列表中的最大和最小值。以下是一个示例程序&#xff1a; def find_max_min(values):if not values: # 检查列表是否为空return None, Nonemax_value values[0]min_value values[0]for value in values:if val…

大连哪家公司做网站桃源网站建设

一、引言 在信息爆炸的时代,网络上蕴含着海量的数据。如果我们想要获取特定的信息,手动从网页上复制粘贴显然效率极低。这时,Web 爬虫就派上了用场。Web 爬虫是一种自动获取网页内容的程序,它可以模拟人类在浏览器中的操作,快速地抓取网页上的数据。本文将带领大家使用 Py…

新风向网站建设邢台县建设局网站

注&#xff1a;这一节的课程分为对已经从业产品经理业务转型的人群和想要进入到AI产品行业的人群两部分&#xff0c;我这里针对自己的情况只说明了第二部分&#xff0c;如果有需要了解其他的成长路径方式的朋友请自行观看刘老师的课程。 1.持续了解AI行业 你需要持之以恒的了…

精简网站模板适合个人做的网站

web 框架使用路由技术来帮助用户记住应用程序的 url。无需从主页导航即可直接访问所需页面。 route() 装饰器用于将 url 绑定到函数&#xff1a; app.route(/hello) def hello_world(): return hello world url /hello 规则绑定到 hello_world() 函数。如果用户访问 url :…