django 通过url实现简单的权限控制的例子


Posted in Python onAugust 16, 2019

根据用户权限设定用户可以访问哪些页面,用django实现一个简单的demo。

1.models.py 文件

class level(models.Model):
  l_name = models.CharField(max_length=50,verbose_name="等级名称")
  l_permission = models.OneToOneField("permission")
  def __str__(self):
    return self.l_name
 
 
class userinfo(models.Model):
  u_name = models.CharField(max_length=50,verbose_name="用户名称")
  u_user = models.OneToOneField(User)
  u_level = models.ForeignKey(level,related_name="lev")
 
  def __str__(self):
    return self.u_name
 
 
class permission(models.Model):
  p_name = models.CharField(max_length=50,verbose_name="权限名称")
  p_menu = models.ManyToManyField("menu")
 
  def __str__(self):
    return self.p_name
 
class menu(models.Model):
  m_name = models.CharField(max_length=50,verbose_name="菜单名称")
  m_url = models.CharField(max_length=50,verbose_name="菜单地址",blank=True,null=True)
  def __str__(self):
    return self.m_name
 
class nickname(models.Model):
  n_nickname = models.CharField(max_length=50,verbose_name="昵称",blank=True,null=True)
  n_user = models.ForeignKey(userinfo,blank=True,null=True,related_name="nick")
 
  def __str__(self):
    return self.n_nickname

2.settings.py 文件

URL_WHITE_LIST = ['index', 'login', 'logout']

设置路由白名单。

3.views.py 文件

def url_check(fun):
  def check(request,*args,**kwargs):
    if request.session.get("p_l",None):
      require_list = pickle.loads(request.session.get("p_l"))
      request_url = request.path.replace("/","")
      ua = request.META.get('HTTP_USER_AGENT',None)
      if request_url in require_list or request_url in IP_WHITE_LIST:
        return fun(request,*args,**kwargs)
      else:
        error_msg = "没有权限!"
        menu_ = pickle.loads(request.session.get("p_l"))
        return render(request,"index.html",{"error_msg":error_msg,"menu":menu_})
    else:
      return HttpResponseRedirect(reverse("login"))
  return check

定义一个路由检测的闭包方法,根据用户登录时的session信息,获取该用户角色可以访问的路由,如果当前访问的地址不在白名单或是session记录里,返回错误信息。

@url_check
def menu(request,menuname):
  return HttpResponse("<h1>%s</h1>"%menuname)

在之后的方法上添加该闭包,即可实现简易的路由控制。

以上这篇django 通过url实现简单的权限控制的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用pickle存储Python的原生对象方法
Apr 28 Python
python实现给微信公众号发送消息的方法
Jun 30 Python
Python自定义装饰器原理与用法实例分析
Jul 16 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
Oct 17 Python
Python 新建文件夹与复制文件夹内所有内容的方法
Oct 27 Python
Python第三方库face_recognition在windows上的安装过程
May 03 Python
python反转列表的三种方式解析
Nov 08 Python
Python如何读取文件中图片格式
Jan 13 Python
pandas创建DataFrame的7种方法小结
Jun 14 Python
Python图像读写方法对比
Nov 16 Python
详解Python中list[::-1]的几种用法
Nov 16 Python
python使用yaml 管理selenium元素的示例
Dec 01 Python
对Django中内置的User模型实例详解
Aug 16 #Python
对Django中的权限和分组管理实例讲解
Aug 16 #Python
django创建最简单HTML页面跳转方法
Aug 16 #Python
在django中实现页面倒数几秒后自动跳转的例子
Aug 16 #Python
解决python3 安装不了PIL的问题
Aug 16 #Python
Python爬虫 批量爬取下载抖音视频代码实例
Aug 16 #Python
django 使用 PIL 压缩图片的例子
Aug 16 #Python
You might like
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
二级域名或跨域共享Cookies的实现方法
2008/08/07 Javascript
一个报数游戏js版(约瑟夫环问题)
2010/08/05 Javascript
jQuery UI AutoComplete 自动完成使用小记
2010/08/21 Javascript
精选的10款用于构建良好易用性网站的jQuery插件
2011/01/23 Javascript
jquery 操作css样式、位置、尺寸方法汇总
2014/11/28 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
解析Node.js基于模块和包的代码部署方式
2016/02/16 Javascript
JS获取当前脚本文件的绝对路径
2016/03/02 Javascript
Angularjs CURD 详解及实例代码
2016/09/14 Javascript
vue.js学习之UI组件开发教程
2017/07/03 Javascript
JS在if中的强制类型转换方式
2018/07/15 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
js实现弹幕飞机效果
2020/08/27 Javascript
[02:51]DOTA2战队出征照拍摄花絮 TI3明星化身时尚男模
2013/07/22 DOTA
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
[01:18:31]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第一场 1月10日
2021/03/11 DOTA
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
PyQt5实现简易计算器
2020/05/30 Python
详解Python的三种可变参数
2019/05/08 Python
python3实现二叉树的遍历与递归算法解析(小结)
2019/07/03 Python
python 同时读取多个文件的例子
2019/07/16 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
2020/02/29 Python
什么是Assembly(程序集)
2014/09/14 面试题
会计工作决心书
2014/03/11 职场文书
同学会主持词
2014/03/18 职场文书
大班上学期幼儿评语
2014/04/30 职场文书
小学校园广播稿集锦
2014/10/04 职场文书
小时代观后感
2015/06/10 职场文书
CSS3实现的3D隧道效果
2021/04/27 HTML / CSS
如何利用js在两个html窗口间通信
2021/04/27 Javascript
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
2022/08/14 Servers