权限系统实现方式:
1、目标就是实现一个权限的组件,以后再写任何系统的时候可以直接进行使用;
2、用户登录成功后,将此用户的权限信息存放在session,用户再访问其他视图时,将访问的url和session中权限url进行匹配;
3、考虑每一个视图函数在被访问前都需要进行用户的权限验证,所以步骤2中的权限匹配放在中间件process_request函数中
ps:五种中间件介绍
- process_request - prccess_view - process_exception - process_response - process_template....
django中,中间件中的主要四个方法的执行顺序如所写,从上到下。按照settings中配置的中间件的顺序,从上到下执行process_request方法,此方法可有可无返回值,若有返回值,则按中间件中五种方法的执行顺序,原路返回,后面的中间件不再执行;然后按照中间件的顺序,从上到下执行prccess_view方法;再按照配置中间件的顺序从下到上执行process_exception方法,若有异常则抛出异常;最后按照中间件的顺序从下往上逐个执行process_response方法,此方法一定会有返回值。
一、表结构的设计
from django.db import models # Create your models here. class UserInfo(models.Model): ''' 用户信息表:与角色表建立多对关系 ''' name=models.CharField(max_length=32,verbose_name="用户名") pswd=models.CharField(max_length=64) email=models.CharField(max_length=64) roles=models.ManyToManyField(to="Role") def __str__(self): return self.name class Role(models.Model): ''' 角色表:与权限表创建多对多关系,此表主要是方便给同一类人批量增加权限 ''' name=models.CharField(max_length=32,verbose_name="角色名称") permissions=models.ManyToManyField(to="Permission") def __str__(self): return self.name class Menu(models.Model): ''' 菜单表 ''' title=models.CharField(max_length=32) def __str__(self): return self.title class PermissionGroup(models.Model): ''' 权限分组表:与菜单表建立多对一关系,主要解决可以作为菜单显示的权限列表太多情况,通过菜单 表,可以将权限菜单作为二级菜单存在菜单下面 ''' caption=models.CharField(max_length=16) menu=models.ForeignKey(to="Menu",default=1) def __str__(self): return self.caption class Permission(models.Model): ''' 权限表:与权限分组表建立多对一关系,将同一类权限归为一组,方便粒度到按钮级别的权限实现 通过parent字段建立自关联,主要用于自动生成菜单时候判断哪些可以作为菜单项显示的 -------(如编辑和删除权限显然不可以作为菜单显示) ''' title=models.CharField(max_length=32,verbose_name="权限名称") url=models.CharField(max_length=128) code=models.CharField(max_length=16,default="list") group=models.ForeignKey(to="PermissionGroup",default=1) parent=models.ForeignKey(to="Permission",null=True,related_name="permissions") def __str__(self): return self.title