当前位置:   article > 正文

django中权限控制到按钮级别

django如何使用权限控制按钮
权限控制到按钮级别 : 
        1.思路 : 
                由于每个按钮都能认为是一个权限,所以每个按钮都会有一个自己的路径,这些路径都在用户登录时保存在了session中,django在渲染页面之前先进行权限的匹配,如果用户没有某个按钮的权限,那么这个按钮就不会被渲染,从而实现权限的控制.
                重点在于能快速的在session中搜索所有的用户权限,之前在session中保存的数据是以一级菜单的id作为key,所以在遍历时候会占用过多资源,而从数据库中去找也比较浪费时间.所以可以在session中保存权限数据时就以定义的url别名来做key,这样就可以快速匹配权限.
        2.修改表结构,增加name字段保存路径的别名 :
  1. class Permission(models.Model):
  2. '''
  3. 权限表
  4. '''
  5. url = models.CharField(max_length=256, verbose_name='权限', unique=True)
  6. title = models.CharField(max_length=32, verbose_name='标题')
  7. menu = models.ForeignKey('Menu', blank=True, null=True)
  8. parent = models.ForeignKey('Permission', blank=True, null=True)
  9. name = models.CharField(max_length=32, verbose_name='URL别名', unique=True)
  10. def __str__(self):
  11. return self.title
        3.以上表中的别名字段作为key保存在session中,并保存pemissions__parent__name字段(因为当上表中的permissions__parent_id存在时,pemissions__parent__name即对应的二级权限的name).
  1. for item in permission_query:
  2. permission_dict[item['permissions__name']] = ({
  3. 'url':item['permissions__url'],
  4. 'pid':item['permissions__parent_id'],
  5. 'id': item['permissions__id'],
  6. 'title': item['permissions__title'],
  7. 'pname': item['permissions__parent__name']
  8. })
        4.通过自定义filter判断是否显示标签 : (注意传参)
  1. @register.filter()
  2. def has_permission(request,name):
  3. if name in request.session.get(settings.PERMISSION_SESSION_KEY):
  4. return True
        5.在前端对每个按钮做判断 :
 
  1. <td>
  2. {% if request|has_permission:'customer_edit' %}
  3. <a style="color: #333333;" href="/customer/edit/{{ row.id }}/">
  4. <i class="fa fa-edit" aria-hidden="true"></i></a>
  5. {% endif %}
  6. {% if request|has_permission:'customer_del' %}
  7. <a style="color: #d9534f;" href="/customer/del/{{ row.id }}/"><i
  8. class="fa fa-trash-o"></i></a>
  9. {% endif %}
  10. </td>
        6.注意对session数据变化带来的错误做修改 :
  1. for permission in permission_dict.values():
  2. if re.match(r'^{}$'.format(permission['url']), url):
  3. pid = permission.get('pid')
  4. id = permission.get('id')
  5. pname = permission.get('pname') #之前没有
  6. if pid:
  7. request.current_menu_id = pid
  8. request.breadcrumb_list.append(
  9. {'title': permission_dict[pname]['title'], 'url': permission_dict[pname]['url']}) #之前为permission_dict[str(pid)]['']
  10. request.breadcrumb_list.append({'title': permission['title'], 'url': permission['url']})

  

 

转载于:https://www.cnblogs.com/wangtaobiu/p/10602739.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/71761
推荐阅读
相关标签
  

闽ICP备14008679号